vim

  • ge将光标移动到前一个单词的末尾。e本来是移动到单词的末尾,而且符号算一个单词,E则是将字母和符号都算作一个单词,ge则是移动到前一个单词的末尾,b是移动到前一个单词的开头,gE则是移动到前一个单词的末尾,但不包括空白字符(空格、制表符、换行符)。有趣的是,gb
  • dap删除段落及附近空行。不需要可视化后选择多行再删除啦。
  • ctrl+u向上翻滚半页,ctrl+d向下翻滚半页,ctrl+f向下翻滚一页,ctrl+b向上翻滚一页
  • $表示当前行的结尾,^表示当前行的开头,0表示当前行的第一个非空字符,-表示上一行,+表示下一行,%表示匹配括号,*表示查找光标下的单词,#表示查找光标下的单词的上一次出现位置
  • ctrl+actrl+x分别增加和减少数字,ctrl+uctrl+d分别增加和减少小数点前面的数字
  • [[(跳转到下一个段落的开头)
  • :read !ls从外部命令读取内容并插入到当前缓冲区
  • gcc注释当前行,gcap注释当前段落,gx打开链接。
  • >>表示往右缩进,>G表示增加从当前行到文件最后一行的所有行的缩进。

键盘映射
VSCode 中使用 vim 插件键盘映射方式,在 settings.json 文件中添加以下内容:

1
2
3
{
"keyboard.dispatch": "keyCode"
}

使用标签页(Tab Pages)
标签页(tab pages)可以让你像浏览器标签一样在多个文件之间切换,每个标签页都可以包含多个窗口(window)。

  • :tabnew [filename]:打开一个新的标签页并加载指定的文件。如果不指定文件,会打开一个空的标签页。
  • :bn:切换到下一个标签页。
  • :bp:切换到上一个标签页。
  • :tabedit [filename]:与 :tabnew 类似,打开指定文件到新标签页。
  • gtgT:分别跳转到下一个或上一个标签页。

使用窗口(Windows)
窗口(windows)是将 vim 编辑器分成多个视图,每个视图可以显示不同的文件或同一文件的不同部分。

  • :sp [filename]:水平分割窗口并打开指定文件。
  • :vsp [filename]:垂直分割窗口并打开指定文件。
  • :only:关闭所有窗口,仅保留当前窗口。

使用缓冲区(buffers)
缓冲区(buffers)是 vim 中用于处理打开文件的内部表示。每个文件都在内存中作为缓冲区进行处理。而我主要还是使用的 VSCode 编辑器家 vim 插件,在 VSCode 中,缓冲区的切换可以通过ctrl+tab来切换,更加符合 GUI 界面的操作习惯。

  • :e [filename]:打开一个文件,创建新的缓冲区。
  • :bn:切换到下一个缓冲区,:bp:切换到上一个缓冲区。
  • :b [buffer number or name]:切换到指定的缓冲区。
  • :bd:删除当前缓冲区。
  • :bw:关闭当前窗口并删除缓冲区(但不退出 vim)。

寄存器与宏

  • ":默认寄存器,平时复制、删除的内容都放在里面。%:当前文件名。.:上一次插入的内容。::上一次执行的命令。
  • :reg {register}查看对应寄存器中的内容。
  • "ayy:将这一行复制到a寄存器中。"bdiw:将单词删除,保存到b寄存器中。"cp:将c寄存器中的内容粘贴出来。
    寄存器字符大写表示添加(append)而非覆盖。

Ex 命令格式

  • 格式::[range] {excommand} [args]
  • 解读:range:作用范围,不指定则默认是当前行。excommand:特殊命令,适用于 Command 模式。args:后续参数,视命令而定。
  • :[range] d/y/p {register}
  • address 可以是:
    • {lineno}:行号,如 3 代表第三行(0 代表第一行上面的虚拟行)。
    • $:最后一行。
    • .:光标所在行。
    • /{pattern}/:下一个 pattern 所在的行。
  • %:特殊的 range,代表当前文件的所有内容。
  • '<'>:可视模式中选中范围的开头和结尾(可视模式下直接按 : 可以直接设置)。

normal 命令

  • 格式::[range] normal {commands}
  • 含义:对 range 中的所有行执行 Normal 模式下的命令 commands
  • 常用做法:先做一次修改操作,再用 normal 命令在指定的行上完成操作。
  • . 命令只能记录一次修改,用宏可以实现记录多个操作。
  • :[range] normal @{register}:先把想要的操作录制成宏,再用 normal 命令在指定的行上重放宏。
  • :1,4 normal I# 表示在第 1 到第 4 行前面插入 #

global 命令

  • 格式::[range] global/{pattern}/[cmd]
  • 含义:对 range 中包含 pattern 的所有行执行 Command 模式下的 E x 命令 [cmd]
  • [cmd]:Ex 命令,不指定则默认是打印(print)。
  • 例子::% global /TODO/delete:删除所有带 TODO 的行。

替换命令

  • 格式::[range]s/{pattern}/{string}/[flags]
  • flagsg:替换每一行的所有匹配,i:忽视大小写,c:替换前进行确认。
  • :%s/^#/##/g:所有标题加一级。还可以用&表示匹配的原始内容。

参考内容

视频 这是一个比 missing-semester 更好的学习视频,全程无废话全干货,目前为止看到最好的 vim 教学视频