Post

vim 命令助记

模式、保存和退出

CommandDescriptionNote
i进入编辑模式insert (在光标前方插入)
ESC / Ctrl + C进入普通模式推荐使用 Ctrl + C
:进入命令行模式 
:q仅退出quit
:q!不保存退出! (强制)
:w仅保存write
:wq保存并退出 

光标移动和编辑

单行移动光标和字符输入

CommandDescriptionNote
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} 次。
例:3o Hello World! ESC 可以在当前行下方插入三行 Hello World!
例:3A Hello World! ESC 可以在当前行尾追加三次 Hello World!

跳跃移动光标

行间跳跃

CommandDescriptionNote
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

行内跳跃

CommandDescriptionNote
0光标移动到 
$光标移动到 
^光标移动到首第一个非空字符 
g_光标移动到尾最后一个非空字符 

按单词跳跃

CommandDescriptionNote
w光标移动到下一个单词首部word
e光标移动到下一个单词尾部end of the word
b光标移动到上一个单词首部back
ge光标移动到上一个单词尾部 
*查找下一个与光标所在单词相同的单词 
#查找上一个与光标所在单词相同的单词 
/{pattern} Enter光标移动到下一个匹配的字符串 
?{pattern} Enter光标移动到上一个匹配的字符串 
n重复上一次的 *#/? 命令 
N反向重复上一次的 *#/? 命令 

按字符跳跃

CommandDescriptionNote
f{char}光标移动到下一个匹配的字符find
F{char}光标移动到上一个匹配的字符 
t{char}光标移动到下一个匹配的字符前一个位置until
T{char}光标移动到上一个匹配的字符后一个位置 
;重复上一次的 fFtT 命令 
,反向重复上一次的 fFtT 命令 

t{char} 通常作为 {motion}删除命令 d c复制命令 y 配合使用,用于处理括号或引号内的内容 {char} = ) 或 ] 或 } 或 " 或 '

按括号跳跃

CommandDescriptionNote
%光标移动到匹配的括号处如果光标在括号外,先移动到右括号,再按一次移动到左括号;
如果光标在括号内,先移动到左括号,再按一次移动到右括号。

按段落跳跃

CommandDescriptionNote
{光标移动到上一个段落 
}光标移动到下一个段落 

段落使用空行分隔。

按页跳跃

CommandDescriptionNote
Ctrl + d光标向下移动半页down
Ctrl + u光标向上移动半页up

按句子跳跃

CommandDescriptionNote
(光标移动到上一个句子首部 
)光标移动到下一个句子首部 

删除

删除字符

CommandDescriptionNote
x删除光标所在的字符 
X删除光标所在的字符的前一个字符 
s删除光标所在的字符并进入编辑模式substitute

删除字符串

CommandDescriptionNote
dd删除光标所在的行delete
dw删除光标处到下一个单词之前的内容 
cc删除光标所在的行并进入编辑模式change
cw删除光标处到下一个单词之前的内容并进入编辑模式 
D删除光标所在位置到行尾的内容 
{number}D删除光标所在位置到第 {number} - 1 行行尾的内容 
C删除光标所在位置到行尾的内容并进入编辑模式 
{number}C删除光标所在位置到第 {number} - 1 行行尾的内容并进入编辑模式 
CommandDescriptionNote
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} 后的位置有关。

复制和粘贴

CommandDescriptionNote
yy复制当前行yank
yw复制光标处到下一个单词之前的内容 
p粘贴到光标后方(复制一个词)或下方(复制一整行)paste
{number}p粘贴 {number} 
P粘贴到光标前方(复制一个词)或上方(复制一整行) 

除了复制命令 y 以外,使用删除命令 x s d c 删除的内容也会被保存到剪贴板中,可以使用 p 粘贴。

重复操作命令、撤销和重做

CommandDescriptionNote
.重复上一次操作 
u撤销上一次操作undo
Ctrl + r重做之前被撤销的操作redo

uCtrl + r 是一对逆操作;. 是单独的一种操作,用于重复上一次操作。

缩进

CommandDescriptionNote
>>向右缩进当前行 
<<向左缩进当前行 
>{number}j / >{number}k向右缩进当前行以及下/上 {number} 
<{number}j / <{number}k向左缩进当前行以及下/上 {number} 

使用 . 可以重复上一次的缩进操作。

大小写

CommandDescriptionNote
~切换光标所在字符的大小写 

Visual Mode

进入 Visual Mode

CommandDescriptionNote
v类似于鼠标拖动的选中模式 
V整行选中模式 
Ctrl + v块选中模式 

在 Visual Mode 下的操作

CommandDescriptionNote
h j k l移动光标,选中需要操作的区域 
d删除选中区域delete
D删除选中区域所在的整行 
y复制选中区域yank
Y复制选中区域所在的整行 
c删除选中区域并进入编辑模式change
C删除选中区域到行尾的内容并进入编辑模式 

视图

滚动页面

CommandDescriptionNote
zz将光标所在行置于屏幕中央 
zt将光标所在行置于屏幕顶部 
zb将光标所在行置于屏幕底部 

命令行命令

替换

CommandDescriptionNote
:%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! 命令可以删除所有标记。

This post is licensed under CC BY 4.0 by the author.