Vim 速查手册

一、移动光标

字符级
命令 功能
h 移动一个字符单位
l 移动一个字符单位
j 移动一个字符单位
k 移动一个字符单位
单词级
命令 功能
w/W 移动到下一单词开头
e/E 移动到单词结尾
b/B 移动到单词开头

PS:所谓“单词”,是按照英文的书写和使用习惯来定义的。用在中文上,一般就会以标点符号和空格作为“单词”的界限。所以常常是一句话一句话地跳转。

块级
命令 功能
0 移动到当前行的第一个字符
^ 移动到当前行第一个非空白字符
$ 移动到当前行行尾
+ 移动到下一行的首字母
- 移动到上一行的首字母
gg 移动到文档第一行
G 移动到文档最后一行
H 移动到当前屏幕的第一行
M 移动到当前屏幕的中间一行
L 移动到当前屏幕的最后一行
:gg 跳转到第 n 行
:+j 从当前位置向下跳 n 行
:-k 从当前位置向上跳 n 行
滚动屏幕
命令 功能
Ctrl-d 向下滚动半页
Ctrl-u 向上滚动半页
Ctrl-f 向下移滚动一页
Ctrl-b 向上滚动一页
z 将当前行滚动到屏幕顶部
z. 将当前行滚动到屏幕中间
z- 将当前行滚动到屏幕底部

