JiaHe's Blog

读万卷书,行万里路

全局

命令效果
:h[elp] 关键字打开关键字帮助
:sav[eas] 文件名另存为
:clo[se]关闭当前窗口
:ter[minal]打开一个shell窗口
K打开光标所在单词的man页面

Tip 在终端中运行Vimtutor以学习第一个VIM命令。

移动光标

命令效果
h左移光标
j下移光标
k上移光标
l右移光标
H移动到当前页面顶部
M移动到当前页面中间
L移动到当前页面底部
w移动到下个单词开头
W移动到下个单词开头(单词含标点)
e移动到下个单词结尾
E移动到下个单词结尾(单词含标点)
b移动到上个单词开头
B移动到上个单词开头(单词含标点)
ge移动到上个单词结尾
gE移动到上个单词结尾(单词含标点)
%跳转到配对的符号(默认支持的配对符号组:: '()', '{}', '[]'
0移动到行首
^移动到行首的非空白符
$移动到行尾
g_移动到行内最后一个非空白符
gg移动到文件第一行
G移动到文件最后一行
5gg or 5G移动到第五行
gdmove to local declaration
gDmove to global declaration
fx移动到字符 x 下次出现的位置
tx移动到字符 x 下次出现的位置的前一个字符
Fx移动到字符 x 上次出现的位置
Tx移动到字符 x 上次出现的位置的后一个字符
;重复之前的f、t、F、T操作
,反向重复之前的f、t、F、T操作
}移动到下一个段落 (当编辑代码时则为函数/代码块)
{移动到上一个段落 (当编辑代码时则为函数/代码块)
zz移动屏幕使光标居中
Ctrl + e向下移动屏幕一行(保持光标不动)
Ctrl + y向上移动屏幕一行(保持光标不动)
Ctrl + b向上滚动一屏
Ctrl + f向下滚动一屏
Ctrl + d向下滚动半屏
Ctrl + u向上滚动半屏

Tip 命令前追加数字表示命令的重复次数, 比如 4j 表示向下移动四行

插入模式 | 插入/追加文本

命令效果
i从光标前开始插入字符
I从行首开始插入字符
a从光标后开始插入字符
A从行尾开始插入字符
o在当前行之下另起一行, 开始插入字符
O在当前行之上另起一行, 开始插入字符
ea从当前单词末尾开始插入
Ctrl + h在插入模式下,删除光标前的字符
Ctrl + w在插入模式下,删除光标前的单词
Ctrl + j在插入模式下,另起一行
Ctrl + t在插入模式下,向右缩进,宽度由 shiftwidth 控制
Ctrl + d在插入模式下,向左缩进,宽度由 shiftwidth 控制
Ctrl + n在插入模式下,在光标之前插入自动补全的下一个匹配项
Ctrl + p在插入模式下,在光标之前插入自动补全的上一个匹配项
Ctrl + rx插入寄存器 x 的内容
Ctrl + ox暂时进入正常模式以发出一个正常模式命令 x。
Esc退出插入模式

编辑文本

命令效果
r替换当前字符
Rreplace more than one character, until ESC is pressed.
J将下一行合并到当前行, 并在两部分文本之间插入一个空格
gJ将下一行合并到当前行, 两部分文本之间不含空格
gwip重新调整段落
g~switch case up to motion
gu小写操作修饰符
gU大写操作修饰符
cc将光标所在的行删除, 然后进入插入模式
C将光标处到行尾删除, 然后进入插入模式
c$将光标处到行尾删除, 然后进入插入模式
ciw将光标所在的单词删除, 然后进入插入模式
cw or ce从光标位置开始, 修改单词
s删除当前字符, 然后进入插入模式
S清空当前行, 然后进入插入模式 (同cc)
xp当前字符后移
u撤销
U撤销上一次的改动行的操作
Ctrl + r重复
.再次执行上个命令

选择文本(可视化模式)

命令效果
v进入可视化模式, 移动光标高亮选择, 然后可以对选择的文本执行命令(比如y-复制)
V进入可视化模式(行粒度选择)
o切换光标到选择区开头/结尾
Ctrl + v / q进入可视化模式(矩阵选择)
O切换光标到选择区的角
aw选择当前单词
ab选择被 () 包裹的区域(含括号)
aB选择被 {} 包裹的区域(含花括号)
at选择被 <> 标签包裹的区域(含<>标签)
ib选择被 () 包裹的区域(不含括号)
iB选择被 {} 包裹的区域(不含花括号)
it选择被 <> 标签包裹的区域(不含<>标签)
Esc退出可视化模式

Tip 也可以使用 ( 和 { 分别代替 b 和 B

可视化模式命令

命令效果
>向右缩进
<向左缩进
y复制
d剪切
~大小写切换
u将选中文本转换为小写
U将选中文本转换为大写

寄存器

命令效果
:reg[isters]显示寄存器内容
"xy复制内容到寄存器 x
"xp粘贴寄存器 x 中的内容
"+y复制内容到系统剪贴板寄存器
"+p粘贴系统剪贴板寄存器的内容

Tip 寄存器被存储在 ~/.viminfo 中, 在下次重启vim时仍会加载

Tip 特殊寄存器:

命令效果
0上次复制
"未命名寄存器,上次复制或删除
%当前文件名
#轮换文件名
*剪贴板内容 (X11 primary)
+剪贴板内容 (X11 clipboard)
/上次搜索的pattern
:上次执行的命令
.上次插入的文本
-上次剪切的短于一行的文本
=表达式寄存器
_黑洞寄存器

标记

命令效果
:marks标记列表
ma设置当前位置为标记a
`a跳转到标记a的位置
y`a复制当前位置到标记a的内容
`0转到以前退出的vim的位置
`"上次编辑此文件时转到位置
`.转到此文件的最后一个更改的位置
``回跳到跳转之前的位置
:ju[mps]跳转的历史记录
Ctrl + i跳转到历史记录中最新的一处
Ctrl + o跳转到历史记录中最老的一处
:changes编辑改变的历史
g,跳转到编辑改变的历史记录中的最新一处
g;跳转到编辑改变的历史记录中的最老一处
Ctrl + ]跳转到光标下的标记

Tip To jump to a mark you can either use a backtick (`) or an apostrophe ('). Using an apostrophe jumps to the beginning (first non-blank) of the line holding the mark.

命令效果
qa录制宏 a
q停止录制宏
@a执行宏 a
@@重新执行上次执行的宏

剪切, 复制, 粘贴

命令效果
yy复制当前行
2yy复制 2 行
yw复制当前单词
yiw复制光标处的单词
yaw复制光标处的单词及其前后的空格
y$复制, 从光标位置到行末
p在光标后粘贴
P在光标前粘贴
dd剪切当前行
2dd剪切 2 行
dw剪切当前单词
diw删除光标处的单词
daw删除光标处的单词及其前后的空格
D剪切, 从光标位置到行末
d$剪切, 从光标位置到行末 (同D)
x剪切当前字符

文字缩进

命令效果
\>>将当前行向右缩进,宽度由 shiftwidth 控制
<<将当前行向左缩进,宽度由 shiftwidth 控制
\>%向右缩进 () 或 {} 内的区域 (光标需置于括号上)
\>ib向右缩进 () 内的区域
\>at向右缩进 <> 标签内的区域
3==自动缩进 3 行
=%自动缩进 () 或 {} 内的区域 (光标需置于括号上)
=iB自动缩进 {} 内的区域 (光标需置于括号上)
gg=G自动缩进整个缓冲区
]p粘贴并调整缩进至当前行

退出

命令效果
:w保存
:w !sudo tee %使用 sudo 保存当前文件
:wq or :x or ZZ保存并退出
:q退出(修改未保存时警告)
:q! or ZQ不保存强制退出
:wqa保存所有标签页并全部退出

查找/替换

命令效果
/pattern查找pattern
?pattern向上查找pattern
\vpatternpattern中的非字母数字字符被视为正则表达式特殊字符 (不需转义字符)
n查找下一个
N查找上一个
:%s/old/new/g替换全部
:%s/old/new/gc(逐个)替换
:noh[lsearch]移除搜索结果的高亮显示

多文件搜索

命令效果
:vim[grep] /pattern/ { `{file}` }在多个文件中搜索 pattern (e.g. :vim[grep] /foo/**/*)
:cn[ext]移动至下一个
:cp[revious]移动至上一个
:cope[n]打开搜索结果列表
:ccl[ose]close the quickfix window

标签

命令效果
:tabnew or :tabnew {page.words.file}在新标签中打开文件
Ctrl + wT将窗口变成标签
gt or :tabn[ext]切换到下一个标签
gT or :tabp[revious]切换到上一个标签
\#gt切换到第#个标签
:tabm[ove] #移动标签到第#位(下标从 0 开始)
:tabc[lose]关闭当前标签
:tabo[nly]关闭其他标签
:tabdo command在所有标签中执行命令 (例如 :tabdo q 关闭所有标签)

多文件编辑

命令效果
:e[dit] 文件名新建缓冲区打开 filename
:bn[ext]切换到下个缓冲区
:bp[revious]切换到上个缓冲区
:bd[elete]关闭缓冲区
:b[uffer]#go to a buffer by #
:b[uffer] filego to a buffer by file
:ls or :buffers列出所有打开的缓冲区
:sp[lit] 文件名新建缓冲区打开 filename 并水平分割窗口
:vs[plit] 文件名新缓冲区打开 filename 并垂直分割窗口
:vert[ical] ba[ll]edit all buffers as vertical windows
:tab ba[ll]edit all buffers as tabs
Ctrl + ws水平分割窗口
Ctrl + wv垂直分割窗口
Ctrl + ww在窗口间切换
Ctrl + wq关闭窗口
Ctrl + wxexchange current window with next one
Ctrl + w=make all windows equal height & width
Ctrl + wh切换到左侧窗口
Ctrl + wl切换到右侧窗口
Ctrl + wj切换到下侧窗口
Ctrl + wk切换到上侧窗口
Ctrl + wH使游标所在视窗全高并移至最左 (最左垂直视窗)
Ctrl + wL使游标所在视窗全高并移至最右 (最右垂直视窗)
Ctrl + wJ使游标所在视窗全宽并移至最下 (最下水平视窗)
Ctrl + wK使游标所在视窗全宽并移至最上 (最上水平视窗)

Diff

命令效果
zfmanually define a fold up to motion
zddelete fold under the cursor
zatoggle fold under the cursor
zoopen fold under the cursor
zcclose fold under the cursor
zrreduce (open) all folds by one level
zmfold more (close) all folds by one level
zitoggle folding functionality
]cjump to start of next change
[cjump to start of previous change
do or :diffg[et]obtain (get) difference (from other buffer)
dp or :diffpu[t]put difference (to other buffer)
:diffthismake current window part of diff
:dif[fupdate]update differences
:diffo[ff]switch off diff mode for current window

Tip 用于折叠(例如ZA)的命令在一个级别上运行。要在所有级别操作,请使用大写字母(例如ZA)。

Tip 要查看文件的差异,可以通过在终端中运行Vimdiff来直接启动Diff模式的Vim。人们甚至可以将其设置为git difftool。