vim 命令助记
模式、保存和退出
Command | Description | Note |
---|---|---|
i | 进入编辑模式 | insert (在光标前方插入) |
ESC / Ctrl + C | 进入普通模式 | 推荐使用 Ctrl + C |
: | 进入命令行模式 | |
:q | 仅退出 | quit |
:q! | 不保存退出 | ! (强制) |
:w | 仅保存 | write |
:wq | 保存并退出 |
光标移动和编辑
单行移动光标和字符输入
Command | Description | Note |
---|---|---|
j | 下移光标 | |
k | 上移光标 | |
h | 左移光标 | |
l | 右移光标 | |
i | 在光标前方编辑 | insert (在光标前方插入) |
a | 在光标后方编辑 | append (在光标后方追加) |
I | 在行首编辑 | |
A | 在行尾编辑 | |
o | 在下方插入新行编辑 | open a new line |
O | 在上方插入新行编辑 | |
r{char} | 替换光标所在的字符为 {char} | replace |
使用 {number}i/I/a/A/o/O
{content}
ESC 可以重复输入{content}
{number}
次。
例:3oHello World!
ESC 可以在当前行下方插入三行Hello World!
。
例:3AHello World!
ESC 可以在当前行尾追加三次Hello World!
。
跳跃移动光标
行间跳跃
Command | Description | Note |
---|---|---|
G | 光标移动到最后一行行首 | go to the end of file |
gg | 光标移动到第一行行首 | go to the beginning of file |
{number}j | 光标向下移动 {number} 行 | 编辑器启用 relative line number |
{number}k | 光标向上移动 {number} 行 | 编辑器启用 relative line number |
{number}G / {number}gg | 光标移动到第 {number} 行行首 | go to line |
行内跳跃
Command | Description | Note |
---|---|---|
0 | 光标移动到行首 | |
$ | 光标移动到行尾 | |
^ | 光标移动到行首第一个非空字符 | |
g_ | 光标移动到行尾最后一个非空字符 |
按单词跳跃
Command | Description | Note |
---|---|---|
w | 光标移动到下一个单词首部 | word |
e | 光标移动到下一个单词尾部 | end of the word |
b | 光标移动到上一个单词首部 | back |
ge | 光标移动到上一个单词尾部 | |
* | 查找下一个与光标所在单词相同的单词 | |
# | 查找上一个与光标所在单词相同的单词 | |
/{pattern} Enter | 光标移动到下一个匹配的字符串 | |
?{pattern} Enter | 光标移动到上一个匹配的字符串 | |
n | 重复上一次的 *、#、/ 或 ? 命令 | |
N | 反向重复上一次的 *、#、/ 或 ? 命令 |
按字符跳跃
Command | Description | Note |
---|---|---|
f{char} | 光标移动到下一个匹配的字符 | find |
F{char} | 光标移动到上一个匹配的字符 | |
t{char} | 光标移动到下一个匹配的字符前一个位置 | until |
T{char} | 光标移动到上一个匹配的字符后一个位置 | |
; | 重复上一次的 f 、F 、t 或 T 命令 | |
, | 反向重复上一次的 f 、F 、t 或 T 命令 |
t{char} 通常作为
{motion}
与删除命令 d c 或复制命令 y 配合使用,用于处理括号或引号内的内容{char} = ) 或 ] 或 } 或 " 或 '
。
按括号跳跃
Command | Description | Note |
---|---|---|
% | 光标移动到匹配的括号处 | 如果光标在括号外,先移动到右括号,再按一次移动到左括号; 如果光标在括号内,先移动到左括号,再按一次移动到右括号。 |
按段落跳跃
Command | Description | Note |
---|---|---|
{ | 光标移动到上一个段落 | |
} | 光标移动到下一个段落 |
段落使用空行分隔。
按页跳跃
Command | Description | Note |
---|---|---|
Ctrl + d | 光标向下移动半页 | down |
Ctrl + u | 光标向上移动半页 | up |
按句子跳跃
Command | Description | Note |
---|---|---|
( | 光标移动到上一个句子首部 | |
) | 光标移动到下一个句子首部 |
删除
删除字符
Command | Description | Note |
---|---|---|
x | 删除光标所在的字符 | |
X | 删除光标所在的字符的前一个字符 | |
s | 删除光标所在的字符并进入编辑模式 | substitute |
删除字符串
Command | Description | Note |
---|---|---|
dd | 删除光标所在的行 | delete |
dw | 删除光标处到下一个单词之前的内容 | |
cc | 删除光标所在的行并进入编辑模式 | change |
cw | 删除光标处到下一个单词之前的内容并进入编辑模式 | |
D | 删除光标所在位置到行尾的内容 | |
{number}D | 删除光标所在位置到第 {number} - 1 行行尾的内容 | |
C | 删除光标所在位置到行尾的内容并进入编辑模式 | |
{number}C | 删除光标所在位置到第 {number} - 1 行行尾的内容并进入编辑模式 |
Command | Description | Note |
---|---|---|
di{ 或 di} | 删除大括号内的内容 | delete inside {} (光标需位于大括号之间) |
di[ 或 di] | 删除中括号内的内容 | delete inside [] (光标需位于中括号之间) |
di( 或 di) | 删除小括号内的内容 | delete inside () (光标需位于小括号之间) |
ci{ 或 ci} | 删除大括号内的内容并进入编辑模式 | change inside {} (光标需位于大括号之间) |
ci[ 或 ci] | 删除中括号内的内容并进入编辑模式 | change inside [] (光标需位于中括号之间) |
ci( 或 ci) | 删除小括号内的内容并进入编辑模式 | change inside () (光标需位于小括号之间) |
引号 "
、'
、`
同样可以使用上述命令。
其他删除命令 d{motion}:de dE dW db dB dj dk d{number}l d{number}h d{number}j d{number}k d{number}t{char}
删除范围与光标移动{motion}
后的位置有关。
复制和粘贴
Command | Description | Note |
---|---|---|
yy | 复制当前行 | yank |
yw | 复制光标处到下一个单词之前的内容 | |
p | 粘贴到光标后方(复制一个词)或下方(复制一整行) | paste |
{number}p | 粘贴 {number} 次 | |
P | 粘贴到光标前方(复制一个词)或上方(复制一整行) |
除了复制命令 y 以外,使用删除命令 x s d c 删除的内容也会被保存到剪贴板中,可以使用 p 粘贴。
重复操作命令、撤销和重做
Command | Description | Note |
---|---|---|
. | 重复上一次操作 | |
u | 撤销上一次操作 | undo |
Ctrl + r | 重做之前被撤销的操作 | redo |
u 和 Ctrl + r 是一对逆操作;. 是单独的一种操作,用于重复上一次操作。
缩进
Command | Description | Note |
---|---|---|
>> | 向右缩进当前行 | |
<< | 向左缩进当前行 | |
>{number}j / >{number}k | 向右缩进当前行以及下/上 {number} 行 | |
<{number}j / <{number}k | 向左缩进当前行以及下/上 {number} 行 |
使用 . 可以重复上一次的缩进操作。
大小写
Command | Description | Note |
---|---|---|
~ | 切换光标所在字符的大小写 |
Visual Mode
进入 Visual Mode
Command | Description | Note |
---|---|---|
v | 类似于鼠标拖动的选中模式 | |
V | 整行选中模式 | |
Ctrl + v | 块选中模式 |
在 Visual Mode 下的操作
Command | Description | Note |
---|---|---|
h j k l | 移动光标,选中需要操作的区域 | |
d | 删除选中区域 | delete |
D | 删除选中区域所在的整行 | |
y | 复制选中区域 | yank |
Y | 复制选中区域所在的整行 | |
c | 删除选中区域并进入编辑模式 | change |
C | 删除选中区域到行尾的内容并进入编辑模式 |
视图
滚动页面
Command | Description | Note |
---|---|---|
zz | 将光标所在行置于屏幕中央 | |
zt | 将光标所在行置于屏幕顶部 | |
zb | 将光标所在行置于屏幕底部 |
命令行命令
替换
Command | Description | Note |
---|---|---|
:%s/{old}/{new}/g Enter | 将所有匹配的 {old} 替换为 {new} | substitute global |
剪贴板 (寄存器)
在复制和粘贴部分提到了通过复制命令 y 和删除命令 x s d c 复制或删除的内容会保存到剪贴板中。
实际上,vim 中的剪贴板被称为寄存器,并且存在多个。寄存器可以通过 "{register}
命令访存,其中 {register}
可以是数字 (0
~ 9
)、小写字母 (a
~ z
)、大写字母 (A
~ Z
) 或特殊字符 ("
、-
、:
、.
、%
、#
、=
、*
、+
、~
、_
、/
)。
使用 :reg
命令可以查看当前所有寄存器的内容。
在复制命令和删除命令前输入 "{register}
可以将内容保存到指定的寄存器中,例如:"ayy 可以将当前行复制到寄存器 a
中;"bdd 可以将当前行删除并保存到寄存器 b
中。
在粘贴命令前输入 "{register}
可以从指定的寄存器中粘贴内容,例如:"ap 或 "bP 。
下面使用中文简单介绍 vim 中总计 10 种寄存器。对于更严谨的说明,请使用 :help registers
命令查看,或阅读 vim 寄存器文档。
vim 中的 10 种寄存器
1 匿名寄存器 ""
匿名寄存器 ""
会存储最近一次复制或删除命令 y x s d c 涉及到的内容,无论该操作是否指定了寄存器。当粘贴操作没有指定寄存器时,会使用匿名寄存器中的内容。
实际上,匿名寄存器的行为应该是指向最后使用的寄存器。因为当使用大写字母的寄存器名称进行追加操作时,匿名寄存器会包含与命名寄存器相同的文本。
有一个例外是黑洞寄存器 "_
,它会丢弃任何复制或删除的内容,不会保存到任何寄存器中。因此匿名寄存器永远不会指向黑洞寄存器。
2 数字寄存器 "0
~ "9
数字寄存器 "0
会保存最近一次复制 y 的内容,除非在复制命令前指定了其他寄存器。
数字寄存器 "1
~ "9
会保存最近 9 次删除 d c 一行及以上的内容。当删除的内容小于一行时,不会保存到数字寄存器中,而是保存到小删除寄存器 "-
中。
3 小删除寄存器 "-
小删除寄存器 "-
会保存最近一次删除 x s d c 小于一行的内容,除非在删除命令前指定了其他寄存器。
4 命名寄存器 "a
~ "z
和 "A
~ "Z
26 个命名寄存器只有在复制和删除命令 y x s d c 前指定了寄存器时才会保存内容。
使用小写字母指定寄存器 "a
~ "z
时,会覆盖寄存器中的内容;使用大写字母指定寄存器 "A
~ "Z
时,会将内容追加到寄存器已有内容的后面。
5 只读寄存器 ":
、".
、"%
":
寄存器会保存最近一次在命令模式下执行的命令,可以使用 @:
重复执行上一次命令。
".
寄存器会保存最近一次在编辑模式下输入的文本。
"%
寄存器会保存当前工作目录到该文件的相对路径。
6 交替文件寄存器 "#
7 表达式寄存器 "=
8 选择和拖拽寄存器 "*
、"+
、"~
9 黑洞寄存器 "_
黑洞寄存器 "_
用来实现在不影响其他寄存器的情况下使用删除命令 x s d c 删除内容。
10 搜索寄存器 "/
搜索寄存器 "/
会保存最近一次使用 /
或 ?
命令搜索的内容。
可以使用 :let @/ = {content}
命令设置搜索寄存器的内容。
标记 (Mark)
vim 可以在文件中设置标记,用于快速跳转到指定位置。
设置标记
使用 m{char} 命令设置标记,其中 {char}
可以是小写字母 (a
~ z
) 或大写字母 (A
~ Z
)。
小写字母标记仅用于当前文件内跳转,大写字母标记可以用于跨文件跳转。
查看标记
使用 :marks
命令可以查看所有标记。
跳转标记
使用 `{char} 或 '{char} 命令可以跳转到指定标记处。
- `{char} 跳转到标记的具体位置
- '{char} 跳转到标记所在行的第一个非空字符
删除标记
使用 :delm {char1} {char2} ...
命令可以删除指定的标记。
使用 :delm!
命令可以删除所有标记。