PS:绝大部分命令前都可以加一个数字 n ,通常表示对其后的命令连续执行 n 次。所以 3j 可以表示向下移动 3 个字符单位(即下移 3 行)。
3l 表示向右移动 3 个字符单位。相当于连续执行了 l 命令 3 次。
9z. 则表示光标移动到第 9 行的同时,滚动屏幕并使得第 9 行位于屏幕中间。(这个 9 的含义不同于 3l 命令中的 3

前面带冒号的命令(如 :+<n>,命令内容会显示在底部)是需要手动输入回车后才执行的。而不带冒号的命令(如 <n>gg)需要在键盘上不间断地按下,之后命令会自动执行。
光标移动示例

二、文档操作

简单编辑命令

插入
命令 功能
i 当前字符前插入
a 当前字符后插入
I 行首插入
A 行尾插入
o 在下一行插入
O 在上一行插入

PS:以上命令会使 vim 进入 insert 模式(即编辑模式),此时输入的任何命令都会作为字符插入到文档中。
esc 键可退出 insert 模式

删除(并将删除的内容保存至 vim 剪贴板
命令 功能
x 删除当前字符(等于 insert 模式下的 Delete)
X 删除前一个字符(等于 insert 模式下的 Backspace)
dd 删除当前行
d 删除指定内容
D 删除当前光标位置到行尾的所有内容。等于 d$
cc 替换整行内容。即将整行内容删除并进入 insert 模式
c 删除指定内容后,进入 insert 模式。相当于 d<x>a
C 替换当前光标位置到行尾的所有内容。等于 c$

部分用于指定删除的范围。
j 表示将光标向下移动一个字符单位(即下移一行),则 dj 表示删除当前行和下一行的内容。G 表示将光标移动到文档末尾,则在光标定位在文档首行时,使用 dG 命令可以清空整个文档的内容。

PS:使用以上命令删除的内容会自动保存到 vim 的剪贴板中,即所谓“删除”实际上是“剪切”,使用 p 命令即可粘贴删除的内容。而且该剪贴板限于 vim 内部,不是系统剪贴板。

复制与粘贴
命令 功能
yy 复制当前内容到 vim 剪贴板
y 复制指定内容到 vim 剪贴板
p 在当前位置后粘贴
P 在当前位置前粘贴
J 将当前行与下一行内容合并为一行

y<x> 命令中的 <x> 同样用于指定复制的范围。
4j 表示将光标下移 4 行,则 y4j 表示将当前行及其后 4 行内容复制到 vim 剪贴板。8gg 表示将光标定位至第 8 行,则 y8gg 表示复制当前行到第 8 行的所有内容。
当 vim 剪贴板中的内容为整行时,则粘贴命令(p/P)执行时,也会变成在当前行的前(后)一行粘贴。

查找

行内查找

命令 功能
f 当前行向行尾方向查找并定位到字符 x
F 当前行向行首方向查找并定位到字符 x
t 当前行向行尾方向查找并定位到字符 x 之前
T 当前行向行首方向查找并定位到字符 x 之后
; 继续向当前方向查找下一个字符
, 向当前方向的相反方向查找下一个字符

文档内查找

命令 功能
* 向后查找光标当前所在单词
# 向前查找光标当前所在单词
/ 向后查找指定字符串或模式
? 向前查找指定字符串或模式
n 继续查找下一个(依照原方向继续查找)
N 继续查找上一个(依照原方向进行反向查找)

PS:vim 中可使用 % 对括号 ()[]{} 进行匹配查找,当光标位于其中一个符合上时,按下 % 会跳转到与之匹配的另外一个符合上。

替换
命令 功能
r 将当前字符替换为字符 x
s 删除当前字符并进入 insert 模式
R 进入 replace 模式,逐字对当前字符进行替换操作,可以移动光标定位需要替换的字符。直到按下 ESC 键退出该模式
~ 对当前字符进行大小写切换(即大写转小写,小写转大写)
gu 将指定的文本转换为小写
gU 将指定的文本转换为大写
g~ 将指定文本进行大小写切换
:,s// 以某个模式(pattern)检索整个文档,并将第 n1 行到第 n2 行中的匹配项替换为指定内容(replace)
:%s// 以某个模式(pattern)检索整个文档并将匹配项替换为指定内容(replace)。等同于 :1,$s//

PS:%s/<pattern>/<replace> 命令中的 可以是正则表达式,且该命令只替换每行中的第一个匹配项。如需要全局匹配,可以使用 :%s/<pattern>/<replace>/g 命令
before replace
:%s/s.t/SET
:%s/s.t/SET/g

撤销、重做
命令 功能
. 重复执行上一次的命令
u 撤销
U 撤销对当前行的所有操作
Ctrl-r 重做
打开、关闭文档
命令 功能
:e 打开名为 filename 的文件,如文件不存在则创建
:Ex 在 vim 中打开目录树,光标选定后回车打开对应文件(- 命令进入上级目录)
:w 保存当前文件
:wa 保存全部文件
:wq 或 ZZ 保存文件并退出 vim
:q! 或 ZQ 强制退出 vim ,不保存文件
:r 读入另一个文档(filename)的数据,并将其内容附加到当前文档光标所在行的后面
:saveas <new_filename> 文件另存为
:w <new_name> 另存为一份名为 new_name 的副本并继续编辑原文件
:,w <new_name> 将 n1 行到 n2 行的所有内容保存到名为 new_name 的新文档中
Buffer

Buffer(缓冲区)指 vim 中打开的文件所占的内存空间,当未写入磁盘时,所有的修改都发生在内存中。vim 打开过的每个文件都会放到一个 Buffer 中,可以随意切换已打开的 Buffer。

命令 功能
:ls 或 :buffers 查看 buffer 列表
:bn 打开缓冲区中下一个文件
:bp 打开缓冲区中上一个文件
:b 打开缓冲区中第 n 个文件
:bdelete 删除需要关闭的缓冲区文件

before :bn
after :bn

三、其他技巧

缩进
  • >> 向右缩进当前行
  • << 向左缩进当前行
  • 4>> 向右缩进当前行的同时,缩进当前行下面的 3 行内容
  • >G 向右缩进当前行到文档末尾的所有内容
    自动排版
  • == 自动排版当前行
  • gg=G 自动排版整个文档
  • <n>== 对从当前行开始的 n 行进行自动排版
  • =<n>j 对当前行以及下面的 n 行进行自动排版
    执行 shell 命令
    :!<command> 可以执行相应的 shell 命令,命令执行完成后按 Enter 回到 vim 界面。
    如使用 :1,9!sort 命令可以将当前文件中第 1 行到第 9 行的内容重新排序。
    :r !<command> 可以将相应 shell 命令执行后的输出读取到当前文件中。
    如使用 :r !date 命令可以将当前详细的时间日期插入到 vim 编辑的文件中。

    四、分屏与标签页

    分屏与标签页
窗口分屏
  1. 分屏方式
  • :split:spCtrl-w s :上下分屏
  • :vsplit:vsCtrl-w v` :左右分屏
  • :diffsplit:diffs :diff 模式打开一个分屏,后面可以加 <filename>
  1. 窗口跳转
  • Ctrl-w w :激活下一个窗口
  • Ctrl-w j :激活下方窗口
  • Ctrl-w k :激活上方窗口
  • Ctrl-w h :激活左侧窗口
  • Ctrl-w l :激活右侧窗口
  1. 屏幕缩放
  • Ctrl-w = :平均窗口尺寸
  • Ctrl-w + :增加当前窗口高度
  • Ctrl-w - :缩减窗口高度
  • Ctrl-w _ :最大窗口高度
  • Ctrl-w > :增加窗口宽度
  • Ctrl-w < :缩减窗口宽度
  • Ctrl-w | :最大窗口宽度
标签页
  1. 创建标签页
    :tabnew:tabedit:tabe :打开新标签页
    该命令包括上面的分屏命令(:sp:vs 等)后面都可以跟 <filename> 选项,用以在新标签页(或窗口)中打开指定文件
  2. 切换标签页
  • gt:tabnext:tabn :切换到下一个标签页(最后一个会循环到第一个)
  • gT:tabprevious:tabp :切换到上一个标签页
  • :tabrewind:tabr:tabfir :切换到第一个标签页
  • :tablast:tabl :切换到最后一个标签页
  1. 关闭标签页
  • :tabclose:tabc :关闭当前标签页
  • :-tabc :关闭上一个标签页
  • :+tabc :关闭下一个标签页
  • :tabonly:tabo :关闭其他标签页

附录:vim 模式介绍

大致上 vim 分为三种模式,分别是命令模式(Command mode),编辑模式(Insert mode)和底线命令模式(Last line mode)。

1. 命令模式

vim 启动即进入命令模式。此时敲击键盘动作会被识别为命令,而不是作为字符插入到文档中。如:

  • i 切换到输入模式(在当前字符前插入)
  • : 切换到底线命令模式,此时输入的命令显示在最底下一行, : 符号后面
    命令模式下只有一些最基本的命令,而底线命令模式下拥有更多的命令。
    2. 编辑模式
    在命令模式下键入 i (或 ae 等)即进入编辑模式
    在编辑模式下,可以像在记事本中那样,使用键盘输入或修改文档内容。注意编辑完成时,可使用 ESC 键退出编辑模式,回到命令模式。
    3. 底线命令模式
    在命令模式下按下 : 即进入底线命令模式
    该模式下可以输入单个或多个字符的命令,以完成比命令模式下更复杂的操作(如 :wq 保存文件并退出)
    ESC 键可随时退出底线命令模式。

参考书籍

vimtutor
Learning The Vi And Vim Editors, 7th Edition