这篇文章适合于那些已经熟悉 Vim 基础操作,希望提高 Vim 编辑技能的开发者。

技能

移动到特定字符

使用 f{character} 可以快速跳转到指定字符。之后,你可以使用 ; 跳转到该字符下一次出现的位置,或者用 , 跳转到上一次出现的位置。你可以把 ;, 理解为重复执行字符搜索的快捷键。

快速水平移动

  • 0: 移动到行首的第一个字符
  • ^: 移动到行首的第一个非空白字符
  • $: 移动到行尾
  • g_: 移动到行尾的最后一个非空白字符

使用搜索进行精准垂直移动

  • /{pattern}: 在文件中向前搜索指定模式
  • ?{pattern}: 在文件中向后搜索指定模式

其他定位操作

  • %: 在成对的括号 ()[]{} 之间跳转。

操作符快捷语法

  • 双击操作符可作用于整行: dd 删除整行,cc 修改整行,等等。
  • 大写操作符可执行更强(或替代)的默认行为: D 删除从光标到行尾的内容,C 修改到行尾的内容,Y 复制整行(同 yy),P 在光标前粘贴。

使用文本对象提升编辑效率

  • daw: 删除一个单词(包括末尾的空格)
  • ciw: 修改单词内容
  • das: 删除一个句子 (dis 则不包含句子末尾的空格)
  • da": 删除双引号内的内容,包括引号本身 (di" 只删除内容,保留引号)
  • ci": 修改双引号内的内容
  • dap: 删除一个段落
  • dabda(da): 删除 () 包围的代码块
  • daBda{da}: 删除 {} 包围的代码块
  • dat: 删除整个 HTML 标签
  • cit: 修改 HTML 标签内的内容

实用的插入模式技巧

  • gi: 这个命令可以让你快速返回到上次编辑的位置并进入插入模式。如果你不小心退出了插入模式,想回到原位继续输入,这个功能会非常方便。(这与原生 Vim 略有不同,在 Vim 中,gi 会将你带到上次离开插入模式的位置。)

使用寄存器实现多次复制和剪切

  • "ayas 会复制一个句子并存入寄存器 a。之后,你可以通过 "ap 将其粘贴到任意位置。如果使用大写寄存器 A,则会将复制或剪切的内容追加到该寄存器中,而不是覆盖。

在插入模式下粘贴

  • CTRL-R ": 粘贴默认寄存器中的内容
  • CTRL-R a: 粘贴寄存器 a 中的内容
  • CTRL-R 0: 粘贴最近一次复制的内容

批量删除多行

  • 使用行号: :10,12d 删除第 10、11 和 12 行。
  • 使用偏移量: :10,+2d 从第 10 行开始,总共删除 3 行。
  • 使用 . 代表当前行: :.,+2d 删除当前行及随后的两行。
  • 使用 % 代表整个文件: :%d 删除所有行。
  • 使用 0 代表文件开头: :0,+10d 删除文件的前 11 行(从第 0 行开始,再加 10 行)。
  • 使用 $ 代表文件结尾: :.,$d 删除从当前行到文件末尾的所有内容。
  • 在可视模式下操作: 当你选中一段文本后输入 :,命令行会自动填充为 :'<,'>,这代表当前选中的范围。例如,:'<,'>d 会删除所有选中的行。

Vim-Surround 插件操作

  • ds': 删除外围的 ' (格式: ds{char})
  • cs'": 将外围的 ' 替换为 " (格式: cs{old}{new})
  • ysaptli>: 用 <li> 标签包裹整个段落 (格式: ys{motion}{char})
  • 你也可以在可视模式下选中一段文本,然后按 S{desired character},这样就能用你希望的字符包裹选中的文本。

Vim-EasyMotion 插件操作

  • 例如,输入 <leader><leader>w,EasyMotion 会标记出光标前所有单词的开头,方便你快速跳转。

参考