本文基于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 | 开始块选择 |
快速移动
在当前行移动光标: | |
h | 左移(h在hjkl最左边) |
j | 下移(j像一个朝下的箭头) |
k | 上移 |
l | 右移(l在hjkl最右边) |
w/W | 移动到下一个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 的左边 |
`. | 跳转到上次编辑的地方 |
*(一般模式) | 读取光标处的字符串,并且移动光标到它再次出现的地方 |
#(一般模式) | 和上面的类似,但是是往反方向寻找 |
撤销重做
一般模式下: | |
u | 撤销 |
ctrl+R | 重做 |
查看命令记录
命令行模式下: | |
:history | 查看所有命令行模式下输入的命令历史 |
:history search或者 :history / 或者 :history ? | 查看搜索历史 |
普通模式下: | |
q/ | 查看使用/输入的搜索历史 |
q? | 查看使用?输入的搜索历史 |
q: | 查看命令行历史 |
快速删除(剪切)
普通模式下: | |
x | 剪切当前字符,可在前面搭配数字执行多次,被剪切内容保存在剪贴板 |
X | 剪切光标所在前一个字符,可在前面搭配数字执行多次,被剪切内容保存在剪贴板 |
dw | 快速删除(剪切)单词w,可在前面搭配数字执行多次,不适用于中文,如果光标在单词中间,则只删除当前光标到该单词末尾的部分 |
dd | 删除(剪切)整行,可在前面搭配数字执行多次 |
d$或D | 删除(剪切)至行尾,可在前面搭配数字执行多次,被删除内容保存在剪贴板 |
d^ | 删除(剪切)至行首,可在前面搭配数字执行多次,被删除(剪切)内容保存在剪贴板 |
dG | 删除(剪切)到文档结尾处,可在前面搭配数字执行多次,被删除(剪切)内容保存在剪贴板 |
d1G | 删除(剪切)至文档首部,可在前面搭配数字执行多次,被删除(剪切)内容保存在剪贴板 |
dtw | 删除(剪切)光标到下一个w字符(不包括w字符) |
d3l | 从光标位置(包括光标位置)向右剪切3个字符 |
d3B | 从当前光标位置(不包括光标位置)反向剪切3个单词 |
dH/dM/dL | 剪切从当前行至所显示屏幕顶行/屏幕中部/底部的全部行 |
c{motion} | 与d类似,但删除(剪切)后进入插入模式,比如:c$,这将会删除从光标位置到行尾的字符并且进入插入模式。ct!,这会删除从光标位置到下一个叹号(但不包括),然后进入插入模式。 |
s | 删除(剪切)当前字符并进入插入模式 |
S | 整行删除(剪切)并进入插入模式 |
rw | 替换当前字符为w |
R | 连续替换字符 |
文本对象操作
[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 | 复制当前行 |
nyy | n表示大于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 noh |
set 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(删除并插入)
其他命令
一般模式下: | |
. (小数点符号) | 重复你输入的上一个命令。比如,你上个命令为“dw”(删除一个词),输入小数点(.)将会接着再删除一个词 |
:f 或 Ctrl+g | 显示当前正在编辑的文档名称 |
:f 档名 | 改变编辑中的文档名 |
:edit . | 打开当前目录下文件列表 |
对齐文本
居中对齐
要使一定范围包括的行居中,用以下命令:
:{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 即可恢复正常。