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
:删除光标所在位置的字符,等同于dl
s
:替换字符,等同于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'
:删除当前单引号内的内容,包括单引号
同时我们还可以使用 %
来在括号、花括号、方括号等成对出现的符号之间跳跃,比如当我们的光标在一个左括号 (
上时,按 %
会将光标跳转到对应的右括号 )
上。