Esc从任何模式回到 normal 模式,vim 的家。
记忆法: Escape = 逃离当前模式,回家。
Esc
Ctrl+[ (same as Esc, doesn't need pinky)
Vim 速查表,100+ 条命令含模式、移动、编辑、搜索、寄存器、分屏,带记忆法。
Esc从任何模式回到 normal 模式,vim 的家。
记忆法: Escape = 逃离当前模式,回家。
Esc
Ctrl+[ (same as Esc, doesn't need pinky)
i在光标位置进入 insert 模式,可以直接打字。
记忆法: i = insert,光标之前插入。
i
iHello World
a在光标后进入 insert 模式(append,追加)。
记忆法: a = append,光标之后追加。
a
a // comment
I在当前行第一个非空字符前插入。
记忆法: 大写 I = 行首 Insert(跳过缩进)。
I
I//
A在当前行末尾追加。
记忆法: 大写 A = 行尾 Append。
A
A;
o在当前行下方新开一行并进入 insert 模式。
记忆法: o = open,下面开一行。
o
ohello
O在当前行上方新开一行并进入 insert 模式。
记忆法: 大写 O = 上面开一行。
O
O# header
v进入 visual 模式(按字符选择),用来选中文本。
记忆法: v = visual,按字符选。
v
vw (select to next word)
vap (select around paragraph)
V进入 visual line 模式,按整行选。
记忆法: 大写 V = 整行 Visual。
V
Vj (select 2 lines)
V}d (select to paragraph end and delete)
Ctrl+vVisual block 模式,选中矩形区块,可以做"列编辑"。
记忆法: Ctrl+v = 块选(垂直方向),列编辑神器。
Ctrl+v
Ctrl+v 3j I// Esc (comment 3 lines with //)
R进入 replace 模式,打字会覆盖原有字符。
记忆法: R = 持续 Replace,像打字机覆写。
R
Rfoo (replace 3 chars with foo)
:进入 command 模式,输入 :w :q :s 这类命令。
记忆法: 冒号 = 命令行。
:w
:q
:wq
gi回到上次离开 insert 模式的位置,并重新进入 insert。
记忆法: g + i = 回到刚才插入的地方继续打。
gi
gv重新选中上一次的可视选区(范围和模式都一样)。
记忆法: g + v = 把刚才那块选区还给我。
gv
gvd (reselect then delete)
o (in visual)在可视模式里,把光标跳到选区的另一端,方便从那头继续扩选。
记忆法: o = 选区的另一头。
vjjo (then extend upward)
Ctrl+o (insert)在 insert 模式里临时执行一条 normal 命令,做完自动回到 insert。
记忆法: Ctrl+o = 插一条 normal 命令,做完就回来。
Ctrl+o $ (jump to line end without leaving insert)
Ctrl+o dd
Ctrl+w (insert)insert 模式下删掉光标前的一个单词。
记忆法: Ctrl+w = 抹掉前一个词(插入模式)。
Ctrl+w
Ctrl+u (insert)insert 模式下删掉本行进入插入后输入的全部内容。
记忆法: Ctrl+u = 清掉刚才这行打的字(插入模式)。
Ctrl+u
Ctrl+r (insert)insert 模式下插入某个寄存器的内容(Ctrl+r 再按寄存器字母)。
记忆法: Ctrl+r(插入模式)= 把寄存器内容读进来。
Ctrl+r " (paste the unnamed register)
Ctrl+r 0 (paste last yank)
Ctrl+r + (paste system clipboard)
gJ把下一行接上来,但中间不加空格(原样拼接)。
记忆法: g + J = Join 但不加空格。
gJ
3gJ
h / j / k / l左 / 下 / 上 / 右,每次一个字符。vim 党的方向键。
记忆法: h 在键盘最左所以向左,l 在最右所以向右。j 像钩子往下挂,k 像踢腿往上。
h
5j (down 5 lines)
10l (right 10 chars)
w跳到下一个单词的开头。
记忆法: w = word,向前一个词。
w
3w (forward 3 words)
W跳到下一个 WORD,类似 w,但只有空白才算分隔(foo.bar 是一个 WORD)。
记忆法: 大写 W = "大词",跨过标点。
W
dW (delete a WORD including dots)
b向后跳到上一个单词的开头。
记忆法: b = back,向后一个词。
b
3b
e跳到当前或下一个单词的末尾。
记忆法: e = end,词尾。
e
de (delete to word end)
ge向后跳到上一个单词的末尾。
记忆法: g + e = 反向找词尾。
ge
0跳到行首(第 0 列,包括前面所有空格)。
记忆法: 零 = 第零列,绝对最左。
0
^跳到本行第一个非空字符(跳过缩进)。
记忆法: ^ 指向"真正内容的开头"(跳过缩进)。
^
d^ (delete from cursor back to first non-blank)
$跳到本行末尾。
记忆法: $ 在正则里也是"行尾",一致的记忆。
$
d$ (delete to end of line, same as D)
gg跳到文件第一行。
记忆法: gg = 直接 go go 到顶。
gg
5gg (go to line 5)
G跳到文件最后一行(或 NG 跳到第 N 行)。
记忆法: 大写 G = Go 到底。
G
120G (go to line 120)
:<N>跳到第 N 行(比如 :42 跳到第 42 行)。
记忆法: 冒号 + 数字 = 直接定位行号。
:42
:1
{ / }跳到上一段 / 下一段(按空行分段)。
记忆法: 大括号像包住一段,按它就跳到段的边界。
{}
d} (delete to end of paragraph)
( / )跳到上一句 / 下一句(按 .!? 断句)。
记忆法: 小括号 = 小步,按句跳。
(
)
Ctrl+u向上滚半屏,光标跟着走。
记忆法: u = up,向上半屏。
Ctrl+u
Ctrl+d向下滚半屏,光标跟着走。
记忆法: d = down,向下半屏。
Ctrl+d
Ctrl+f向下翻一整页。
记忆法: f = forward 翻一整页。
Ctrl+f
Ctrl+b向上翻一整页。
记忆法: b = back 翻一整页。
Ctrl+b
zz / zt / zb把当前光标行放到视口的中间 / 顶部 / 底部。
记忆法: z = 调位置,zz 居中(双 z 对称)。
zz
zt
zb
H / M / L光标跳到可视屏幕的最上 / 中间 / 最下。
记忆法: H = High, M = Middle, L = Low,首字母好记。
H
M
L
f<char> / F<char>在本行向前 / 向后跳到下一个 <char> 字符上。
记忆法: f = find,大写 = 反向。
f(
F"
df; (delete up to and including ;)
t<char> / T<char>跳到本行 <char> 之前 / 之后(不包含该字符本身)。
记忆法: t = till,停在目标前一格。
t)
dt; (delete up to but not including ;)
; / ,重复上一次 f/F/t/T 的跳转,正向 / 反向。
记忆法: ; 同方向再来一次,, 反方向。
;
,
%跳到配对的括号(含 ( ) [ ] { } 甚至 #if / #endif 等)。
记忆法: % 像两半相对的图形,所以跳到另一半。
%
d% (delete from cursor through matching bracket)
Ctrl+o / Ctrl+i在跳转历史里向后 / 向前(像浏览器的后退 / 前进)。
记忆法: o = older 老位置,i = incoming 新位置。
Ctrl+o
Ctrl+i
+ / -跳到下一行 / 上一行的第一个非空字符。
记忆法: + 下一行,- 上一行,都落在首个非空字符。
+
-
3+ (down 3 lines to first non-blank)
|跳到本行的第 N 列(N| 跳到第 N 列)。
记忆法: 竖线 | 是竖的,所以选列。
1| (column 1)
40| (column 40)
g_跳到本行最后一个非空字符($ 落在最后一个字符,哪怕是空格)。
记忆法: g + _ = 跳到最后一个真正的字符。
g_
dg_ (delete to last non-blank)
gj / gk按"显示行"上下移动(长行被折行成多屏行时特别有用)。
记忆法: g + j/k = 按屏幕行走,而不是逻辑行。
gj
gk
nnoremap j gj (make j respect wrapping)
gd / gD跳到光标下标识符的局部(gd)/ 全局(gD)首次定义处(按关键字找,不需要索引)。
记忆法: g + d = go to definition,小写局部、大写全局。
gd
gD
]] / [[跳到下一个 / 上一个章节,或第 1 列的顶层 {(向前 / 向后)。
记忆法: 双中括号 = 在大段代码之间跳。
]]
[[
[{ / ]}跳到光标前未配对的 {,或光标后未配对的 },从代码块内部往外跳。
记忆法: [{ 跳到包住你的左括号,]} 跳到右括号。
[{]}
[( / ])跳到光标前未配对的 ( 或光标后未配对的 ),和 [{ ]} 一样但针对小括号。
记忆法: 中括号 + 小括号 = 跳到包住你的圆括号。
[(
])
Ctrl+e / Ctrl+y窗口向下 / 向上滚动一行,光标不动(除非它要被挤出屏幕)。
记忆法: Ctrl+e 视图下移一行,Ctrl+y 上移一行。
Ctrl+e
Ctrl+y
3 Ctrl+e
g; / g,在改动列表里跳到更早 / 更新的编辑位置。
记忆法: g; 往回翻编辑点,g, 往前翻。
g;
g,
`.跳到文件里最后一次改动的精确位置(. 标记)。
记忆法: 反引号 + . = 我刚改的那个地方。
`.
'. (same but line-wise)
`^跳到上次离开 insert 模式时光标所在的位置。
记忆法: `^ = 上次停止插入的标记。
`^
iw / aw单词文本对象:iw = 词本身(不含空格),aw = 词加一个相邻空格。配合操作符使用。
记忆法: i = 内部,a = 含外围(a 还会吞一个空格)。
diw
daw
viw (select inner word)
ciw
ip / ap段落文本对象:ip = 段落本身,ap = 段落加后面的空行。
记忆法: ip = 段内,ap = 含外围空行。
dap
vip
yap
it / atHTML/XML 标签文本对象:it = 标签内部,at = 含 <…> 与 </…> 的整对标签。
记忆法: it = 标签内,at = 含标签本身。
dit
cit
dat
vat
x删掉光标下的字符。
记忆法: x = 划掉一个字符。
x
5x (delete 5 chars)
X删掉光标前的字符(normal 模式下的退格)。
记忆法: 大写 X = 向后划掉。
X
r<char>用 <char> 替换光标下那个字符,不进入 insert 模式。
记忆法: r = replace 一个,按一下就改。
ra
r) (turn a } into ))
s替换:删掉光标下的字符并进入 insert 模式。
记忆法: s = substitute,删 + 进入插入。
s
3sfoo (replace 3 chars with foo)
S替换整行:删掉这一行并在缩进位置进入 insert 模式。
记忆法: 大写 S = Substitute 整行(= cc)。
S
d<motion>从光标删除到 motion 走到的地方(同时复制进默认寄存器)。
记忆法: d + motion = 删除走过的范围,记忆套路就是 d + 任何移动键。
dw (delete to next word)
d$ (delete to end of line)
d5j (delete current + 5 lines below)
dd删掉整行。
记忆法: dd = 双 d,删整行(motion 就是这一行)。
dd
3dd (delete 3 lines)
D从光标删到行尾(等价于 d$)。
记忆法: 大写 D = 删到行尾。
D
c<motion>改变:删掉 motion 范围并直接进入 insert 模式。
记忆法: c = change,删 + 直接打字。
cw (change a word)
c$ (change to end of line, = C)
ci" (change inside quotes)
cc改写整行,删除内容后在缩进位置进入 insert。
记忆法: cc = 双 c,改整行。
cc
C从光标改到行尾(等价于 c$)。
记忆法: 大写 C = 改到行尾。
C
y<motion>复制(yank)motion 范围到默认寄存器。
记忆法: y = yank,把文本拽到寄存器里。
yw (yank a word)
y$ (yank to end of line)
yi( (yank inside parens)
yy复制整行。
记忆法: yy = 双 y,复制整行。
yy
5yy (yank 5 lines)
p在光标之后粘贴;如果之前复制的是整行,就粘到当前行下方。
记忆法: p = paste,在后面粘。
p
3p (paste 3 times)
P在光标之前粘贴;整行则粘到当前行之上。
记忆法: 大写 P = 在前面粘。
P
u撤销最近一次改动。
记忆法: u = undo,撤销。
u
5u (undo 5 changes)
Ctrl+r重做,撤销的反操作。
记忆法: Ctrl+r = redo,重做。
Ctrl+r
.重复上一次"修改"动作。vim 里最被低估的键,没有之一。
记忆法: 句号 = "再来一次",结束动作的延续。
.
cw foo Esc j . (change next word to foo too)
>> / <<当前行右缩进 / 左缩进一个 shiftwidth。
记忆法: >> 往右推,<< 往左推。
>>
3>> (indent 3 lines)
V}> (indent paragraph)
~切换光标处字符的大小写(光标向后走一格)。
记忆法: 波浪号像在两个状态间摆动 = 切换大小写。
~
5~ (toggle 5 chars)
guu / gUU当前行整行转小写 / 转大写。
记忆法: g + u = 转小写;g + U = 转大写。
guu
gUU
gUw (uppercase one word)
J把下一行接到当前行末,中间加一个空格。
记忆法: 大写 J = Join,把两行合一起。
J
3J (join 3 lines)
di<obj> / da<obj>删除文本对象内部 / 包含外围(单词、引号、括号、HTML 标签等)。
记忆法: i = inner 内部,a = around 含外围(含分隔符)。
diw (delete inside word)
di"
da(
dit (delete inside tag)
ci<obj> / ca<obj>改写文本对象内部 / 含外围,类似 di/da 但直接进入 insert。
记忆法: c + 文本对象 = 直接换掉那个东西。
ciw (change a word)
ci"
ci{ (change inside braces)xp把当前字符和后一个字符对调(删一个再粘到后面)。
记忆法: x 删一个,p 粘到后面,正好对调。
xp (turn "teh" into "the" with cursor on e)
ddp把当前行和下一行对调(删本行,粘到下面)。
记忆法: dd 剪掉本行,p 粘到下面,等于把行往下挪。
ddp
ddkP (move line up)
Ctrl+a / Ctrl+x把光标处或之后的数字加一 / 减一。
记忆法: Ctrl+a = add 加,Ctrl+x = 减。
Ctrl+a
10 Ctrl+a (add 10)
Ctrl+x
g Ctrl+a在一列数字的可视块上,生成递增序列(1、2、3…)。
记忆法: g + Ctrl+a 作用在选区上 = 阶梯式递增。
Ctrl+v 4j g Ctrl+a (number 5 lines 1..5)
gp / gP像 p / P 一样粘贴,但光标停在粘贴内容之后(适合连续粘贴)。
记忆法: g + p = 粘完光标走到末尾。
gp
gP
]p粘贴并把粘进来的行缩进对齐到当前行(在不同缩进层级间挪代码很顺手)。
记忆法: ]p = 粘贴并自动对齐缩进。
]p
[p (paste above with indent fix)
o<Esc>在下面开一空行并立刻退出插入,快速加空行。
记忆法: o 开行、Esc 退出,留下一个空行。
o<Esc>
O<Esc> (blank line above)
cis / cas改写当前句子的内部 / 含外围(替换光标所在那一句)。
记忆法: c + i/a + s = 改写句子。
cis
das (delete a sentence)
yi( / ya{复制小括号内部 / 大括号含外围的内容。
记忆法: y + i/a + 括号 = 复制括号里的东西。
yi(
ya{yi[ (yank inside square brackets)
g~<motion>对 motion 范围切换大小写(g~~ 切整行)。
记忆法: g + ~ = 对一段范围切换大小写。
g~w (toggle a word)
g~~
g~$
=<motion>按当前缩进规则自动缩进 motion 范围(== 缩当前行)。
记忆法: = 表示"把缩进弄对"。
==
=ap (reindent a paragraph)
gg=G (reindent whole file)
Ctrl+v $ A块选到每行行尾,再用 A 给所有选中行同时追加相同文本。
记忆法: 块选 + $ + A = 一次给多行行尾追加。
Ctrl+v 3j $ A; Esc (add ; to 4 line ends)
/<pattern>向下搜索正则匹配,回车跳到第一个匹配。
记忆法: 斜杠 = 向下找。
/foo
/^import.*react
/foo\c (case-insensitive for this search)
?<pattern>向上反向搜索正则。
记忆法: 问号 = 回头问,反向找。
?TODO
?function
n / N跳到下一个 / 上一个搜索匹配(与搜索方向同向 / 反向)。
记忆法: n = next 同向,N = 反向。
n
N
* / #搜光标下那个单词,* 向下、# 向上。全词匹配。
记忆法: * 标记"就搜这个词",# 是反向版本。
*
#
g* (substring match, not whole word)
:noh清掉搜索结果的高亮(hlsearch)。
记忆法: noh = no highlight,去高亮。
:noh
:nohlsearch
:s/old/new/在当前行把第一个 old 替换成 new。
记忆法: :s = substitute,替换。
:s/foo/bar/
:s/foo/bar/g (all on this line)
:s/old/new/g在当前行替换所有 old 为 new。
记忆法: g = global,行内全部替换。
:s/foo/bar/g
:%s/old/new/g在整个文件里替换所有 old 为 new。最常用的"全文替换"。
记忆法: % = 整文件,g = 每行全部,组合 = 全文替换。
:%s/foo/bar/g
:%s/\<foo\>/bar/g (whole word only)
:%s/old/new/gc同 %s/g 但每个匹配前都要 y/n/a/q/l 确认一下。
记忆法: c = confirm,每个都问。
:%s/foo/bar/gc
:<range>s/old/new/g只在某段行内替换(比如 5,20 或者可视选区 '<,'>)。
记忆法: 在 s 前给范围,缩小替换区间。
:5,20s/foo/bar/g
:'<,'>s/foo/bar/g (visual selection)
gn把上次搜索的下一个匹配选成可视选区(配合操作符好用:cgn 直接改它)。
记忆法: gn = 跳到下个匹配并选中它。
cgn (change next match, then . to repeat)
dgn
:g/pat/dglobal 命令:删除所有匹配该模式的行。经典的"删掉所有含 X 的行"。
记忆法: :g = 对每个匹配行执行命令,这里 d = 删除。
:g/TODO/d
:g/^\s*$/d (delete blank lines)
:v/pat/d反向 global:删除所有不匹配的行(只留下匹配的行)。
记忆法: :v = :g!,对不匹配的行操作。
:v/keep/d
:g!/error/d
:g/pat/normal @a在每个匹配行上跑一个宏(或任意 normal 命令)。
记忆法: :g + normal = 在匹配行批量执行 normal 命令。
:g/^func/normal @a
:g/foo/normal A;
:%s//new/g替换时把模式留空,直接复用上一次的搜索模式。
记忆法: :s 模式留空 = 用刚才的 /搜索。
/foo then :%s//bar/g
:s/.../\=expr/用 \= 让替换文本变成一个 vim 表达式求值(比如对匹配做算术)。
记忆法: \= 让替换变成"算出来再填"。
:s/\d\+/\=submatch(0)+1/ (add 1 to the number)
\v (very magic)在模式开头加 \v 进入 very magic,大多数字符都当特殊符,正则更接近 PCRE,少打反斜杠。
记忆法: \v = very magic,当成正常正则用。
/\v(foo|bar)
:%s/\v(\w+)\s+\1/\1/g (collapse doubled words)
:sort / :sort u对范围内(或全文)的行排序。加 u 去重,n 按数字,! 倒序。
记忆法: sort = 排序;u 去重、n 数字、! 倒序。
:sort
:sort u
:sort n
:%sort! (reverse sort all)
"a y<motion>把内容 yank 到具名寄存器 "a",而不是默认寄存器。
记忆法: 双引号 + 字母 = 指定一个寄存器槽。
"ayy (yank line to register a)
"byw (yank word to register b)
"a p从具名寄存器 "a" 粘贴。
记忆法: "a + p = 粘 a 寄存器的内容。
"ap
"bP (paste register b before cursor)
"+y / "+p从系统剪贴板寄存器复制 / 粘贴(需要 vim 编译支持 +clipboard)。
记忆法: + 寄存器 = 系统剪贴板。
"+yy (copy line to system clipboard)
"+p (paste from OS clipboard)
"* y / "* p使用 X11 PRIMARY 选区(Linux 中键粘贴)复制 / 粘贴。
记忆法: * 寄存器 = PRIMARY 选区。
"*yy
"*p
"_ d<motion>删除到黑洞寄存器 _,不会污染剪贴板 / 默认寄存器。
记忆法: 下划线 = "扔了它",黑洞。
"_dd (delete line WITHOUT yanking)
"_x
:reg列出所有寄存器和它们当前的内容。
记忆法: reg = registers 列表。
:reg
:reg a b "
"0 p粘贴最后一次 yank 的内容(0 号寄存器只装 yank,删除不会污染)。
记忆法: 0 号 = 只存 yank,删除不会覆盖,专治"粘错"。
"0p
"A y<motion>yank 并追加到寄存器 a(大写寄存器 = 追加而非覆盖)。攒多行内容很好用。
记忆法: 大写寄存器字母 = 往里追加。
"Ayy (append this line to register a)
"Add
". p从 "." 寄存器粘贴,也就是你最近一次在 insert 模式输入的文本。
记忆法: . 寄存器 = 我刚打的那段字。
".p
"% p粘贴 "%" 寄存器,里面是当前文件名(相对路径)。
记忆法: % 寄存器 = 当前文件名(和 :命令里的 % 一致)。
"%p
:put % (put filename on a new line)
": p粘贴 ":" 寄存器,里面是你上一条 Ex 命令,方便回头改命令。
记忆法: : 寄存器 = 上一条 : 命令。
":p
@: (re-run the last Ex command)
Ctrl+r Ctrl+w (cmdline)在命令行或搜索提示里,把光标下的单词拉进来(Ctrl+r Ctrl+a 拉 WORD)。
记忆法: Ctrl+r Ctrl+w = 把光标处的词读进命令行。
:s/<Ctrl+r Ctrl+w>/new/
/<Ctrl+r Ctrl+w>
:put <reg>把寄存器内容放到光标下一行(始终按行粘,哪怕寄存器是字符型)。
记忆法: :put = 把寄存器内容单独放一行。
:put a
:put + (paste clipboard line-wise)
:0put a (put at top of file)
m<letter>在光标处打一个标记(a-z 本文件,A-Z 跨文件全局)。
记忆法: m = mark,做标记。
ma (mark a)
mZ (global mark Z)
'<letter>跳到标记 <letter> 的那一行(光标落在该行第一个非空字符)。
记忆法: 单引号 = 跳到那行。
'a
'A (jump to mark A across files)
`<letter>跳到标记 <letter> 的精确位置(含列号)。
记忆法: 反引号 = 跳到精确位置(含列)。
`a
`A
:marks列出当前所有标记。
记忆法: marks = 标记列表。
:marks
:marks abc (just a, b, c)
''跳回上次跳转之前的位置。
记忆法: '' = 弹回上次的位置。
''
:delmarks删除标记。:delmarks a 删 a;:delmarks! 清空所有 a-z 本地标记。
记忆法: delmarks = 删标记。
:delmarks a
:delmarks!
'< / '>上一次可视选区的开始 / 结束位置,会自动打上这两个标记。
记忆法: '< 和 '> 是可视选区的两端(:'<,'> 就用它们)。
'<
'>
:'<,'>s/foo/bar/g
'[ / ']最近一次被改动或 yank 的文本的首 / 末位置(反引号则是精确位置)。
记忆法: '[ '] 框住最近改动 / yank 的范围。
'[
']
`[v`] (reselect last pasted text)
``跳回最近一次跳转前的精确位置(带列号,是 '' 行跳的精确版)。
记忆法: 两个反引号 = 弹回精确位置。
``
'"跳到上次关闭这个文件时光标所在的位置(从 viminfo/shada 恢复)。
记忆法: '" = 回到上次离开这个文件的地方。
'"
au BufReadPost * normal! `" (auto-restore on open)
:sp [file]横向分屏(上下)。若给文件名就打开它。
记忆法: sp = split,上下分。
:sp
:sp src/main.ts
:vsp [file]纵向分屏(左右)。若给文件名就打开它。
记忆法: vsp = vertical split,左右分。
:vsp
:vsp README.md
Ctrl+w h/j/k/l把焦点切到左 / 下 / 上 / 右那个窗口。
记忆法: Ctrl+w = 窗口前缀,再按方向。
Ctrl+w h
Ctrl+w l
Ctrl+w w把焦点切到下一个窗口(循环)。
记忆法: Ctrl+w w = 下一个窗口。
Ctrl+w w
Ctrl+w =让所有窗口大小相等。
记忆法: = 号 = 等分。
Ctrl+w =
Ctrl+w + / Ctrl+w -当前窗口高度增加 / 减少一行。
记忆法: + 长大,- 缩小,跟到处一样。
Ctrl+w +
5 Ctrl+w + (grow by 5 rows)
Ctrl+w > / Ctrl+w <当前窗口宽度增加 / 减少。
记忆法: > 右边变宽,< 变窄。
Ctrl+w >
10 Ctrl+w >
Ctrl+w o只留当前窗口,其他全关。
记忆法: o = only,只留这一个。
Ctrl+w o
:only
Ctrl+w q / :q关闭当前窗口。
记忆法: q = quit 当前窗口。
Ctrl+w q
:q
Ctrl+w s / Ctrl+w v把当前窗口横向(s)/ 纵向(v)分屏,等同 :sp / :vsp 的窗口前缀版。
记忆法: Ctrl+w 再 s = 分屏,v = 纵向分。
Ctrl+w s
Ctrl+w v
Ctrl+w H/J/K/L把当前窗口挪到布局的最左 / 最下 / 最上 / 最右(重排分屏)。
记忆法: Ctrl+w + 大写 HJKL = 把整个窗口推到那个方向。
Ctrl+w H (move window to far left)
Ctrl+w L
Ctrl+w r在当前行 / 列里轮换窗口位置(交换位置)。
记忆法: Ctrl+w r = rotate,轮换窗口。
Ctrl+w r
Ctrl+w R (rotate the other way)
Ctrl+w T把当前窗口移到一个新 tab 里。
记忆法: Ctrl+w T = 把这个窗口扔到新 Tab。
Ctrl+w T
Ctrl+w _ / Ctrl+w |把当前窗口高度(_)或宽度(|)最大化。
记忆法: _ 横杠 = 高度拉满;| 竖杠 = 宽度拉满。
Ctrl+w _
Ctrl+w |
Ctrl+w p跳到上一个聚焦过的窗口(在两个窗口间来回切)。
记忆法: Ctrl+w p = previous,上一个窗口。
Ctrl+w p
:ls / :buffers列出所有打开的 buffer(含编号)。
记忆法: ls = 跟 shell 一样,列出。
:ls
:buffers
:b <num|name>按编号或文件名(可部分匹配)切换 buffer。
记忆法: b = buffer。
:b 3
:b main.ts
:b# (go to alternate buffer)
:bn / :bp下一个 / 上一个 buffer。
记忆法: bn = next,bp = previous。
:bn
:bp
:bd <num|name>删除(关闭)一个 buffer。
记忆法: bd = buffer delete。
:bd
:bd 3
:bd main.ts
:tabnew [file]新开一个 tab(可带文件名)。
记忆法: tabnew = 新 tab。
:tabnew
:tabnew src/index.ts
:tabn / :tabp下一个 / 上一个 tab。normal 模式下 gt / gT 也可以。
记忆法: tabn = tab 下一个,gt = go tab。
:tabn
:tabp
gt
gT
:tabclose关闭当前 tab。
记忆法: tabclose = 关 tab。
:tabclose
:tabc
:e <file>在当前窗口打开(edit)一个文件。
记忆法: e = edit,打开文件。
:e ~/.vimrc
:e %:h/<Tab> (browse same directory)
Ctrl+^切到 alternate buffer,也就是你来这个文件之前打开的那个文件。两个文件间极速来回。
记忆法: Ctrl+^ = 弹回另一个文件(# buffer)。
Ctrl+^
:b#
:bufdo <cmd>在每个打开的 buffer 上执行一条 Ex 命令(比如对所有文件做替换)。
记忆法: bufdo = 对每个 buffer 都做一遍。
:bufdo %s/foo/bar/ge | update
:bufdo set ff=unix
:windo <cmd>在当前 tab 的每个窗口上执行一条 Ex 命令。
记忆法: windo = 对每个窗口都做一遍。
:windo set scrollbind
:windo diffthis
:tabdo <cmd>在每个 tab 页上执行一条 Ex 命令。
记忆法: tabdo = 对每个 tab 都做一遍。
:tabdo windo set nu
:bufdo bd / :%bd一次关掉所有 buffer。:%bd 之后再 Ctrl+^ Ctrl+w o,是常见的"只留当前文件"组合。
记忆法: %bd = 删掉所有 buffer(% 范围覆盖全部)。
:%bd
:%bd | e# (keep current, close rest)
:sb <num|name>在新分屏里打开某个 buffer,而不是替换当前窗口。
记忆法: sb = split + buffer,分屏打开。
:sb 3
:vert sb main.ts (vertical split buffer)
q<letter>开始录制宏到寄存器 <letter>。再按一次 q 停止录制。
记忆法: q = 快速录制宏。
qa (start recording into a)
qa...q (record and stop)
@<letter>回放寄存器 <letter> 里的宏。
记忆法: @ = 执行这个寄存器里的内容。
@a
100@a (repeat macro a 100 times)
@@重复执行刚刚那个宏(不用记字母)。
记忆法: @@ = 上一个宏再来一次。
@@
50@@
:let @a = "..."手动给寄存器赋值,不用录制。改宏的时候很有用。
记忆法: let @a = "..." 直接写寄存器 a。
:let @a = "ihello\<Esc>"
qA (append to macro)录到大写寄存器,会把新动作追加到已有宏后面,而不是覆盖。
记忆法: 大写 q 寄存器 = 接着往宏后面录。
qA (append to macro a)
qA...q
Q (replay last @)在较新的 vim/neovim 里,Q 重放上次用过的寄存器宏(类似 @@)。旧的 Ex 模式含义已被改掉。
记忆法: Q = 重放上一个宏(较新默认)。
Q
:normal @a (over range)一次性把宏应用到一段行上(不用数重复次数)。
记忆法: :<范围>normal @a = 对范围内每行跑一遍宏 a。
:5,20normal @a
:'<,'>normal @a
:let @A .= "..."在命令行往寄存器追加内容(.= 是拼接),用来微调录好的宏。
记忆法: .= 拼接;@A 是寄存器 a 的追加写法。
:let @a .= "j"
:let @q = "0" . @q
zo展开光标下的折叠。
记忆法: z + o = open,打开一个折叠。
zo
zc合上光标下的折叠。
记忆法: z + c = close,合上折叠。
zc
za切换折叠状态(关的就开,开的就关)。
记忆法: a = alternate 切换。
za
zR展开当前 buffer 的所有折叠。
记忆法: 大写 R = Reveal 全部展开。
zR
zM关闭所有折叠(折最狠)。
记忆法: 大写 M = Maximum,折最大化。
zM
:set fdm=<method>选择折叠方法:manual / indent / marker / syntax / expr / diff。
记忆法: fdm = foldmethod,折叠方式。
:set fdm=indent
:set fdm=marker
:set fdm=syntax
zf<motion>在 motion 范围手动创建一个折叠(只在 fdm=manual 下有效)。
记忆法: zf = fold form,创建折叠。
zf3j (fold current + 3 lines below)
zfap (fold a paragraph)
zd / zE删除光标下的折叠(zd)/ 清掉 buffer 里所有折叠(zE)。仅对手动折叠有效。
记忆法: zd = 删一个折叠,zE = 清掉全部折叠。
zd
zE
zj / zk跳到下一个折叠的开头(zj)/ 上一个折叠的结尾(zk)。
记忆法: z + j/k = 在折叠之间移动,方向感和 j/k 一致。
zj
zk
zr / zmzr 把折叠级别减一(多展开一层),zm 加一(多合上一层)。
记忆法: zr = reduce 少折一层,zm = more 多折一层。
zr
zm
zv只展开到能看见光标所在行所需的那几层折叠。
记忆法: zv = view,刚好露出光标行。
zv
zi对整个 buffer 开 / 关折叠功能(切换 foldenable)。
记忆法: zi = invert,整体开关折叠。
zi
How do I exit vim?先按 Esc 回到 normal 模式,再敲 :q 退出。有改动没保存就用 :wq(保存退出)或 :q!(不要这些改动直接退)。
记忆法: Esc + 冒号 = 出门。q = quit,q! = 强退。
:q
:wq
:q!
ZZ (= :wq)
ZQ (= :q!)
Pasting from clipboard mangles indentationvim 会对你打字的内容自动缩进,从系统粘代码进来就会缩进套娃。粘之前 :set paste,粘完 :set nopaste。
记忆法: :set paste = "我不是在打字,是塞原始字节进来"。
:set paste
(paste your code)
:set nopaste
(better:) :set pastetoggle=<F2>
How do I undo? Where did Ctrl+z go?normal 模式按 u 撤销,Ctrl+r 重做。Ctrl+z 是把 vim 挂到后台(用 fg 回来),不是撤销!
记忆法: u = undo(不是 Ctrl+z)。vim 比 Win/Mac 的 Ctrl+z 早多了。
u
Ctrl+r
:earlier 5m (undo back to 5 minutes ago)
:later 5m
Search keeps highlighting after I find it是 hlsearch 一直亮。:noh 清一次就好;可以把 <leader>h 映射成它,日常少烦躁。
记忆法: noh = no highlight,常见 .vimrc 配置。
:noh
nnoremap <leader>h :noh<CR>
"E37: No write since last change"切 buffer 或退出时改动没保存。:w 保存,:e! / :q! 强制丢弃,或者 :set hidden 允许后台 buffer 带未保存改动。
记忆法: E37 = 要么先存要么加 ! 强干。
:w
:q!
:set hidden
"E37: No write since last change" but I already saved!你大概按了 Ctrl+s,在很多终端里这是 XOFF(冻结终端),vim 根本没收到这次保存。用 :w,如果终端死了用 Ctrl+q 解冻。
记忆法: Ctrl+s = 冻结终端(XOFF),Ctrl+q = 解冻(XON)。
:w
stty -ixon (disable terminal flow control)
I opened a file with vim but it is read-only要么 vim -R 打开的,要么文件属于 root。变通::w !sudo tee % > /dev/null 通过 sudo 保存;或 :set noreadonly 后 :w! 强存(前提你有权限)。
记忆法: sudo-tee 套路 = 把 buffer 通过 sudo tee 写回文件。
:w !sudo tee % > /dev/null
:set noreadonly | w!
Vim "started in REPLACE mode" / weird overwriting可能按了 Caps Lock + a 或 Insert 键两下进了 replace 模式。Esc + i 回到正常 insert。:set showmode 打开,让你能一眼看到当前模式。
记忆法: 看状态栏,vim 会显示 -- INSERT -- / -- REPLACE -- / -- VISUAL --。
Esc i
:set showmode
Why does dd "yank" instead of just deleting?vim 里的 delete 其实就是剪切,会把内容放进默认寄存器。想"真删不剪"用黑洞寄存器:"_dd。
记忆法: "_ + d = 扔了它,不污染寄存器。
"_dd
"_x
nnoremap <leader>d "_d (map <leader>d to black-hole delete)
Swap file warning: ".file.swp" already exists别的 vim 在改同一个文件,或者上次崩了。按 R 恢复,D 删 swap,Q 退出。确认没别的进程的话,ls -la .file.swp 看完手动删掉。
记忆法: R = 恢复,D = 删 swap,Q = 退出,A = 放弃。
(R)ecover
(D)elete
rm .myfile.swp
I hit Ctrl+s and the whole terminal frozeCtrl+s 发的是 XOFF,会冻结终端输出(vim 看着死了其实没事)。按 Ctrl+q(XON)解冻。在 shell rc 里加 stty -ixon 可以彻底关掉这个行为。
记忆法: Ctrl+s 冻结(XOFF),Ctrl+q 解冻(XON)。
Ctrl+q
stty -ixon
I typed :W or :Q and got "E492: Not an editor command"Shift 按久了,:W 和 :Q 不是命令。用小写 :w 和 :q。很多人会在 vimrc 里加 command! W w 和 command! Q q 来兜底这个手滑。
记忆法: 命令是小写::w :q :wq,不是 :W :Q。
:w
:q
command! W w
My arrow keys insert letters like A B C D终端模式不对(或 vi 兼容模式)会把方向键发成原始转义码。确认 vimrc 里有 set nocompatible,并尽量用真正的 vim 而不是裸 vi。
记忆法: set nocompatible 能修掉大多数"方向键打出字母"的怪事。
set nocompatible
(or just use hjkl 😄)
I pasted code and indentation exploded into a staircaseautoindent 会在上一行基础上再缩进每一行粘进来的代码,越缩越深。先 :set paste,粘完 :set nopaste。或者直接用系统剪贴板 "+p,它按原样粘不触发这个问题。
记忆法: 粘前 :set paste,或直接用 "+p 原样粘。
:set paste
"+p
:set nopaste
I want to undo ALL my changes since opening the file用 :e! 从磁盘重新读取文件,丢掉所有未保存的改动。(u 一次只退一步,:e! 直接回到已保存的版本。)
记忆法: :e! = 重新打开,丢掉未保存改动。
:e!
:edit!
How do I see line numbers / relative line numbers?:set number 显示绝对行号,:set relativenumber 显示相对光标的距离(一眼看出 5j / 12k 要走几行)。两个一起开就是混合行号。
记忆法: number = 绝对,relativenumber = 相对距离。
:set number
:set relativenumber
:set nu rnu
I selected text but Ctrl+c / Ctrl+v does not copy to other appsvim 有自己的寄存器,系统剪贴板是 + 寄存器。用 "+y(整行 "+yy)复制再去别处粘;从外面粘进 vim 用 "+p。需要 vim 带 +clipboard(:version 里查)。
记忆法: 系统剪贴板 = "+ 寄存器,不是默认寄存器。
"+yy
"+p
:version (look for +clipboard)
My search is case-sensitive (or annoyingly case-insensitive):set ignorecase 让搜索忽略大小写,再加 :set smartcase,查询里出现大写就自动区分大小写。临时控制可在模式后加 \c(忽略)或 \C(区分)。
记忆法: ignorecase + smartcase 是黄金组合;\c / \C 单次覆盖。
:set ignorecase smartcase
/Foo\C
/foo\c
I keep landing in Ex mode with a colon prompt that will not leave你按了 Q(旧绑定)进了 Ex 模式。输入 visual 回车(或 :vi)回到 normal 模式。很多配置会重映射 Q 来避开这个坑。
记忆法: 逃离 Ex 模式:输入 :vi(或 visual)回车。
:vi
visual<CR>
给真正在终端里过日子的人写的 vim 速查表。122 条命令,分 11 类: 模式(normal / insert / visual / command / replace),移动(hjkl、 w/b/e、gg/G、0/^/$、按段按句跳、半屏全屏滚、屏内定位、行内 f/F/t/T 找字符、% 跳括号、跳转历史 Ctrl+o/i),编辑(i/a/o/O、 x/r/s、d/c/y + motion、p/P、u/Ctrl+r、神奇的点命令 .、缩进、大 小写切换、合行 J、文本对象 di/da/ci/ca),搜索与替换(/、?、 n/N、* #、:s 和 :%s 加 g/c 标志和行范围),寄存器("ay "ap、系 统剪贴板 "+、X11 PRIMARY 选区 "*、黑洞寄存器 "_、只装 yank 的 0 号寄存器、:reg),标记(ma 'a `a :marks '' :delmarks),分屏 与窗口(:sp :vsp、Ctrl+w h/j/k/l、Ctrl+w =、Ctrl+w + 和 >、 Ctrl+w o 和 q),buffer 与 tab(:ls :b :bn :bp :bd、:tabnew :tabn :tabp),宏(qa、@a、@@、:let @a = …),折叠(zo zc za zR zM zf、foldmethod),以及著名的"怎么退出 vim?"踩坑分类(粘贴变 形 → :set paste;Ctrl+s 冻终端;E37 报错;dd 不是删而是剪带来 的坑和黑洞寄存器解法;swap 文件恢复;莫名进了 replace 模式)。 每条都给命令、中英说明、一行记忆法(让你真的记得住),还有一 两个能直接拷贝的真实例子(每条旁边有复制按钮)。搜索框跨命令 /说明/记忆法/例子四个字段实时过滤,搜"剪贴板"就能命中 "+ 寄存器那条。点分类胶囊一键缩小范围。中英双语,中文是认真写 的不是机翻,纯浏览器跑,不追踪不弹广告。配合 git 速查 / 正则 速查 / docker 速查 / kubectl 速查 一起用,把开发者每周都要 Google 的那点语法都收齐。
把内容粘贴或拖入工具面板。
点击按钮,在浏览器内本地处理,文件不上传。
一键复制结果或下载到本地。
适合穿插在写代码、查问题、做 Review、上线前的小任务里。
这些入口会把当前任务接到更完整的工具链里。
你敲了 git commit 没带 -m,现在一个空 buffer 隔着 SSH 盯着你。按 i 打一行信息,Esc,再 :wq 回车就完事。要是想取消,:q! 一退 git 就把这次提交也撤了。在本表里搜「退出 vim」还能顺手记下 ZZ 和 ZQ,这两个键能省掉你后半夜回来翻表的次数。
你 SSH 上机器打开 /etc/nginx/nginx.conf,按 "+y 却毫无反应,因为系统自带 vim 是 -clipboard 编译的。筛到「寄存器」分类,用 yy 复制到无名寄存器,移动光标,再 p。想把一段配置弄回笔记本,先用 V 行选再 yank,靠终端鼠标选中复制兜底。本表剪贴板那条把 +clipboard 检查和 OSC-52 备用方案都讲清楚了。
别手动改 40 次。用 /oldName 跳到第一处,cw 改掉打 newName,Esc。后面每碰到一处按一下 . 就重放整次修改。想一把梭,:%s/oldName/newName/gc 全文替换,c 标志会在这 40 处逐个问你 y/n,绝不会误伤你本想留下的子串。
每行都要去掉时间戳再补个逗号。先录一遍:qa,在第一行做完编辑,q 停。然后 199@a 一口气往下重放整个文件。在本表搜「宏」能拿到 qa / @a / @@ 和 :let @a 改宏的技巧(某一键录错了不用重录),比手动改 200 次快太多。
改了没存就按 :q,看到「E37」就慌,那不是你弄坏了,加个 ! 写成 :q! 丢弃,或用 :wq 存了再退。
从浏览器粘代码前忘了 :set paste,自动缩进把每行越推越右;粘前 :set paste,粘完 :set nopaste。
以为 "+y 到处都能用,先跑 vim --version | grep clipboard 查;-clipboard 那版会悄无声息地什么都不干,复制就白做了。
这份速查表是纯静态参考,完全在你浏览器里跑。你搜什么、筛哪个分类都不会离开本页,没有后端请求,不记录你查了什么,也不会写进 URL。页面加载完后断网也能继续看。
做你这行的人, 还会一起用这些。