Vim 简明教程

Vim 编辑器功能强大,同时也需要一定的学习成本。本文旨在记录常用的命令,要想用好 Vim,还是需要不断的实践练习,刚开始会觉得很困难,效率很慢,熟悉之后你就会离不开它的。

先定个小目标,早睡和早起!

写在前面

Vi(Vim) 作为一个强大的编辑器,其强大的功能由非常多的命令支撑;这么多的命令靠死记硬背显示是不行的,而是需要在训练中强化记忆,这个帖子只是对常用命令作一个记录。
首先,要了解一下 vi 编辑器的三种模式。

  • 一般模式:这是最常见的模式,绝大部分的命令都是在这个模式下运行的;在这个模式下,我们可以随意地定位光标,删除任意多的内容,复制粘贴,撤销重做等等

  • 编辑模式:一旦进入这个模式,vi 编辑器就与一般的编辑器没什么不同了,也是使用 backspace 或 delete 键进行删除,使用光标键进行移动

  • 指令模式:在这个模式下可以执行一些指令,比如保存文件,退出 vi 编辑器等

最常用的模式是一般模式,另外一般模式是另外两个模式的桥梁,也就是说另外两个模式要相互转换必须经过一般模式。刚进入 vi 时就处于一般模式,如果想从另外两个模式转换到一般模式,按 ESC 键即可。在一般模式下,输入一些能够开始编辑的命令,就进入编辑模式,比如 i, o 等命令。在一般模式下,输入命令 : 或 / 或 ? 就可以进入指令模式。

移动定位

命令 描述 备注
h 光标左移
l 光标右移
j 光标下移
k 光标上移
+ 移动到下一行 定位到本行首个非空白字符
- 移动到上一行 定位到本行首个非空白字符
$ 移动到行尾 光标定位到本行第一个字符
0 移动到行首 光标定位到本行最后一个字符
w 移动到下个单词的首字符
e 移动到下个单词的尾字符 如果当前光标已经在本单词的尾字符,则移动到下个单词的尾字符,否则移动到本单词的尾字符
b 移动到上个单词的首字符
nw 移动 n 个单词 光标定位在第 n 个单词的首字符
ne 移动 n 个单词 如果当前光标在本单词的尾字符,则定位到第 n 个单词的尾字符,否则定位到第 n-1 个单词的尾字符
nb 向前移动 n 个单词
gg 移动到文件首 光标定位在首行的第一个字符
G 移动到文件末 光标定位在尾行的第一个字符
n 定位到第 n 行 指令模式下运行,光标定位在首字符
n 往下移动 n 行(输入 n 之后按回车) 光标定位在首字符
ctrl+f 往下移动一页
ctrl+b 住上移动一页
ctrl+d 往下移动半页
ctrl+u 往上移动半页
H 移动到本屏第一行
M 移动到本屏中间行
L 移动到本屏最后一行
  • hjkl 这四个命令是两对命令,hl 左右移动,jk 上下移动,这种两边成对的方式比按顺序成对更为自然。
  • 向下翻页和向上翻页分别是 forward 和 behind 的意思,一般阅读往前走都是向下走的,所以 ctrl+f 是向下翻页,ctrl+b 是向上翻页。
  • 向下翻半页和向上翻半页则是 down 和 up 的意思,这两个就比较好理解了,ctrl+d 向下翻半页,ctrl+u 向上翻半页。

退出编辑器

命令 描述 备注
wq 保存后退出 指令模式下运行
q! 不保存直接强制退出 指令模式下运行

删除操作

