Vim 备忘单
开始
运动图
▼/▶ Cursor ▽/▷ Target
左右动作
┌───────────── |
├───────────── 0 $ ──────────────┐
│ ┌────────── ^ fe ────────┐ │
│ │ ┌─────── Fo te ───────┐│ │
│ │ │┌────── To 30| ───┐ ││ │
│ │ ││ ┌──── ge w ───┐ │ ││ │
│ │ ││ │ ┌── b e ─┐ │ │ ││ │
│ │ ││ │ │ ┌h l┐ │ │ │ ││ │
▽ ▽ ▽▽ ▽ ▽ ▽▼ ▼▽ ▽ ▽ ▽ ▽▽ ▽
echo "A cheatsheet from quickref.me"
上下动作
- SCREEN 1 START
┌─┬─────────▷ #!/usr/bin/python
│ │ ┌───▷
│ │ │ print("Hello")
│ │ { } ▶ print("Vim")
│ │ │ print("!")
│ │ └─▷
│ │ ┌───┬───▷ print("Welcome")
G gg H M L k j ▶ print("to")
│ │ └─▷ print("quickref.me")
│ │ print("/vim")
│ │
│ └─────▷
│ - SCREEN 1 END
└──────────────▷ print("SCREEN 2")
快捷键大全
h | j | k | l |
方向键 |
<C-u> / <C-d> |
上/下半页 |
<C-b> / <C-f> |
向上/向下翻页 |
字
b / w |
上一个/下一个单词 |
ge / e |
上一个/下一个词尾 |
线
0 (零) / $ |
行开始/结束 |
^ |
行首(非空白) |
特点
Fe / fe |
移至上一个/下一个 e |
To / to |
在上一个/下一个之前/之后移动 o |
| / n| |
转到第一/n 第列 |
文档
gg / G |
第一行/最后一行 |
:n | nG |
去线 n |
} / { |
下一个/上一个空行 |
窗口
H / M / L |
上/中/下屏幕 |
zt / zz / zb |
这条线的顶部/中心/底部 |
插入模式
i / a |
在光标前/后插入 |
I / A |
插入行首/行尾 |
o / O (字母) |
在下方/上方插入新行 |
s / S |
删除字符/行并插入 |
C |
更改为行尾 |
gi |
在最后一个插入点插入 |
Esc | <C-[> |
退出插入模式 |
保存和退出
:w |
节省 |
:q |
关闭文件 |
:wq | :x | ZZ |
保存并退出 |
:wqa |
保存并退出所有文件 |
:q! | ZQ |
强制退出 |
:qa |
关闭所有文件 |
:qa! |
强制退出所有文件 |
:w new.txt |
写给 new.txt |
:sav new.txt |
保存和编辑 new.txt |
:w !sudo tee % |
写入只读文件 |
正常模式
r |
替换一个字符 |
R |
进入替换模式 |
u / 3u |
撤消更改1 /3 次数 |
U |
在一行上撤消更改 |
J |
加入下一行 |
<C-r> / 5<C-r> |
重做更改1 /5 次数 |
剪切和粘贴
x |
删除字符(剪切) |
p / P |
粘贴之后/之前 |
xp |
交换两个字符 |
D |
删除到行尾(剪切) |
dw |
删除单词(剪切) |
dd |
删除线(剪切) |
ddp |
交换两行 |
yy |
扬克线(复印) |
"*p | "+p |
从系统剪贴板粘贴 |
"*y | "+y |
粘贴到系统剪贴板 |
在视觉模式
d | x |
删除选择 (剪切) |
s |
替换选择 |
y |
Yank 选择(复制) |
重复
. |
重复上一个命令 |
; |
重复最近的f , t ,F 或T |
, |
重复上次的f ,t ,F 或T 逆转 |
& |
最后重复 :s |
@: |
重复命令行命令 |
视觉模式
v |
进入视觉模式 |
V |
进入视线模式 |
<C-v> |
进入视觉块模式 |
ggVG |
选择所有文本 |
> / < |
向右/向左移动文本 |
宏
qi |
录制宏 i |
q |
停止录制宏 |
@i |
运行宏 i |
7@i |
运行宏i 7 次 |
@@ |
重复上一个宏 |
Vim 操作符
可用的运算符
d |
删除 |
y |
扬克(复制) |
c |
更改(删除然后插入) |
p |
粘贴 |
= |
格式代码 |
g~ |
切换案例 |
gU |
大写 |
gu |
小写 |
> |
缩进权 |
< |
向左缩进 |
! |
通过外部程序过滤 |
例子
|
删除当前行 |
|
删除两行 |
|
删除到下一个单词 |
|
删除到词首 |
|
删除直到a 字符 |
|
删除直到 hello |
|
更改当前行 |
|
复制当前行 |
|
缩进 2 行 |
gg |
删除一个完整的文档 |
gg |
缩进完整的文档 |
gg |
复制整个文档 |
计数
[count] <operator> <motion>
<operator> [count] <motion>
2 |
删除2 行 |
6 |
复制6 行 |
|
删除3 单词 |
|
5 向下删除行 |
|
4 向上缩进线 |
Vim 文本对象
用法
v |
|
|
Operator(操作符) |
Text object(文本对象) |
在文本块内部或周围使用运算符操作
文本对象
p |
段落 |
w |
单词 |
W |
WORD (由空格包围) |
s |
句子 |
|
[]、() 或 {} 块 |
|
[]、() 或 {} 块 |
|
带引号的字符串 |
b |
一个块 [( |
B |
[{ 中的一个块 |
t |
一个 HTML 标签块 |
看 :help text-objects
删除
diw |
删除内词 |
dis |
删除内句 |
di |
在引号中删除 |
da |
在引号中删除(包括引号) |
dip |
删除一个段落 |
选择
|
选择内引号“ ... ” |
|
选择引号 "..." |
|
选择内括号 [ ... ] |
|
选择括号 [...] |
viw |
选择内词 |
vip |
选择内部段落 |
vipip |
选择更多段落 |
杂项
ciw |
改变内在的话 |
ci |
更改内部引号 |
cit |
更改内部标签 (HTML) |
cip |
更改内部段落 |
yip |
拉取内段 |
ysp |
Yank 段落(包括换行符) |
Vim 多个文件
缓冲器
:e file |
在新缓冲区中编辑文件 |
:bn |
转到下一个缓冲区 |
:bp |
转到上一个缓冲区 |
:bd |
从缓冲区列表中删除文件 |
:b 5 |
打开缓冲区 #5 |
:b file |
按文件转到缓冲区 |
:ls |
列出所有打开的缓冲区 |
:sp file |
打开和拆分窗口 |
:vs file |
打开和垂直拆分窗口 |
:hid |
隐藏此缓冲区 |
:wn |
写入文件并移至下一个 |
:tab ba |
将所有缓冲区编辑为选项卡 |
窗口
<C-w> s |
拆分窗口 |
<C-w> v |
垂直拆分窗口 |
<C-w> w |
切换窗口 |
<C-w> q |
退出窗口 |
<C-w> T |
进入新标签页 |
<C-w> x |
与下一个交换当前 |
<C-w> - / + |
降低/增加高度 |
<C-w> < / > |
减少/增加宽度 |
<C-w> | |
最大宽度 |
<C-w> = |
同样高宽 |
<C-w> h / l |
转到左/右窗口 |
<C-w> j / k |
转到上/下窗口 |
标签
:tabe [file] |
在新选项卡中编辑文件 |
:tabf [file] |
如果在新选项卡中存在则打开 |
:tabc |
关闭当前标签 |
:tabo |
关闭其他标签 |
:tabs |
列出所有 |
:tabr |
转到第一个选项卡 |
:tabl |
转到最后一个选项卡 |
:tabm 0 |
移动到位置 0 |
:tabn |
前往下一个标签 |
:tabp |
前往上一个标签 |
正常模式
gt |
前往下一个标签 |
gT |
前往上一个表亲啊 |
2gt |
前往编号为 2 的标签 |
Vim 搜索和替换
搜索
/foo |
向前搜索 |
/foo\c |
向前搜索(不区分大小写) |
?foo |
向后搜索 |
/\v\d+ |
使用正则表达式搜索 |
n |
下一个匹配的搜索模式 |
N |
上一场匹配 |
* |
向前搜索当前词 |
# |
向后搜索当前词 |
换行
:[range]s/{pattern}/{str}/[flags]
:s/old/new |
先更换 |
:s/old/new/g |
全部替换 |
:s/\vold/new/g |
全部替换为正则表达式 |
:s/old/new/gc |
全部替换(确认) |
:s/old/new/i |
先忽略大小写替换 |
:2,6s/old/new/g |
在行之间替换2 -6 |
#替换文件
:%s/{pattern}/{str}/[flags]
:%s/old/new |
先更换 |
:%s/old/new/g |
全部替换 |
:%s/old/new/gc |
全部替换(确认) |
:%s/old/new/gi |
全部替换(忽略大小写) |
:%s/\vold/new/g |
全部替换为正则表达式 |
范围
% |
整个文件 |
’<,’> |
当前选择 |
5 |
线 5 |
5,10 |
行5 至10 |
$ |
最后一行 |
2,$ |
行2 到最后 |
. |
当前线路 |
,3 |
下一3 行 |
-3, |
前锋3 线 |
全局命令
:[range]g/{pattern}/[command]
:g/foo/d |
删除包含的行 foo |
:g!/foo/d |
删除不包含的行 foo |
:g/^\s*$/d |
删除所有空行 |
:g/foo/t$ |
复制包含foo 到 EOF 的行 |
:g/foo/m$ |
移动包含foo 到 EOF 的行 |
:g/^/m0 |
反转文件 |
:g/^/t. |
复制每一行 |
Inverse :g
:[range]v/{pattern}/[command]
:v/foo/d |
删除不包含foo (也 :g!/foo/d )的行 |
Flags
g |
替换所有出现 |
i |
忽略大小写 |
I |
不要忽略大小写 |
c |
确认每次替换 |
替换表达式(魔术)
& | \0 |
替换为整个匹配 |
\1 ...\9 |
替换为 0-9 组 |
\u |
大写下一个字母 |
\U |
大写以下字符 |
\l |
小写下一个字母 |
\L |
小写以下字符 |
\e |
结束\u , \U ,\l 和\L |
\E |
结束\u , \U ,\l 和\L |
例子
:s/a\|b/xxx\0xxx/g # Modifies "a b" to "xxxaxxx xxxbxxx"
:s/test/\U& file/ # Modifies "test" to "TEST FILE"
:s/\(test\)/\U\1\e file/ # Modifies "test" to "TEST file"
:s/\v([abc])([efg])/\2\1/g # Modifies "af fa bg" to "fa fa gb"
:s/\v\w+/\u\0/g # Modifies "bla bla" to "Bla Bla"
:s/\v([ab])|([cd])/\1x/g # Modifies "a b c d" to "ax bx x x"
:%s/.*/\L&/ # Modifies "HTML" to "html"
:s/\v<(.)(\w*)/\u\1\L\2/g # Make every first letter of a word uppercase
:%s/^\(.*\)\n\1/\1/ # Remove duplicate lines
:%s/<\/\=\(\w\+\)\>/\U&/g # Convert HTML-Tags to uppercase
:g/^pattern/s/$/mytext # Find and append text to the end
:g/pattern/norm! @i # Run a macro on matching lines
/^\(.*\)\(\r\?\n\1\)\+$ # View the duplicates lines
/\v^(.*)(\r?\n\1)+$ # View the duplicates lines (very magic)
:v/./,/./-j # Compress blank lines into a blank line
:g/<p1>/,/<p2>/d # Delete inclusively from <p1> to <p2>
Vimdiff
用法
$ vimdiff file1 file2 [file3]
$ vim -d file1 file2 [file3]
编辑
:[range]diffget [bufspec]
:[range]diffput [bufspec]
do / :diffget |
获得(get)差异 |
dp / :diffput |
区分差异 |
:dif |
重新扫描差异 |
:diffo |
关闭差异模式 |
:1,$+1diffget |
获取所有差异 |
ZQ |
退出而不改变 |
请参阅:范围
折叠
zo / zO |
打开 |
zc / zC |
关闭 |
za / zA |
切换 |
zv |
为这条线打开折叠 |
zM |
关闭所有 |
zR |
全部打开 |
zm |
折叠更多(foldlevel += 1) |
zr |
减少折叠(foldlevel -= 1) |
zx |
更新折叠 |
跳跃
]c |
下一个区别 |
[c |
以前的区别 |
其他
案件
vU |
大写字符 |
vu |
小写字符 |
~ |
切换大小写字符 |
viw U |
大写单词 |
viw u |
小写单词 |
viw ~ |
切换大小写单词 |
VU / gUU |
大写行 |
Vu / guu |
小写行 |
V~ / g~~ |
切换案例行 |
gggUG |
大写所有文本 |
ggguG |
小写所有文本 |
ggg~G |
切换大小写 所有文本 |
跳跃
<C-o> |
返回上一个 |
<C-i> |
直走 |
gf |
转到光标中的文件 |
ga |
显示十六进制、ASCII 值 |
其他命令行
:h |
帮助 打开帮助视图 |
:edit! |
重新加载当前文件 |
:2,8m0 |
移动线2 -8 到0 |
:noh |
清除搜索亮点 |
:sort |
排序线 |
:ter |
打开终端窗口 |
:set paste |
启用插入粘贴子模式 |
:set nopaste |
禁用插入粘贴子模式 |
:cq |
出现错误退出 (中止 Git) |
导航
% |
最近/匹配 {[()]} |
[( | [{ | [< |
上一个( ,{ 或< |
]) | ]{ | ]> |
下一个) ,} 或> |
[m |
上一个方法开始 |
[M |
上一个方法结束 |
柜台
<C-a> |
增加数量 |
<C-x> |
减少数量 |
标签
:tag Classname |
跳转到 Classname 的第一个定义 |
<C-]> |
跳转到定义 |
g] |
查看所有定义 |
<C-t> |
返回上一个标签 |
<C-o> <C-i> |
后退前进 |
:tselect Classname |
查找 Classname 的定义 |
:tjump Classname |
查找类名的定义(自动选择第一个) |
格式化
:ce 8 |
8 列之间的中心线 |
:ri 4 |
在4 列处右对齐行 |
:le |
左对齐线 |
看 :help formatting
分数
`^ |
插入模式下光标的最后位置 |
`. |
当前缓冲区的最后更改 |
`" |
最后退出的当前缓冲区 |
`0 |
在上次编辑的文件中 |
'' |
返回当前缓冲区中跳转的行 |
`` |
返回当前缓冲区中跳转的位置 |
`[ |
到先前更改或猛拉的文本的开头 |
`] |
结束先前更改或猛拉的文本 |
`< |
到最后一个视觉选择的开始 |
`> |
到最后一个视觉选择结束 |
ma |
将此光标位置标记为 a |
`a |
跳转到光标位置 a |
'a |
跳到带有位置的行的开头 a |
d'a |
从当前行删除到标记行 a |
d`a |
从当前位置删除到标记位置 a |
c'a |
将文本从当前行更改为 a |
y`a |
将文本从当前位置拉到 a |
:marks |
列出所有当前标记 |
:delm a |
删除标记 a |
:delm a-d |
删除标记a , b , c ,d |
:delm abc |
删除标记a , b ,c |
计算器
<C-r> = 7*7 |
显示结果 |
<C-r> = 10/2 |
显示结果 |
在 INSERT 模式下执行此操作
shell
:!<shell> |
解释 Shell 命令 |
:r!<shell> |
读入 shell 的输出 |
:r!date |
插入日期 |
:!!date |
用日期替换当前行 |
命令行
<C-r><C-w> |
将当前单词插入命令行 |
<C-r>" |
从“注册”粘贴 |
<C-x><C-f> |
在插入模式下自动完成路径 |
技巧
删除重复行
:sort | %!uniq -u
对文件中的行进行编号
:%!cat -n
将整个文档复制到剪贴板
:%w !pbcopy # Mac OS X
:%w !xclip -i -sel c # GNU/Linux
:%w !xsel -i -b # GNU/Linux
另见
- Devhints (devhints.io)
- Vim 备忘单 (vim.rotrr.com)
- Vim 文档 (vimdoc.sourceforge.net)
- 交互式 Vim 教程 (openvim.com)