本文基于Vim version8.0整理而来,详细的帮助信息请参考Vim官方文档中文版:http://vimcdoc.sourceforge.net/doc/help.html
目录
模式切换
快速移动
撤销重做
查看命令记录
快速删除(剪切)
文本对象操作
复制粘贴与寄存器
普通复制粘贴
寄存器
搜索替换
搜索
替换
多文件操作
自动补全
利用宏批量操作
可视化模式详解
其他命令
对齐文本
退出及保存
Vim6种模式:
Normal Mode 普通模式:在这种模式下可以移动光标等。Visual Mode 可视模式:在这种模式下可以选定一些字符、行、多列。Insert Mode 插入模式:在这种模式下可以编辑输入等。Command-Line 命令行模式:可以输入各种命令。Ex Mode Ex模式:多行的Command-Line模式,普通模式下按Q进入。Select Mode 选择模式。和可视模式不同的是,在这个模式下,选择完了高亮区域后,敲任何按键就直接输入并替换选择的文本了。下面只介绍前4种常用的模式的切换:
普通模式(Normal Mode)---> 插入模式(Insert Mode)i在当前光标处进行编辑I在行首插入a在光标后插入编辑A在行末插入o在当前行后插入一个新行O在当前行前插入一个新行cw替换从光标所在位置后到一个单词结尾的字符普通模式(Normal Mode)---> 可视模式(Visual Mode)v字符可视化模式,文本选择是以字符为单位的V行可视化模式,文本选择是以行为单位ctrl+v块可视化模式,可以选择一个矩形内的文本普通模式(Normal Mode)---> 命令行模式(Command-Line Mode):进入命令行模式普通模式(Normal Mode)--->选择模式(Select Mode)gh开始字符选择gH开始行选择g ctrl+H开始块选择移动到下一个word/WORD开头
(word以非空白符分隔的单词,WORD以空白符分隔的单词)
e/E移动到下一个word/WORD结尾b/B回到上一个word/WORD开头0移动光标到当前行首^移动光标到当前行的第一个字母位置$移动光标到行尾g_移动到行尾非空白字符fx
Fx
移动光标到当前行的下一个 x字符 处。可以使用分号(;)/逗号(,)继续搜该行下一个/上一个。
大写F表示往回搜索
tx和上面的命令类似,但是是移动到 x 的左边一个位置。( )移动到光标上/下一个句子{ }移动到光标上/下一个段落在整个文件移动光标:gg/G移动光标到文件开头和结尾,可以使用ctrl+o快速返回nG
移动光标到文件第n行H/M/L移动光标到屏幕开头/中间/结尾ctrl+u crtl+f往文件开头上翻页/往文件结尾下翻页zz设置光标所在行在屏幕中间ma在当前光标的位置标记一个书签,名字为 a。书签名只能是小写字母。你看不见书签的存在,但它确实已经在那里了`a到书签 a 处。注意这个不是单引号,它一般位于大部分键盘的 1 的左边`.跳转到上次编辑的地方*(一般模式)读取光标处的字符串,并且移动光标到它再次出现的地方#(一般模式)和上面的类似,但是是往反方向寻找
:history search或者
:history / 或者
:history ?
查看搜索历史普通模式下:q/查看使用/输入的搜索历史q?查看使用?输入的搜索历史q:查看命令行历史d3B
从当前光标位置(不包括光标位置)反向剪切3个单词dH/dM/dL剪切从当前行至所显示屏幕顶行/屏幕中部/底部的全部行c{motion}与d类似,但删除(剪切)后进入插入模式,比如:c$,这将会删除从光标位置到行尾的字符并且进入插入模式。ct!,这会删除从光标位置到下一个叹号(但不包括),然后进入插入模式。s删除(剪切)当前字符并进入插入模式S整行删除(剪切)并进入插入模式rw替换当前字符为wR连续替换字符[number]<command>[text object]
number表示次数,command是命令,例如d,c,y,text object为要操作的文本对象,例如单词w,句子s,段落p
iw表示inner word(不包括周围的空格),aw表示a word(包含在周围的空格)
此外还有:is,as, ip,ap
此外,还可以针对不同括号内的内容进行选择:例如:
i( 或者 i)选择()中的内容,例如vi(([2,3,4])a( 或者a)选择()中的内容,包含括号本身,例如va( [(1,2,3)]<>
{}
[]
"
`
与上面类似
命令行模式下:set paste打开粘贴命令,保留粘贴的换行格式等set nopaste关闭 粘贴命令 一般模式下:yy复制当前行nyyn表示大于1的数字,复制n行yw从光标处复制一个单词,包括单词后的空格ye从光标处复制一个单词,不包括单词后的空格
y$
从当前光标复制到行末y0从当前光标位置(不包括光标位置)复制到行首y3l从光标位置(包括光标位置)向右复制3个字符y3B从当前光标位置(不包括光标位置)反向复制3个单词p/P在光标前/后粘贴gp/P粘贴完后光标移动到粘贴内容之后很多编辑器都只提供了一个剪贴板。Vim 有很多。剪贴板在 Vim里面被称为寄存器(Registers)。最好使用小写字母来作为寄存器的名称,因为大写的有些被 Vim 占用了。
"a双引号(")指定寄存器名称,例如:
"ayiw 复制一个单词到寄存器a中;
"bdd 剪切当前行到寄存器b中
:reg查看所有寄存器:reg a查看寄存器a中的内容
查看寄存器帮助 :help registers
vim共有十种类型的寄存器: 1. 无名寄存器 "",缓存最后一次操作内容; 2. 10 个编号寄存器 "0 到 "9 3. 行内删除寄存器 "- 4. 26 个命名的寄存器 "a 到 "z 或者 "A 到 "Z 5. 三个只读寄存器 ":、". 和 "%(". 包含最近插入的文本 "% 包含当前文件名 ": 包含最近执行过的命令行) 6. 轮换缓冲区寄存器 "# 7. 表达式寄存器 "= 8. 选择和拖放寄存器 "*、"+ 和 "~ 9. 黑洞寄存器寄存器 "_ 10. 最近搜索模式寄存器 "/
命令模式下,输入:nohlsearch 也可以:set nohlsearch; 当然,可以简写,noh或者set noh。
命令行模式或一般模式:/w 或?搜索w字符串,n查看下一个匹配,N查看上一个匹配*(一般模式)读取光标处的字符串,并且移动光标到它再次出现的地方#(一般模式)和上面的类似,但是是往反方向寻找命令行模式下:nohlsearch或set nohlsearch不高亮显示搜索匹配内容,可以简写为noh或者set nohset hlsearch高亮显示搜索匹配内容 Vim查找支持正则表达式,例如/vim$匹配行尾的"vim"。 需要查找特殊字符需要转义,例如/vim\$匹配"vim$"。默认情况下,Vim 的查找是大小写敏感的。因此,"include","INCLUDE",和 "Include"为三个各不相同的词,而一次查找将仅仅匹配其中的一个。 现在设定 'ignorecase' 选项:
:set ignorecase
再查找 "include",现在它将匹配 "Include","INCLUDE" 和 "InClUDe"。 你可以这样撤销这个选项:
:set noignorecase
让我们保留这个设定,并查找 "INCLUDE"。它匹配的文本就跟查找 "include" 时一模一样。现在我们设定 'smartcase' 选项:
:set ignorecase smartcase
如果你采用的模式里至少有一个大写字母,查找就成了大小写敏感的。可以这样理解,你不必键入大写字母,也能查找到含有大写字母的词,所以,你若键入大写字母,必然是因为你要大小写敏感的匹配。聪明! 设定了这两个选项,你会找到以下匹配:
模式 匹配 word word、Word、WORD、WoRd 等。 Word Word WORD WORD WoRd WoRd
单个模式里的大小写
如果你仅想忽略一个特定的模式里的大小写,那么,在模式前添加 "\c" 字符串就行了。添加 "\C" 将使该模式的匹配大小写敏感。这排除了 'ignorecase' 和 'smartcase' 选项的影响,当 "\c" 或 "\C" 起作用时,它们设成什么值无关紧要。
模式 匹配 \Cword word \CWord Word \cword word,Word,WORD,WoRd,等。 \cWord word,Word,WORD,WoRd,等。
在一个查找模式中,"或" 运算符是 "\|"。例如:
/foo\|bar
这个命令匹配了 "foo" 或 "bar"。更多的抉择可以连在后面:
/one\|two\|three
匹配 "one"、"two" 或 "three"。
非贪婪重复模式匹配
/ab\{3,5} 匹配 “abbb”、“abbbb” 以及 “abbbbb”。
模式 匹配次数 \{,4} 0,1,2,3 或 4 \{3,} 3,4,5 等等 \{0,1} 0 或 1,同 \= \{0,} 0 或更多,同 * \{1,} 1 或更多,同 \+ \{3} 3
还有另一种不太好理解的匹配方式,使用"{-n,m}"的形式。他表示匹配尽可能少的字符。 例如,以下命令:
/ab\{-1,3} 将匹配 “abbb” 中的 “ab”。-1就表示只匹配尽可能少的b,这里是一个b,然而这里的3就体现不出作用来了。 再举个例子:
/ab\{-1,3}c 将匹配"abc",“abbc”,“abbbc”。这里的-1又体现不出作用来了。 再进一步:
/ab\{-1,3}c\= 将能够匹配"abc",“abbc”,“abbbc”,“abbb” 中的 “ab”。当c存在时就会限制b的最大个数不能超过3,当c不存在时,会匹配尽可能少的b的个数。
Vim 能找寻含有换行符的模式。你需要指定换行符在哪儿出现,因为迄今为止所有我们曾经提到过的项,都不匹配换行符。 用 "\n" 项可以在一个特定的位置查验一个换行符:
/the\nword
这个命令将在一行以 "the" 结尾,而下一行以 "word" 开头的地方找到匹配。如果还要匹配 "the word",那么你需要匹配一个空格或一个换行符。这可以用 "\_s" 表示:
/the\_sword
若要允许任意数量的空格:
/the\_s\+word
这个命令也匹配 "the " 在行尾,及 " word" 在下一行行首的情形。
"\s" 匹配空格字符,"\_s" 匹配空格字符或一个换行符。同理,"\a" 匹配一个字母字符,而 "\_a" 匹配一个字母字符或一个换行符。其它字符类和字符范围都可以通过插入一个 "_" 来更改其范围。
substitute命令,查找并替换字符串,支持正则表达式。
:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
或者:[range]s[ubstitute]+{pattern}+{string}+[flags] [count]
或者:[range]s[ubstitute]%{pattern}%{string}%[flags] [count]
对 [range] 指定的行把 {pattern} 的匹配替代成{string}。
[range]不写range默认为光标所在的行.光标所在行.+1当前光标所在行的下面一行1第1行33第33行$-1倒数第二行22,33第22行到第33行.,+2当前行与接下来2行1,$第1行到最后一行1,.第1行到当前行.,$当前行到最后一行%所有行[flags] 注:可组合使用无只对指定范围内的第一个匹配项进行替换g对指定范围内的所有匹配项进行替换c在替换前请求用户确认i忽略模式的大小写。不使用 'ignorecase' 和 'smartcase' 选项I不忽略模式的大小写。不使用 'ignorecase' 和 'smartcase' 选项n报告匹配的次数,并不实际进行替代。注意,匹配的时候需要组合上g,才能对所有指定范围内的字符串进行匹配e忽略执行过程中的错误
打开多个文件
vim还没有启动:vim file1 file2 file3 同时打开file1 file2 file3...vim已经启动::open file或者:e file打开一个新文件到缓冲区
Buffer(缓冲区)
vim打开一个文件后会加载文件内容到缓冲区,之后的修改都是针对内存中的缓冲区,并不会直接保存文件,执行保存命令后才会把修改内容写入到文件。
:ls或者:buffers列举当前缓冲区其输出可能像这样:
1 #h "help.txt" line 62 2 %a + "usr_21.txt" line 1 3 "usr_toc.txt" line 1
第一栏存放缓冲区号。你可以利用它来编辑文件,而不用键入文件名。紧随缓冲区号的是些标志位。然后是文件名,以及光标最后一次停留的行号。可能出现的标志位有以下这些 (自左至右):
u列表外缓冲区 unlisted-buffer%当前缓冲区#轮换缓冲区a激活缓冲区,缓冲区被加载且显示h隐藏缓冲区,缓冲区被加载但不显示=只读缓冲区-不可改缓冲区, 'modifiable' 选项不置位+已修改缓冲区
要从缓冲区列表上删除一个缓冲区,用这个命令:
:bdelete 3
同样,这命令也适用文件名。 如果你删除了一个激活的缓冲区 (显示在窗口中的缓冲区),你也就关闭了该窗口。如果你删除了当前缓冲区,你也就关闭了当前窗口。如果它是最后一个窗口,Vim 将找一个缓冲区来编辑。你无法什么也不编辑!
备注:即使用 ":bdelete" 命令删除了缓冲区以后,Vim 依然记得它。这个缓冲区实际上成了 "列表外" 缓冲区,它不再出现在 ":buffers" 命令所报告的列表中(ls前显示u标识: 列表外缓冲区)。不过 ":buffers!" 命令仍会列出 "列表外" 缓冲区 (没错,Vim 无所不能)。要让Vim 彻底忘记一个缓冲区,用 ":bwipe" 命令。
切分窗口:
一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区。
ctrl+w+s或者:sp水平分割窗口ctrl+w+v或者:vs垂直分割窗口在缓冲区间切换:
:b n 或 :b file跳转到第n个(file)缓冲区:bpre或者:bp切换到前一个缓冲区(缓冲区循环):bnext或者:bn切换到下一个缓冲区(缓冲区列表循环):N切换到前一个缓冲区(缓冲区列表不循环,没有前一个缓冲区会提示):n切换到下一个缓冲区(缓冲区列表不循环,没有后一个缓冲区会提示):N!或者:next!放弃更改并切换到下一个缓冲区,:n!同理。:wnext保存更改并切换到下一个缓冲区:bfirst切换到第一个缓冲区:blast切换到最后一个缓冲区对于使用 :e 打开的文件,您无法使用 :n 或 :N 进行切换。要切换到另一个文件,请输入 :buffer,然后输入文件缓冲区编号。
在窗口间切换:
ctrl+ww依次向后切换到下一个窗格中ctrl+w+h/j/k/l切换到前/下/上/后一个窗格ctrl+w+方向键
同上
ctrl+n或者ctrl+p
补全单词先按ctrl+x再按ctrl+f补全文件名先按ctrl+x再按ctrl+l补全整行
Vim的宏分为录制和回放
使用q来录制宏,同时也是使用q结束录制,
使用q{register}选择要保存的寄存器,把录制的命令保存其中,寄存器通常是 {0-9a-z".=*+} ,例如qa
使用@{register}回放寄存器中保存的一些列命令,或者使用visual模式选择多行,输入:normal @{register}
gv重复选中前一次可视化模式时选中的文本o光标移动到选中文本的另一结尾O光标移动到选中文本的另一角落J
合并成一行,同时以空格来分隔各行,例如:V10j,往下选中行,J合并成一行
gJ合并成一行,不在行间插入空格:write file对选定文本块写入另外一个file:sort对选中的文本进行排序~对选中的文本进行大小写转换u/U对选中的字符变小写/大写< >将选中字符右移或左移shiftwidth位置在多行前增加内容:
ctrl+v进入块选择,I进入列插入状态,输入字符,再按esc即可。
在多行末尾增加内容:
ctrl+v进入块选择,$跳到行末尾,A进入列添加状态,输入字符,再按esc退出即可。
备注:可视化模式下,列的写入都是大写的I(插入),A(追加),C(删除并插入)
居中对齐
要使一定范围包括的行居中,用以下命令:
:{range}center [width]
{range} 即是那些通常命令所能指定的范围。 [width] 是一个可选项,用来确定要居中的行的宽度。如果没有指定 [width],则默认使用 'textwidth' 的值。(如果'textwidth' 是 0,则默认为 80。) 例如:
:1,5center 40
将得到下面的结果:
I taught for a while. One time, I was stopped by the Fort Worth police, because my homework was too hard. True story.
右对齐
类似地,":right" 命令将使文本右对齐:
:1,5right 37
将得到这种结果:
I taught for a while. One time, I was stopped by the Fort Worth police, because my homework was too hard. True story.
左对齐
我们使用这个命令:
:{range}left [margin]
和 ":center" ":right" 不同的是,":left" 的参数并不是行的宽度,而是左边的页边距。如果这个参数被省略了,文本将被紧靠在屏幕的左边缘 (用一个零页边距参数将得到一样的效果)。如果页边距是 5,文本将缩进五个空格。举个例子,使用以下命令:
:1left 5 :2,5left
结果会是下面这样:
I taught for a while. One time, I was stopped by the Fort Worth police, because my homework was too hard. True story.
命令行模式下退出vim
:q退出,不保存:q!强制退出,不保存:x保存并退出:wq保存并退出:wq!强制保存并退出:w <路径+文件名>另存为:saveas <路径+文件名>另存为普通模式下退出vim
shift+zz(即ZZ)保存并退出
使用vim时,如果你不小心按了 Ctrl + s(锁定屏幕)后,你会发现不能输入任何东西了,像死掉了一般,其实vim并没有死掉,这时vim只是停止向终端输出而已,要想退出这种状态,只需按Ctrl + q 即可恢复正常。