命令 描述 备注
x 往后删除一个字符 删除当前光标所在字符
X 往前删除一个字符 删除当前光标前面的字符
dw 往后删除一个单词 连同单词后面的空白字符一起删除
de 往后删除一个单词 不删除单词后面的空白字符
db 往前删除一个单词 不删除单词前面的空白字符,不删除光标所在字符
d$ 从当前光标位置删除到行尾 包括当前光标所在字符
d0 从当前光标位置删除到行首 不包括当前光标所在字符
dG 从当前光标所在行删除到文件尾 包括当前行
dgg 从当前光标位置删除到文件头 不包括光标所在字符
dd 删除当前行 删除后光标会定位到下一行的行首
ndd 从当前行开始往下删除 n 行 包括当前行
di{ 把光标定位在在 { 上,然后按下 di,就可以把括号内的内容删除,括号保留 di(,di[ 也同样

一个文本中有一个单词 pad,如果此时光标在字符 a 上,则表示当前所处位置是 a 的前面,p 的后面,所以输入 x 命令会删除字符 a,输入 X 命令会删除字符 p。如果此时进入插入模式,则新插入的内容也是在 a 的前面,p 的后面。

进入编辑模式

命令 描述 备注
i 在当前光标处插入文本 在光标所在字符前面插入
a 在当前光标后面插入文本 在光标所在字符后面插入
I 在本行第一个非空字符前面插入文本
A 在本行最后一个字符后面插入文本
o 在下一行插入新行
O 在上一行插入新行

多选操作

命令 描述 备注
v 自由选择 进入可视状态之后,按任何移动键进行自由选择
shift+v 选择多行 进入可视状态之后,按 j k 或上下翻页键进行多行选择
ctrl+v 选择多列 进入可视状态之后,按 h l 进行多列选择,再按 j k 或翻页键选择多行

批量注释

  • 第一种方法,使用 v 或 shift+v 或 ctrl+v 的任意一种,选择要注释的行之后,进入指令模式,输入 normal i 注释符 即可。这种方式不要求整行选择或者必须选择某一列,只要该行被选中,就会行首进行注释。
  • 第二种方法,使用 ctrl+v 进行多列选择,然后输入 i ,再输入注释符,最后按 esc 结束,就可以将选中的行进行注释。这种方式会在选中的列位置插入注释符,如果要在行首进行注释,则必须选中第一列。

批量取消注释

按 ctrl+v 选中注释符所在列,然后选中要取消注释的列,按 d 删除注释符。这种方式其实是把注释符删掉,所以如果注释有多个的话(像//),则必须选中所有注释符,才能完整删掉。

格式化代码

选中要格式化的代码,按 = 即可。

文件内查找

命令 描述 备注
/+char 在一般模式下按 / 键进入指令械,然后输入要查找的字符 char,输入完成按回车键回到一般模式,这时就进入查找状态了 向前查找
?+char 同 /+char 一样 向后查找
shift+8 在一般模式下,光标定位在要查找的字符上,按下 shift+8 就可以查找这个字符 同 /+char 一样的功能
n 查找下一个 按定义的方向查找
N 查找上一个 按定义的方向反方向查找

文件內替換

命令 描述 备注
:s/old/new 在一般模式下按 : 进入命令模式,然后输入 s/{要替换的旧字符}/{要替换砀新字符},按回车键结束 只替换光标所在行的第一个匹配项
:s/old/new/g 同上 替换光标所在行的所有匹配项
:m,ns/old/new/g 同上,m,n 表示一个数字 替换第 m 行到第 n 行的所有匹配项
:%s/old/new/g 同上 替换整个文件的所有匹配项
:%s/old/new/gc 同上 替换整个文件的所有匹配项,每次匹配前由用户确认
r 在一般模式下按 r 删除当前光标所在字符同时进入编辑状态 输入一个新字符之后自动退出编辑状态,也就是 r 命令只能把单个字符替换成单个字符
R 在一般模式下按 R 会进入替换模式,当前光标会显示为下划线 每输入一个字符就会替换当前光标所在的字符,然后光标后移一位,直到按 ESC 退出编辑模式为止,如果替换到行尾,还是可以继续输入字符,则相当于变成插入模式,R 命令可以连续替换多个字符
ce 往后删除一个单词之后进入编辑状态 等价于 de + i
cw 同 ce cw 和 ce 完全一样,也是等价于 de + i,而不是 dw + i,de 会保留单词后面的空格,dw 则会连同后面的空格一起删除
cb 往前删除一个单词后进入编辑状态 等价于 db + i

全局搜索

命令 描述 备注
vim /char /% \ copen 只查找本文件 vim 是 vimgrep 的缩写,使用 vim 或 vimgrep 都可以,管道 copen 命令会打开一个新的分页,查找的结果显示在分页中
vim /char /* \ copen 查找本目录下的所有文件 使用 /* 或 /** 都可以

显示行号

命令 描述 备注
:set nu 在一般模式按 : 进入命令模式 显示行号
:set nonu 同上 隐藏行号

缓冲区跳转

每个打开的文件都会有一个缓冲区,通过切换缓冲区可在不同文件之间切换查看。

命令 描述 备注
{:ls} or {:buffers} 列出所有缓冲区 列出缓冲区编号、文件名、当前定位行数
{:bn} or {:bnext} 切换到下一个缓冲区 含义:buffer next
{:bp} or {:bprevious} 切换到上一个缓冲区 含义:buffer previous
{:b[n]} or {:b [n]} 切换到指定缓冲区 n 为缓冲区编号
:b [exp] 切换到指定缓冲区 exp 为表达式,用于模糊匹配文件名
<ctrl+^> 切换到上一个活跃缓冲区 在当前缓冲区和上一个缓冲区来回切换

高级用法

要查看所有缓冲区,除了使用 :ls:buffers 来列出之外,还可以借助快捷键 在跳转的时候列出所有缓冲区文件名,再次按 可以在不同文件之间预选,当选中要跳转的文件后,按回车执行命令即可跳转到相应的缓冲区。

命令 描述 备注
:b 列出缓冲区列表,再次按 预选文件,按回车执行命令 :b 之间要有空格
:b exp 进行模糊匹配,只列出与 exp 匹配的文件

分屏显示

一个缓冲区对应一个文件,屏幕上只能显示一个缓冲区的内容,即只能显示一个文件;如果要同时显示多个文件,就需要分屏显示,通过把屏幕分隔成多个窗口,每个窗口显示一个缓冲区,就能做到在屏幕上同时显示多个文件。

水平分屏:以水平线进行分割,将屏幕分为上、中、下等多个窗口;
垂直分屏:以垂直线进行分割,将屏幕分为左、中、右等多个窗口。

命令 描述 备注
vim -o file1 file2 水平分屏打开多个文件 打开几个文件就开几个窗口,如果只有一个文件则不分屏
vim -O file1 file2 垂直分屏打开多个文件
{sp} or {split} or {new} 新增水平分屏,新窗口在最顶端且为当前活跃窗口 如果带文件名则打开该文件,否则打开当前窗口的文件,如果当前窗口也没打开文件,则新窗口也无文件
{vs} or {vsp} or {vsplit} 新增垂直分屏,新窗口在最左边且为当前活跃窗口 同水平分屏
{clo} or {close} 关闭当前窗口
<ctrl+w> s 水平分屏 以当前文件打开
<ctrl+w> v 垂直分屏 以当前文件打开
<ctrl+w> n 水平分屏 新窗口,无打开文件
<ctrl+w> q 关闭当前窗口
<ctrl+w> o 关闭当前窗口之外的所有窗口

外部命令

在一般模式下输入 :![cmd] 即可执行外部命令,: 进入指令模式,! 表示接下来的命令是外部命令;执行成功之后会临时跳出 vim 回到终端,在终端显示执行结果,并提示 请按 ENTER 或其它命令继续,按下回车键或其它命令键就会回到 vim 界面。