Vim¶
约 2083 个字 预计阅读时间 8 分钟
Warning
由于我本人并不常用 vim,平日里大多使用 VSCode 等图形化编辑器来写代码写文档,因此这里我只打算简单记录一点 vim 的常见命令,更多内容请参考官方文档或其他教程。
vimtutor:vim 自带的交互式教程,适合初学者入门- Vim 官方文档
- Vim Adventures:一个学习使用 vim 的小游戏
- Vim Tips Wiki:一个包含大量 vim 使用技巧的维基百科
编辑模式¶
Vim 的设计思路在我们花大部分时间在阅读、浏览文本,少部分时间用在编辑文本的基础上,它具有以下几种操作模式:
- 正常模式(默认模式,Normal mode):可操控光标在文本各处移动,执行删除、复制、粘贴等命令
- 插入模式(Insert mode):可插入文本,类似于其他文本编辑器的普通模式
- 替换模式(Replace mode):可插入文本,插入的文本会覆盖光标所在位置的原有文本
- 可视化模式(Visual mode):包括字符可视化模式、行可视化模式和块可视化模式,可选中一段文本进行操作
- 命令行模式(Command-line mode):可执行保存、退出等命令
在不同的操作模式下,相同按键的功能会有所不同。例如在插入模式下 x 会向文本插入普通字符 x,而在正常模式下 x 则表示删除光标所在位置的字符,在可视化模式下 x 则表示删除选中的文本。
我们可以使用 ++Esc++ 键任何其他模式切换回正常模式,在普通模式下
- 使用
i键切换到插入模式 - 使用
R键换到替换模式 - 使用
v键切换到字符可视化模式 - 使用
V键切换到行可视化模式 - 使用 ++Ctrl+v++ 切换到块可视化模式
- 使用
:键切换到命令行模式。
基本知识¶
插入文本¶
我们可以直接在正常模式下键入 i 进入插入模式,然后像在别的编辑器里那样输入文本,输入完成后按 ++Esc++ 键返回正常模式,但这显然不够高效。
缓存,标签页,窗口¶
在 Vim 中有着 buffer、 tab 和 window 三个概念:
- buffer(缓存):Vim 中打开的每个文件都会被加载到一个 buffer 中,buffer 是对文件内容的抽象表示,可以在不同的窗口和标签页中显示同一个 buffer 的内容
- tab(标签页):Vim 支持多标签页,每个标签页可以包含多个窗口,标签页用于组织和管理不同的工作空间
- window(窗口):Vim 支持在同一个标签页中分割多个窗口,每个窗口可以显示不同的 buffer 或同一个 buffer 的不同部分
当我们使用 Vim 打开一个文件时,Vim 会默认打开一个 tab,这个 tab 中包含一个 window,window 中显示了该文件对应的 buffer 的内容。
当我们使用命令 :q 时实际上做的是关闭当前选中的 window,如果当前 tab 中只剩下一个 window,那么关闭该 window 的同时也会关闭该 tab,即返回我们的 shell 界面。
命令行模式¶
在正常模式下键入 : 键可以进入命令行模式,在命令行模式下我们可以执行一些常用的命令:
:q:退出当前窗口,如果当前窗口是最后一个窗口,则退出 Vim:q!:强制退出当前窗口,放弃所有未保存的更改:w:保存当前文件:wq或:x:保存当前文件并退出 Vim:e <filename>:打开或编辑指定的文件:ls:列出当前所有打开的 buffer:help <command>:查看指定命令的帮助文档,例如:help :w查看保存命令:w的帮助文档,:help w查看普通模式下w键的帮助文档
Vim 的接口¶
Vim 最重要的设计思想是 Vim 的界面本身是一个程序语言。键入操作(以及他们的助记名) 本身是命令,这些命令可以组合使用。
移动¶
大多数时候我们会在正常模式中使用移动命令让光标在文本中移动。Vim 中的移动命令也被称为“名词”,因为它们指向某些文本块。
描述移动的时候使用向前向后可能会有歧义,这里我干脆直接用“正向”和“反向”来描述移动方向,正向表示从文本开头到结尾的方向,反向表示从文本结尾到开头的方向。
- 基本移动:
h、j、k、l:分别向左、下、上、右移动一个字符 - 关于单词:
w:正向移动到下一个单词开头b:反向移动到上一个单词开头e:反向移动到当前或下一个单词结尾
- 行:
0:移动到当前行的行首^:移动到当前行的第一个非空字符处$:移动到当前行的行尾
- 页面(屏幕):
H:移动到当前页面的顶部(highest)M:移动到当前页面的中间(middle)L:移动到当前页面的底部(lowest)
- 翻页:
Ctrl+d:向下滚动半页Ctrl+u:向上滚动半页
- 文件:
gg:移动到文件开头G:移动到文件结尾nG:移动到文件的第 n 行,例如5G移动到第 5 行
- 查找:
f<char>:正向查找字符<char>,并将光标移动到该字符处F<char>:反向查找字符<char>,并将光标移动到该字符处t<char>:正向查找字符<char>,并将光标移动到该字符前一个位置T<char>:反向查找字符<char>,并将光标移动到该字符后一个位置
编辑¶
在 Vim 中,几乎所有原先需要用鼠标来做的事现在都可以用键盘来解决:编辑命令与移动命令结合使用,可以对文本进行各种操作。
Vim 的编辑命令也被称为“动词”,因为动词可以施加于名词(移动命令)上,从而对文本进行操作。
i进入插入模式O / o:在当前行上方/下方插入新行,并进入插入模式d<motion>:删除从光标当前位置到指定位置的文本- 例如
dw删除从光标当前位置到下一个单词开头的文本 d$删除从光标当前位置到当前行行尾的文本dd删除当前行
- 例如
c<motion>:更改从光标当前位置到指定位置的文本,并进入插入模式- 例如
cw更改从光标当前位置到下一个单词开头的文本 c$更改从光标当前位置到当前行行尾的文本cc更改当前行
- 例如
x:删除光标所在位置的字符,等同于dls:替换字符,等同于xi- 可视化模式 + 操作
- 先使用可视化模式选中一些文本,在使用
d进行删除或c进行更改
- 先使用可视化模式选中一些文本,在使用
u:撤销上一个操作(undo)- ++Ctrl+r++:重做上一个被撤销的操作(redo)
.:重复上一个编辑命令y:复制(yank)选中的文本- 例如
yw复制从光标当前位置到下一个单词开头的文本 y$复制从光标当前位置到当前行行尾的文本yy复制当前行
- 例如
p:在光标后粘贴(put)复制的文本P:在光标前粘贴(put)复制的文本
其他操作¶
计数¶
我们可以使用数字来重复执行某些操作,例如:
5j:向下移动 5 行3w:正向移动到第三个单词开头3dw:删除从光标当前位置到第三个单词开头的文本
修饰语¶
我们可以使用修饰语来改变名词的含义。i 表示 inside,a 表示 around。
ci(:更改括号内的内容di(:删除括号内的内容da':删除当前单引号内的内容,包括单引号
同时我们还可以使用 % 来在括号、花括号、方括号等成对出现的符号之间跳跃,比如当我们的光标在一个左括号 ( 上时,按 % 会将光标跳转到对应的右括号 ) 上。