- w — 向前移动一个单词。对应b是后退一个单词。更多时候你都应该使用这些键移动光标,而不是用hjkl。w和c (change) 和 d (delete)组合,都是非常高效的编辑功能。
- . — 点号键可以重复你的上一个操作,在需要反复完成一个操作而你又懒的或者不值得录制宏的时候格外有用。
- f — 按下f后再按任意键,会跳到光标后第一个该键出现的位置。有效的移动指令。
- q — 录制宏。按下q后按a,此后的操作都会纪录在宏a里,再按q结束录制。使用@a可以重复录制在宏a中的指令,在@前可以加数字,表示你想重复的次数。
- ctrl_w + ctrl_s — 分割窗口。如果你想同时察看两端代码,可以这么做。双击ctrl_w可以在窗口间切换。
- m — 标志位置。在某处ma,移动到别的地方,再按`a就能回来。可以用不同字母和数字做很多标记,只要你记得住。
- ctrl_o — 回到上一个编辑位置,甚至可以会到上一个文件。ctrl_i是到下一个。在很多大的文件或者几个文件间跳来跳去的时候很有用。
- ctrl_p — 在编辑状态按下ctrl_p会自动补全你正在敲的单词,补全规则是查找上一个相同开头的单词,可以不断的按此键向上匹配直到你满意为止。ctrl_n是向下匹配。
- * — 当你的光标在一个单词上,你按下乘号键,自动开始从光标位置起搜索这个单词。相当于按下”/\<word\>”,也相当于emacs中的ctrl_s + ctrl_w。杀手级指令,超好用。
移动光标
上:k nk:向上移动n行 9999k或gg可以移到第一行 G移到最后一行
下:j nj:向下移动n行
左:h nh:向左移动n列
右:l nl:向右移动n列
w:光标以单词向前移动 nw:光标向前移动n个单词 光标到单词的第一个字母上
b:与w相反
e: 光标以单词向前移动 ne:光标向前移动n个单词 光标到单词的最后一个字母上
ge:与e相反
$:移动光标到行尾 n$:移动到第n行的行尾
0(Num):移动光标到行首
^:移动光标到行首第一个非空字符上去
f<a>:移动光标到当前行的字符a上,nf<a>移动光标到当前行的第n个a字符上
F:相反
%:移动到与制匹配的括号上去(),{},[],<>等。
nG:移动到第n行上 G:到最后一行
CTRL+G 得到当前光标在文件中的位置
向前翻页:CTRL+F
向下移动半屏:CTRL+G
向后翻页:CTRL+B
存盘:
:q! :不存盘退出
:e! :放弃修改文件内容,重新载入该文件编辑
:wq :存盘退出
dw:删除一个单词,需将光标移到单词的第一个字母上,按dw,如果光标在单词任意位置,用daw
dnw:删除n个单词
dne:也可,只是删除到单词尾
dnl:向右删除n个字母
dnh:向左删除n个字母
dnj:向下删除n行
dnk:向上删除n行
d$:删除当前光标到改行的行尾的字母
dd:删除一行
cnw[word]:将n个word改变为word
cc:改变整行
C$:改变到行尾
J: 删除换行符,将光标移到改行,按shift+j删除行尾的换行符,下一行接上来了.
u: 撤销前一次的操作
shif+u(U):撤销对该行的所有操作。
:set showmode :设置显示工作模式
o:在当前行的下面另起一行
O(shift+o):在当前行的上面另起一行
nk或nj:光标向上或向下移n行,n为数字
an!【ESC】:在行后面加n个感叹号(!)
nx:执行n次x(删除)操作
ZZ:保存当前文档并退出VIM
:help :查看帮助文档,在这之中,按CTRL+] 进入超连接,按CTRL+O 返回。
:help subject :看某一主题的帮助,ZZ 退出帮助
:set number / set nonumber :显示/不显示行号
:set ruler /set noruler:显示/不显示标尺
/pattern 正方向搜索一个字符模式
?pattern 反方向搜索一个字符模式
然后按n 继续向下找
把光标放到某个单词上面,然后按×号键,表示查找这个单词
查找整个单词:/\<word\>
:set hlsearch 高亮显示查找到的单词
:set nohlsearch 关闭改功能
m[a-z]:在文中做标记,标记号可为a-z的26个字母,用`a可以移动到标记a处
r:替换当前字符
nr字符:替换当前n个字符
查找替换:
way1:
/【word】 :查找某个word
cw【newword】:替换为新word
n: 继续查找
.: 执行替换
way2:
:s/string1/string2/g:在一行中将string1替换为string2,g表示执行 用c表示需要确认
:num1,num2 s/string1/string2/g:在行num1至num2中间将string1替换为string2
:1,$ s/string1/string2/g:在全文中将string1替换为string2
v:进入visual 模式
【ESC】退出
V:shift+v 进入行的visual 模式
CTRL+V:进如块操作模式用o和O改变选择的边的大小。
粘贴:p,这是粘贴用x或d删除的文本
复制:
ynw:复制n个单词
yy:复制一行
ynl:复制n个字符
y$:复制当前光标至行尾处
nyy:拷贝n行
完了用p粘贴
:split:分割一个窗口
:split file.c :为另一个文件file.c分隔窗口
:nsplit file.c: 为另一个文件file.c分隔窗口,并指定其行数
CTRL+W在窗口中切换
:close:关闭当前窗口
在所有行插入相同的内容如include<,操作方法如下:
将光标移到开始插入的位置,按CTRL+V进入VISUAL模式,选择好模块后
按I(shift+i),后插入要插入的文本,按[ESC]完成。
:read file.c 将文件file.c的内容插入到当前光标所在的下面
:0read file.c 将文件file.c的内容插入到当前文件的开始处(第0行)
:nread file.c 将文件file.c的内容插入到当前文件的第n行后面
:read !cmd :将外部命令cmd的输出插如到当前光标所在的下面
:n1,n2 write temp.c 将本文件中的n1,到n2行写入temp.c这个文件中去
CTRL+L刷新屏幕
shift + < 左移一行
shift + > 右移一行
u: undo
CTRL+R: re-do
J: 合并一行
CTRL+p 自动完成功能
CTRL+g 查看当前文件全路径
q[a-z] 开始记录但前开始的操作为宏,名称可为【a-z】,然后用q终止录制宏。
用reg显示当前定义的所有的宏,用@[a-z]来在当前光标处执行宏[a-z].
(1) 为什么别人的方法在我这里行不通?
(2) 如何找到上次编辑的文件?
(3) 如何复制粘贴?
(4) 如何在多个文件中进行替换?
(5) 如何把fold一次全部打开?
(6) 如何选择、复制或者查找光标所在的单词?
(7) 如何计数搜索的字符串?
(8) 如何去掉高亮搜索?
(9) 如何解决linux下gvim中文菜单乱码的问题?
(10) 如何对所编辑的文件语法高亮显示?
(11) 如何快速插入多行数字0-99?
(12) 如何设置中文编码?
(13) 如何去掉或者插入^M这样的字符?
(14) 如何整体缩进一段代码(插入tab)?
(15) 如何合并两行?
(16) 如何设置缩进距离(tab宽度)?
==============================================================================
(1) 为什么别人的方法在我这里行不通?
估计这是最难回答的一个问题了。:-)
不过首先应该确定你的VIM版本是否足够新,功能是否完整。使用 :version 命令查看你
的VIM版本以及功能。一个常见的情况,如果你用的是RedHat系统,请确定安装了
vim-enhance的rpm包,否则将是不完整的VIM。
(2) 如何找到上次编辑的文件?
Ctrl+O (按两次)
(3) 如何复制粘贴?
复制
方法一:先ma标记当前位置为a,移动到新的位置,再y`a或者y''a复制从标记位置a到
当前位置的内容。`和''的区别:`以字符为单位,''以行为单位。这个方法应该是所有vi
都适用的。(如果不对请指正。)
方法二:按v或V或Ctrl+V进入visual模式,移动光标选择一段内容,按y。三者的区别:
v以字符为单位,V以行为单位,Ctrl+V是块选择。这个方法只在VIM下适用。
粘贴
p或P。区别:前者粘贴到光标后面,后者粘贴到光标前面。
(4) 如何在多个文件中进行替换?
一般可以用sed或者vim来做。比如要对当前目录下的*.c文件进行替换:
方法一:
for i in *.c; do
sed -i -e ''s/oldvalue/newvalue/g'' $i
done
方法二:
vim *.c
:argdo %s/oldvalue/newvalue/g
(5) 如何把fold一次全部打开?
zR 或者 :set foldlevel=999
(6) 如何选择、复制或者查找光标所在的单词?
在VIM中用iw或者aw表示一个单词,两者稍有区别。
选择光标所在的单词:viw (v进入visual模式,然后iw)
复制光标所在的单词:yiw
查找的话就是两个很常用的明令:# 和 *
(7) 如何计数搜索的字符串?
如果需要统计缓冲中一个模式(pattern)出现的频率,需要把 ''report'' 置为0,然后
用替换命令把模式替换成它自己。Vim 报告的已替换的数目就是模式出现的次数。例:
:set report=0
:%s/./&/g characters
:%s/i+/&/g words
:%s/^ lines
:%s/the/&/g "the" anywhere
:%s/<the>/&/g "the" as a word
你可能希望复位 ''hlsearch'' 或者使用 ":nohlsearch"。
(9) 如何解决linux下gvim中文菜单乱码问题?
以vim6.3为例
:source $VIMRUNTIME/delmenu.vim
:source $VIMRUNTIME/menu.vim
也可以将以上内容加入.vimrc
光source一个menu.vim或者啥也不source都是乱码
另外,也有网友报告说没有遇到此类问题
注:这里的source指的是vim自己的source命令,和bash shell的source无关
(11) 如何快速插入多行数字0-99?
在命令行中输入以下代码,或者先把代码保存到一个外部文件,然后source这个文件:
let i = 0
while i < 100
put = i
let i = i + 1
endw
如果位数不足需要在前面补零,可以用Ctrl-V块选择,然后I插入0。
(12) 如何设置中文编码?
在.vimrc中作如下设置,可以实现界面以及显示字体采用gb2312,遇到utf8文件时
自动做转换:
set encoding=prc
set fileencoding=prc
set fileencodings=utf8,prc
需要注意的是,按照上面的设置,如果你打开一个空的(0字节)或者是纯7bits的文件,
这时VIM将认为是utf8编码的文件,如果你往里面输入中文,存盘的时候也将是utf8。
因此你可能需要在存盘之前 :set fileencoding=prc 把编码改回来。
另外,对于纯7bits的文件,由于认成了utf8,每次打开存盘的时候都要做一次转换,
会比较慢,所以如果你很长一段时间不会接触utf8的话,可能暂时把 fileencodings
一行注释掉比较好。
[警告]:转换可能会造成信息丢失!如果你需要编辑的是重要的系统文件,最好把
fileencodings 一行暂时注释掉。
(13) 如何去掉或者插入^M这样的字符?
在VIM的插入模式或者命令行中用<C-V>输入^M这样的特殊字符,例如输入
:s/<C-V><C-M>//g
实际显示是
:s/^M//g
就可以去掉文件中所有的^M。同理,要在文件中输入^M只要按<C-V><C-M>即可。
这个问题往往发生在WINDOWS/DOS系统和UNIX系统之间交换文件时,因为这两类系统
对于文本的“换行”概念解释不同。所以,还有一个解决方法就是对这类文本进行
转换。vim内部就可以做这件事情。首先打开文本,然后
set fileformat=unix
再从新保存该文件覆盖原文件就可以去除:^M了
(14) 如何整体缩进一段代码(插入tab)?
选中一段代码,< 或 > 或 2< 或 3> ……
(15) 如何合并两行?
合并两行的键是 J
另外,如果你设置了
set backspace=2
你就可以用backspace或者delete很方便的删到上一行或者下一行。

