# 基础操作

Vim (opens new window) 是一个拥有代码补完、编译及错误跳转等方便编程的功能的文本编辑器,在程序员中被广泛使用。

也有一些 GUI 版的 Vim,如 MacVim、gVim 等。

# 插入文本

在终端输入 vim 进入编辑界面,默认会处于一般模式(Normal)。

如果你要在其中输入文字,你需要先进入 Insert 模式。进入方式包括:

i # 在游标处
I # 在当前行首
a # 在游标的后一个文字处
A # 在当前行尾
o # 在下面新开一行
O # 在上面新开一行

如果你想回到 Normal 模式,只需要按下 Esc 键即可,另外 Ctrl + [ 也具备同样的效果。

如果需要保存修改,需要进入 Normal 模式,然后使用 :w 进行保存。

如果你想保存后直接退出,可以在 Normal 模式下使用 :wq 进行保存。

如果你没有做任何修改,想要退出的话,可以在 Normal 模式下使用 :q 退出。

如果你想放弃当前编辑的内容,可以在 Normal 模式下使用 :q! 强制退出。

或者,你只是想暂时退出编辑界面,那么可以使用 Ctrl + z 快捷键,让 Vim 运行在后台,当你想再次唤起的时候,只需要运行 fg 命令。

# 移动游标

在 Vim 中通过 h(左)、j(下)、k(上)、l(右) 键来移动游标。

更快的,还可以使用 w 一次移动一个单词。不过,有个小问题是它会停留在逗号、分号等地方。如果你想直接跳过这些,保持跳到下个单词前则可以使用 W

对应的,如果你想往前跳转一个单词的话可以使用 bB

更快的,如果你想快速到达行首可以按下 0 或者 ^,跳到行尾则可以按下 $

更快的,你还可以使用 } 来向下一次跳一个段落,反向的则可以使用 {

最快的,可以使用 gg 跳到页面顶部,使用 G 跳到页面底部。

# 在文件中搜索

按下 / 键输入需要搜索的关键字后,再 Enter 确认输入则可以进行搜索。

然后按下 n 可以跳到下一个匹配项,反向的则可以按下 N

你也可以使用 ? 代替 /,然后按下 n 可以跳到上一个匹配项,反向的则可以按下 N

如果想要直接搜索游标所在的单词,则可以直接输入 *。跳转规则同 /

输入 # 和输入 * 的效果很类似,只是跳转规则同 ?

另外,按下 f 后再按下一个字,游标会跳转到后面和这个字的第一个匹配处,往前搜索则是使用 F

# 选取、复制、粘贴

使用 yy 可以复制当前行,复制多行则可以在前面加上量词。比如复制两行:2yy

使用 y$ 可以复制游标到行尾,相反的,y^y0 可以复制到行首。

更多的,使用 yG 可以复制到文档底部,ygg 复制到文档顶部。

通常,我们会使用 p 进行粘贴,结果会粘贴到游标所在的后一个字节处,P 则是向前粘贴。整行的大段复制会直接粘贴在下一行,P 则是在上一行。

其实,复制的内容都被放到了暂存器(register)中。共 48 个,其中 26(即字母表) 个供自由使用。

比如,把复制的内容放到 a 暂存器中,即可使用 "ay,粘贴的时候使用 "ap

整个编辑过程中,可以使用 u 进行撤销,使用 Ctrl + r 反撤销。

# 编辑文字

使用 x 可以往后按个删除,X 则相反。

在 Virtual 模式下选中后,按 x 也可以直接删除。

如果你想删除一行的话,可以直接使用 dd。和复制的量词类似,你也可以使用 2dd, dgg, dG 等。

x 类似的还有 c,它在删除后直接进入输入模式(不支持量词)。X 可以删除游标以后的内容,并进入输入模式。

另外,使用 r 还可以直接进行替换游标所在的内容。

如果你想对行进项缩进处理的话,可以使用 <<>>。当你选中内容时,只需要按单个的大小符号即可。

对于选中的内容按下 = 可以对内容进行智能的格式化操作。

# 编辑多个文件

在 Vim 下,可以通过 :e <filename> 打开新的文件。

如果 :tabe <filename> 则会新建一个 tab 来打开该文件。

在多个标签模式下,可以使用 gt 移动到下一个标签页面,gT 则是反向的切换。

除了标签之外,使用 :new 可以打开一个水平分割新的窗格,然后使用 Ctrl + w + hjkl 可以沿指定方向切换,而使用 Ctrl + w + w 则是在几个窗格之间循环切换。

当然,也可以使用 vnew 来新开一个垂直分割的新窗格。

其实,在终端打开文档时就可以以多窗格的方式打开多个文件,比如以水平分割窗格打开 a.txtb.txtvim -o a.txt b.txt。换做 O 则是垂直分割。

如果,把 o 换做 p 的话,则是以标签的方式打开。比如以标签的形式打开所有的 .txt 文件内:vim -p *.txt

如果在打开多个文件时没有指定 op 这样的参数时,打开后只能看到第一个文件。想要看到所有的文件可以使用 :ls

你可以使用 :b<n> 来打开指定的 buffer。切换一次后再次显示所有的 buffer,会发现之前的 buffer 前面对了一个 # 号,你可以使用 Ctrl + ^ 进行循环切换。

如果期间你知道文件名的话,也可以使用 :b<filename> 来打开指定其中的 buffer。

更快的还可以使用 :bn(下一个) :bp(上一个) :bf(第一个) :bl(最后一个):bd(关闭当前 buffer)。

# 选取方式

使用 V 可以进入 Visual Onlie 模式,此时你可以通过 jk 来进行(多)整行的选取。

使用 Ctrl + v 可以进行 Visual Block 模式,你可以使用 hjkl 来进行指定区域的选择,或者常用的多行编辑。

如果我们想要选取游标所在的单词,可以使用 vw 进行选取。遗憾的是,通常它会往后多选一个。这和 va<symbol> 很相似,好在你还可以选择 vi<symbol> 来进行选取。

不仅是选取,你还可以使用 dc 来进行组合,比如删除游标所在的单词:diw,或则更多你需要的组合:di<symbol>

在操作 HTML 时,还可以使用 vit,它会选在游标所在最近的一组 HTML 标签内容内容。

如果使用的是 vat,结果中还会包含两边的标签。

# Text Object

动词:

  • v 选取
  • y 复制
  • d 剪切
  • c 删除

名词:

  • w(word):单词
  • s(sentence):句子
  • p(paragraph):段落
  • t(tag):标签
  • 单双引号、大中小括号等

范围:

  • i(inner)
  • a(around)

量词:数字等

# 其它技巧

  • 按下 0 或者 ^ 会回到行首,前者是真正的回到首部。如果行首是空格,后者会停在空格后面。
  • 如果想要快速的翻到下一页,可以使用 Ctrl + f。反之,则是使用 Ctrl + b
  • 如果想要把一部分进行折叠的话,可以选中后使用 zf,展开则是 zd。借助 Text Object 不一定要先选取,比如 zfip 会折叠当前所在段落。
  • 使用 ~ 可以进行大小写互换。
  • 使用 . 可以重复的做上一个动作。
  • 如果想要合并两行可以使用 J,它会把下一行提到当前行的后面。也可以选中多行进行一次性的合并。
  • 在 Insert 模式下,可以使用 Ctrl + w 向前删除一个单词,使用 Ctrl + u 则可以清除游标前的所有内容。这在终端同样可用。
  • 使用 :! <command> 可以指定终端的命令,确认结果后会自动回到 Vim。使用 :r !<command> 还可以把命令输出的结果自动粘贴到游标处。
  • 在终端输入 vimtutor zh_tw 可以进入自带的引导文档。
  • 使用 :h <key_word> 可以查看相关的帮助文档。

# Tips

  • 使用 :w 进行保存时,你还可以在后面添加空格加文件名来创建新的文件。
  • 当一行特别长时,可能会被编辑器换行显示,当你上下移动时可能会感到奇怪,因为它不会在由于显示“产生的行”上面停留,看起来就像是一下移动了多行。为此,你需要使用一个前缀 g,比如 gj 来进行移动。
  • 按下 zt 可以将画面向上提升,zz 则是提升到中间,反向的则是 zb
  • 使用 :reg 可以检索目前暂存器中的所有内容。
  • 关闭或保存时,在后面加上 a 则表示对多个标签/窗格页面的操作。比如关闭当前所有 :qa
  • 在 Mac 下,可以将 Capslock 键改为 Ctrl

# 命令

  • 高亮搜索关键字:set hlsearch
  • 系统复制粘贴和 Vim 共享:set clipboard unnamed
  • 设置缩进的大小:set shiftwidth=2
  • 打开行号:set number