VIM cheat sheets
最好的指导资料Vim Tips Wiki
启动
vim -r file
: 恢复上次异常退出的文件;
vim -R file
: 以只读的方式打开文件,但可以强制保存;
vim -M file
: 以只读的方式打开文件,不可以强制保存;
vim + file
: 从文件的末尾开始;
vim +num file
: 从第num行开始;
移动
行移动
H
: 把光标移到屏幕最顶端一行。
M
: 把光标移到屏幕中间一行。
L
: 把光标移到屏幕最底端一行。
0
或^
: 移动到行首。
$
: 移动到行尾。
:set nu
: 开启行号显示
set nonu
: 关闭行号显示
gg
: 跳到第一行
G
:跳到最后一行
nG
或:n
: 跳到第n行
单词移动
+
或Enter
: 把光标移至下一行第一个非空白字符。
-
: 把光标移至上一行第一个非空白字符。
w
: 前移一个单词,光标停在下一个单词开头;
W
: 移动下一个单词开头,但忽略一些标点;
e
: 前移一个单词,光标停在下一个单词末尾;
E
: 移动到下一个单词末尾,如果词尾有标点,则移动到标点;
b
: 后移一个单词,光标停在上一个单词开头;
B
: 移动到上一个单词开头,忽略一些标点;
fa
: 移动到下一个字符a
处
shift+fa
:移动到上一个字符a
处
往右或往左移到下一个指定字母,需要用到前置的forward
按键f和shift-f
,比如往右移到下一个字母 'a' (fa
),往左移到下一个字母 'a' (Fa
)
字符移动
h
或退格
: 左移一个字符;
l
或空格
: 右移一个字符;
j
: 下移一行;
k
: 上移一行;
3l
: 右移3个字符;
3w
: 左移3个字符;
文档操作
:e file
--关闭当前编辑的文件,并开启新的文件。
:e! file
--放弃对当前文件的修改,编辑新的文件。
:e+file
-- 开始新的文件,并从文件尾开始编辑。
:e+n file
-- 开始新的文件,并从第n行开始编辑。
:enew
--编译一个未命名的新文档。(CTRL-W n)
:e
-- 重新加载当前文档。
:e!
-- 重新加载当前文档,并丢弃已做的改动。
:w
-- 保存修改。
:wq
-- 保存并退出。
ZZ
-- 保存并退出。
:x
-- 保存并退出。
:q[uit]
——退出当前窗口。(CTRL-W q
或CTRL-W
CTRL-Q
)
翻页
ctrl+f
: 下翻一屏(forward)。
ctrl+b
: 上翻一屏(back)。
ctrl+d
: 下翻半屏(down)。
ctrl+u
: 上翻半屏(up)。
ctrl+e
: 向下滚动一行。
ctrl+y
: 向上滚动一行。
n%
: 到文件n%的位置。
zz
: 将当前行移动到屏幕中央。
zt
: 将当前行移动到屏幕顶端。
zb
: 将当前行移动到屏幕底端。
插入
i
: 在光标前插入;一个小技巧:按8
,再按i
,进入插入模式,输入=
, 按esc
进入命令模式,就会出现8
个=
。 这在插入分割线时非常有用,如30i+<esc>
就插入了36
个+
组成的分割线。
I
: 在当前行第一个非空字符前插入;
gI
: 在当前行第一列插入;
a
: 在光标后插入;
A
: 在当前行最后插入;
o
: 在下面新建一行插入;
O
: 在上面新建一行插入;
:r filename
在当前位置插入另一个文件的内容。
:[n]r filename
在第n行插入另一个文件的内容。
:r !date
在光标处插入当前日期与时间。同理,
:r !command
可以将其它shell命令的输出插入当前文档。
复制/粘贴/剪切
p
: 在光标之后粘贴。
P
: 在光标之前粘贴。
d$ or D
: 删除(剪切)当前位置到行尾的内容。
d[n]w
: 删除(剪切)1(n)个单词
d0
: 删除(剪切)当前位置到行首的内容
[n] dd
: 删除(剪切)1(n)行。
剪切
首先,在normal
模式下按v
进入visual
模式,使用方向键hjkl
可以选择文字,再按下d
就可以进行剪切。
其他normal
模式下剪切命令:
x
: 将光标所在处的字符进行剪切(删除)
nx
:将光标之后的n的字符进行剪切(删除)
dd
:剪切当前行
ndd
:n
表示大于1
的数字,剪切n
行
D
: 将光标所在处到行尾进行剪切(删除)
dG
:将光标所在行到文章末尾进行剪切(删除)
dw
:从光标处剪切至一个单子/单词的末尾,包括空格
de
:从光标处剪切至一个单子/单词的末尾,不包括空格
d$
:从当前光标剪切到行末
d0
:从当前光标位置(不包括光标位置)剪切之行首
d3l
:从光标位置(包括光标位置)向右剪切3个字符
d5G
:将当前行(包括当前行)至第5行(不包括它)剪切
d3B
:从当前光标位置(不包括光标位置)反向剪切3个单词
dH
:剪切从当前行至所显示屏幕顶行的全部行
dM
:剪切从当前行至命令M所指定行的全部行
dL
:剪切从当前行至所显示屏幕底的全部行
:n1,n2d
: 将n1到n2行内容进行剪切(删除)
复制
首先,在normal
模式下按v
进入自由选取模式,使用方向键hjkl
可以文选中文字,选择需要复制的文字后,按下y
就可以进行复制了。
其他normal
模式下复制命令:
yy
:复制当前行
yiw
:yank inner word 复制当前单词(不含前后空格)
yaw
: yank the current word 复制当前单词(包含前后空格)
ytx
:yank from the current cursor position up to and before the character (til x) 从当前位置复制到x所在的位置为止(不含x)
yfx
:yank from the current cursor position up to and including the character (find x) 从当前位置复制到x所在的位置(包含x)
nyy
:n
表示大于1
的数字,复制n
行
yw
:从光标处复制至一个单子/单词的末尾,包括空格
ye
:从光标处复制至一个单子/单词的末尾,不包括空格
y$
:从当前光标复制到行末
y0
:从当前光标位置(不包括光标位置)复制之行首
y3l
:从光标位置(包括光标位置)向右复制3个字符
y5G
:将当前行(包括当前行)至第5行(不包括它)复制
y3B
:从当前光标位置(不包括光标位置)反向复制3个单词
yw/yb/yy 复制当前单词右侧部分(按一下y再按一下w),复制当前单词左侧部分,复制当前行(按两下y),y是前置键(yank,可以理解为激活复制),紧跟着表示要复制哪一部分。注意y前面还可以加数字,表示操作几次,比如3yw,就会复制3个单词。我就想复制整个单词咋办?要习惯多使用w和b,另外还有一种方便的选中整个单词的方式viw(visual+inner word)。
Copy, cut and paste
选中:
normal
模式按下v
进入visual
模式
viw
: 选中单个单词 visual inner word
V
:选中当前行
- vim 有 12 个粘贴板,分别是
0、1、2、...、9、a、“、+
;用:reg
命令可以查看各个粘贴板里的内容。在 vim 中简单用y
命令只是复制到"
(双引号)粘贴板里,同样用p
命令粘贴的也是这个粘贴板里的内容;- 要将 vim 的内容复制到某个粘贴板,需要先退出编辑模式,再进入命令模式后,选择要复制的内容,然后按
"Ny
(注意带引号)完成复制,其中N
为粘贴板号(注意是按下 双引号 + 粘贴板号 +y
),例如要把内容复制到粘贴板a
,选中内容后按"ay
就可以了,有 两点需要说明一下:
"
号粘贴板(临时粘贴板)比较特殊,直接按y
就复制到这个粘贴板中了,直接按p
就粘贴这个粘贴板中的内容;+
号粘贴板是系统粘贴板,用"+y
将内容复制到该粘贴板后可以使用ctrl+v
将其粘贴到其他文档(如 firefox、gedit)中,同理,要把在其他地方用ctrl+c
或右键复制的内容复制到 vim 中,需要在正常模式下按"+p
;- 要将 vim 某个粘贴板里的内容粘贴进来,需要先退出编辑模式,再在命令模式按
"Np
,其中N
为粘贴板号,如上所述,命令"5p
会将5
号粘贴板里的内容粘贴进来,也可以按"+p
将系统全局粘贴板里的内容粘贴进来。
参考 vim常用复制粘贴命令 这篇文章对vim的复制粘贴有详细深入的讨论
查找/替换
r
: 取代光标所在处的字符
R
: 进入替换模式,类似于 Windows 中的 insert
r
只替换当前光标所在处的字符,命令模式下按r
然后按新的字符。
R
进入替换模式,按 ESC
才能退出。
/something
: 在后面的文本中查找something。
?something
: 在前面的文本中查找something。
%something
: 在全文搜索something。
:n1,n2s/something
: 在第n1到n2行范围内搜索
/pattern/+number
: 将光标停在包含pattern的行后面第number行上。
/pattern/-number
: 将光标停在包含pattern的行前面第number行上。
n
: 向后查找下一个。
N
: 向前查找下一个。
:s/old/new
: 用new替换当前行第一个old。
:s/old/new/g
: 用new替换当前行所有的old。
d
: 表示十进制数
s
: 表示空格
S
: 非空字符
a
: 英文字母
|
: 表示 或
.
: 表示.
{m,n}
: 表示m到n个字符。这要和 s
与a
等连用,如 a{m,n}
表示m
到n
个英文字母。
{m,}
: 表示m到无限多个字符。
**
: 当前目录下的所有子目录。
常见组合需求
先复制一个单词first,再用这个单词替换另一个单词second:
光标放到first的任意位置, 按下yiw
(yank inner word),再把光标导航到要替换掉的second的任意位置, 按下viwp
, 即可完成替换。
Replace a word with yanked text
删除当前单词
光标移到单词的任意位置,按下ciw
在当前单词前/后插入
光标移到单词任意位置,按下bi
,在当前单词前进入插入模式;
光标移到单词任意位置,按下wi
,在当前单词后进入插入模式;
针对双引号内的内容操作
复制引号内容(不含引号): 把光标移到引号内容的任意位置,按下yi“
(yank inner "")
删除引号内容(不含引号): 把光标移到引号内容的任意位置,按下ci“
(yank inner "")
选中引号内容(不含引号): 把光标移到引号内容的任意位置,按下vi“
(yank inner "")
复制一行line1, 然后用line1替换line2,再用line1替换line3
先复制当前行line1: yy
(此时line1被复制到“
默认寄存器)
移动光标到line2
按下 Vp
,使得line2被替换为line1(此时用默认寄存器"
的内容line1替换了line2,并将line2复制到了默认寄存器"
中,并将原来保存在"
中的line1复制到0号寄存器中)
移动光标到line3
按下V"0p
, 使得line3被替换为line1(用0号寄存器中的内容line1替换line3)
Deleting, changing and yanking text copies the affected text to the unnamed register (""). Yanking text also copies the text to register 0 ("0). So the command yiw copies the current word to "" and to "0.
删除、改变或者复制text会将text保存到默认寄存器"
中,复制操作还会把"
中的内容拷贝到0
号寄存器中。
排版
<<
: 向左缩进一个shiftwidth
>>
: 向右缩进一个shiftwidth
:ce(nter)
: 本行文字居中
:le(ft)
:本行文字靠左
:ri(ght)
: 本行文字靠右
编辑多个文件
:next(:n)
:编辑下一个文件。
:previous
或:N
:编辑上一个文件。
:wnext
:保存当前文件,并编辑下一个文件。
:wprevious
:保存当前文件,并编辑上一个文件。
:args
: 显示文件列表。
vi -o filenames
: 在水平分割的多个窗口中编辑多个文件。
vi -O filenames
: 在垂直分割的多个窗口中编辑多个文件。
切换窗口
ctrl+w
: 切换到下一个窗口。或者是ctrl+w w。
ctrl+w p
: 切换到前一个窗口。
快速编辑/撤销/反撤销
~
: 反转光标所在字符的大小写。
r
: 替换光标处的字符,同样支持汉字。
R
: 进入替换模式,按esc
回到正常模式。
[n] u
: 取消一(n)个改动。
:undo 5
: 撤销5个改变。
:undolist
: 你的撤销历史。
ctrl + r
: 重做最后的改动。
U
: 取消当前行中所有的改动。
:earlier 4m
: 回到4分钟前
:later 55s
:前进55秒
查看文件编码
:set fenc
或:set fileencoding
:查看当前文件的编码。
:set ff
:显示当前文件的格式。
:pwd
: 显示vim的工作目录。
:ver
: 显示版本信息。
其他使用技巧
:r filename
: 将指定文件的内容导入到光标所在位置
:r ! command
:将command运行结果导入到光标所在位置
:map 快捷键 触发命令
: 自定义快捷键
:ab old new
: 在编辑时自动替换一些字符
:r ! command
是一个很好用的命令,比如:r !date
可以把当前日期时间快速导入到当前光标位置。
:map 快捷键 触发命令
用于自定义快捷键,在命令模式下,输入“:map ”然后输入“Ctrl+V+P”,会出现“^P”,代表快捷键为“Ctrl+P”。最后一部分触发命令是指按下快捷键后,触发的命令,比如“I#”,这代表快捷方式触发的命令为“I#”,然后按下“ESC”键。含义即为在行首添加“#”井号,快速注释。
连续行注释:n1,n2s/^/#/g
,代表将指定范围内的行首替换为“#”井号。其中,“^”代表行首。
:ab
是编辑时快速替换命令,当你自定义替换字符串后,当你在编辑模式下输入要替换的字符串时,空格或者回车后,这个就字符串就回立即被你定义的新字符串替换掉,很方便。
在线帮助
:h(elp)
:或F1 打开总的帮助。
:help user-manual
: 打开用户手册。命令帮助的格式为:第一行指明怎么使用那个命令; 然后是缩进的一段解释这个命令的作用,然后是进一步的信息。
:helptags somepath
: 为somepath中的文档生成索引。
:helpgrep
: 可以搜索整个帮助文档,匹配的列表显示在quickfix窗口中。
Ctrl+]
: 跳转到tag主题,
Ctrl+t
跳回。
参考列表