【Vim命令⼤全】史上最全的Vim命令
曾经使⽤了两年多的Vim,⼿册也翻过⼀遍。虽然现在不怎么⽤vim了,曾经的笔记还是贴出来,与喜欢vim的朋友分享。
vim是我最喜欢的编辑器,也是linux下第⼆强⼤的编辑器。虽然emacs是公认的世界第⼀,我认为使⽤emacs并没有使⽤vi进⾏编辑来得⾼效。如果是初学vi,运⾏⼀下vimtutor是个聪明的决定。(如果你的系统环境不是中⽂,⽽你想使⽤中⽂的vimtutor,就运⾏vimtutor zh)
正常模式:可以使⽤快捷键命令,或按:输⼊命令⾏。
插⼊模式:可以输⼊⽂本,在正常模式下,按i、a、o等都可以进⼊插⼊模式。
可视模式:正常模式下按v可以进⼊可视模式,在可视模式下,移动光标可以选择⽂本。按V进⼊可视⾏模式,总是整⾏整⾏的选中。ctrl+v进⼊可视块模式。
替换模式:正常模式下,按R进⼊。
vim -c cmd file: 在打开⽂件前,先执⾏指定的命令;
vim -r file: 恢复上次异常退出的⽂件;
vim -R file: 以只读的⽅式打开⽂件,但可以强制保存;
vim -M file: 以只读的⽅式打开⽂件,不可以强制保存;
vim -y num file: 将编辑窗⼝的⼤⼩设为num⾏;
vim + file: 从⽂件的末尾开始;
vim +num file: 从第num⾏开始;
vim +/string file: 打开file,并将光标停留在第⼀个到的string上。
vim --remote file: ⽤已有的vim进程打开指定的⽂件。如果你不想启⽤多个vim会话,这个很有⽤。但要注意,如果你⽤vim,会寻名叫VIM的服务器;如果你已经有⼀个gvim在运⾏了,你可以⽤gvim --remote file在已有的gvim中打开⽂件。
:e file --关闭当前编辑的⽂件,并开启新的⽂件。如果对当前⽂件的修改未保存,vi会警告。
:e! file --放弃对当前⽂件的修改,编辑新的⽂件。
:e+file -- 开始新的⽂件,并从⽂件尾开始编辑。
:e+n file -- 开始新的⽂件,并从第n⾏开始编辑。
:enew --编译⼀个未命名的新⽂档。(CTRL-W n)
:e -- 重新加载当前⽂档。
:e! -- 重新加载当前⽂档,并丢弃已做的改动。
:e#或ctrl+^ -- 回到刚才编辑的⽂件,很实⽤。
:f或ctrl+g -- 显⽰⽂档名,是否修改,和光标位置。
:f filename -- 改变编辑的⽂件名,这时再保存相当于另存为。
gf -- 打开以光标所在字符串为⽂件名的⽂件。
:w -- 保存修改。
:n1,n2w filename -- 选择性保存从某n1⾏到另n2⾏的内容。
:wq -- 保存并退出。
ZZ -- 保存并退出。
:x -- 保存并退出。
:q[uit] ——退出当前窗⼝。(CTRL-W q或CTRL-W CTRL-Q)
:saveas newfilename -- 另存为
:browse e -- 会打开⼀个⽂件浏览器让你选择要编辑的⽂件。如果是终端中,则会打开netrw的⽂件浏览窗⼝;如果是gvim,则会打开⼀个图形界⾯的浏览窗⼝。实际上:browse后可以跟任何编辑⽂档的命令,如sp等。⽤browse打开的起始⽬录可以由browsedir来设置:
:set browsedir=last -- ⽤上次访问过的⽬录(默认);
:set browsedir=buffer -- ⽤当前⽂件所在⽬录;
:set browsedir=current -- ⽤当前⼯作⽬录;
:Sex -- ⽔平分割⼀个窗⼝,浏览⽂件系统;
:Vex -- 垂直分割⼀个窗⼝,浏览⽂件系统;
以下移动都是在normal模式下。
h或退格: 左移⼀个字符;
l或空格: 右移⼀个字符;
j: 下移⼀⾏;
k: 上移⼀⾏;
gj: 移动到⼀段内的下⼀⾏;
gk: 移动到⼀段内的上⼀⾏;
+或Enter: 把光标移⾄下⼀⾏第⼀个⾮空⽩字符。
e: 前移⼀个单词,光标停在下⼀个单词末尾;
linux的vi编辑器命令E: 移动到下⼀个单词末尾,如果词尾有标点,则移动到标点;
b: 后移⼀个单词,光标停在上⼀个单词开头;
B: 移动到上⼀个单词开头,忽略⼀些标点;
ge: 后移⼀个单词,光标停在上⼀个单词末尾;
gE: 同ge,不过‘单词’包含单词相邻的标点。
(: 前移1句。
): 后移1句。
{: 前移1段。
}: 后移1段。
fc: 把光标移到同⼀⾏的下⼀个c字符处
Fc: 把光标移到同⼀⾏的上⼀个c字符处
tc: 把光标移到同⼀⾏的下⼀个c字符前
Tc: 把光标移到同⼀⾏的上⼀个c字符后
;
: 配合f & t使⽤,重复⼀次
,: 配合f & t使⽤,反向重复⼀次
上⾯的操作都可以配合n使⽤,⽐如在正常模式(下⾯会讲到)下输⼊3h,则光标向左移动3个字符。
0: 移动到⾏⾸。
g0: 移到光标所在屏幕⾏⾏⾸。
^: 移动到本⾏第⼀个⾮空⽩字符。
g^: 同^,但是移动到当前屏幕⾏第⼀个⾮空字符处。
$: 移动到⾏尾。
g$: 移动光标所在屏幕⾏⾏尾。
n|: 把光标移到递n列上。
nG: 到⽂件第n⾏。
:
n<cr> 移动到第n⾏。
:$<cr> 移动到最后⼀⾏。
H: 把光标移到屏幕最顶端⼀⾏。
M: 把光标移到屏幕中间⼀⾏。
L: 把光标移到屏幕最底端⼀⾏。
gg: 到⽂件头部。
G: 到⽂件尾部。
ctrl+f: 下翻⼀屏。
ctrl+b: 上翻⼀屏。
ctrl+d: 下翻半屏。
ctrl+u: 上翻半屏。
ctrl+e: 向下滚动⼀⾏。
ctrl+y: 向上滚动⼀⾏。
n%: 到⽂件n%的位置。
zz: 将当前⾏移动到屏幕中央。
zt: 将当前⾏移动到屏幕顶端。
zb: 将当前⾏移动到屏幕底端。
使⽤标记可以快速移动。到达标记后,可以⽤Ctrl+o返回原来的位置。 Ctrl+o和Ctrl+i 很像浏览器上的后退和前进。
m{a-z}: 标记光标所在位置,局部标记,只⽤于当前⽂件。
m{A-Z}: 标记光标所在位置,全局标记。标记之后,退出Vim,重新启动,标记仍然有效。
`{a-z}: 移动到标记位置。
'{a-z}: 移动到标记⾏的⾏⾸。
`{0-9}:回到上[2-10]次关闭vim时最后离开的位置。
``: 移动到上次编辑的位置。''也可以,不过``精确到列,⽽''精确到⾏。如果想跳转到更⽼的位置,可以按C-o,跳转到更新的位置⽤C-i。
`": 移动到上次离开的地⽅。
`.: 移动到最后改动的地⽅。
:marks 显⽰所有标记。
:delmarks a b -- 删除标记a和b。
:delmarks a-c -- 删除标记a、b和c。
:delmarks a c-f -- 删除标记a、c、d、e、f。
:delmarks! -- 删除当前缓冲区的所有标记。
时⾮常有⽤,如30i+<esc>就插⼊了36个+组成的分割线。
I: 在当前⾏第⼀个⾮空字符前插⼊;
gI: 在当前⾏第⼀列插⼊;
a: 在光标后插⼊;
A: 在当前⾏最后插⼊;
o: 在下⾯新建⼀⾏插⼊;
O: 在上⾯新建⼀⾏插⼊;
:r filename在当前位置插⼊另⼀个⽂件的内容。
:[n]r filename在第n⾏插⼊另⼀个⽂件的内容。
:r !date 在光标处插⼊当前⽇期与时间。同理,:r !command可以将其它shell命令的输出插⼊当前⽂档。
c[n]w: 改写光标后1(n)个词。
c[n]l: 改写光标后n个字母。
c[n]h: 改写光标前n个字母。
[n]cc: 修改当前[n]⾏。
[n]s: 以输⼊的⽂本替代光标之后1(n)个字符,相当于c[n]l。
[n]S: 删除指定数⽬的⾏,并以所输⼊⽂本代替之。
注意,类似cnw,dnw,ynw的形式同样可以写为ncw,ndw,nyw。
[n]x: 剪切光标右边n个字符,相当于d[n]l。
[n]X: 剪切光标左边n个字符,相当于d[n]h。
y: 复制在可视模式下选中的⽂本。
yy or Y: 复制整⾏⽂本。
y[n]w: 复制⼀(n)个词。
y[n]l: 复制光标右边1(n)个字符。
y[n]h: 复制光标左边1(n)个字符。
y$: 从光标当前位置复制到⾏尾。
y0: 从光标当前位置复制到⾏⾸。
:m,ny<cr> 复制m⾏到n⾏的内容。
y1G或ygg: 复制光标以上的所有⾏。
yG: 复制光标以下的所有⾏。
yaw和yas:复制⼀个词和复制⼀个句⼦,即使光标不在词⾸和句⾸也没关系。
d: 删除(剪切)在可视模式下选中的⽂本。
d$ or D: 删除(剪切)当前位置到⾏尾的内容。
d[n]w: 删除(剪切)1(n)个单词
d[n]l: 删除(剪切)光标右边1(n)个字符。
d[n]h: 删除(剪切)光标左边1(n)个字符。
d0: 删除(剪切)当前位置到⾏⾸的内容
[n] dd: 删除(剪切)1(n)⾏。
:m,nd<cr> 剪切m⾏到n⾏的内容。
d1G或dgg: 剪切光标以上的所有⾏。
dG: 剪切光标以下的所有⾏。
daw和das:剪切⼀个词和剪切⼀个句⼦,即使光标不在词⾸和句⾸也没关系。
d/f<cr>:这是⼀个⽐较⾼级的组合命令,它将删除当前位置到下⼀个f之间的内容。
p: 在光标之后粘贴。
P: 在光标之前粘贴。
aw:⼀个词
as:⼀句。
ap:⼀段。
ab:⼀块(包含在圆括号中的)。
y, d, c, v都可以跟⽂本对象。
a-z:都可以⽤作寄存器名。"ayy把当前⾏的内容放⼊a寄存器。
A-Z:⽤⼤写字母索引寄存器,可以在寄存器中追加内容。如"Ayy把当前⾏的内容追加到a寄存器中。
:reg 显⽰所有寄存器的内容。
"":不加寄存器索引时,默认使⽤的寄存器。
"*:当前选择缓冲区,"*yy把当前⾏的内容放⼊当前选择缓冲区。
"+:系统剪贴板。"+yy把当前⾏的内容放⼊系统剪贴板。
/pattern/-number: 将光标停在包含pattern的⾏前⾯第number⾏上。
n: 向后查下⼀个。
N: 向前查下⼀个。
可以⽤grep或vimgrep查⼀个模式都在哪些地⽅出现过,
其中:grep是调⽤外部的grep程序,⽽:vimgrep是vim⾃⼰的查算法。
⽤法为: :vim[grep]/pattern/[g] [j] files
g的含义是如果⼀个模式在⼀⾏中多次出现,则这⼀⾏也在结果中多次出现。
j的含义是grep结束后,结果停在第j项,默认是停在第⼀项。
vimgrep前⾯可以加数字限定搜索结果的上限,如
:1vim/pattern/ % 只查那个模式在本⽂件中的第⼀个出现。
其实vimgrep在读纯⽂本电⼦书时特别有⽤,可以⽣成导航的⽬录。
⽐如电⼦书中每⼀节的标题形式为:n. xxxx。你就可以这样:
:vim/^d{1,}./ %
然后⽤:cw或:copen查看结果,可以⽤C-w H把quickfix窗⼝移到左侧,
就更像个⽬录了。
:s/old/new - ⽤new替换当前⾏第⼀个old。
:s/old/new/g - ⽤new替换当前⾏所有的old。
:n1,n2s/old/new/g - ⽤new替换⽂件n1⾏到n2⾏所有的old。
:%s/old/new/g - ⽤new替换⽂件中所有的old。
:%s/^/xxx/g - 在每⼀⾏的⾏⾸插⼊xxx,^表⽰⾏⾸。
:%s/$/xxx/g - 在每⼀⾏的⾏尾插⼊xxx,$表⽰⾏尾。
所有替换命令末尾加上c,每个替换都将需要⽤户确认。如:%s/old/new/gc,加上i则忽略⼤⼩写(ignore)。
还有⼀种⽐替换更灵活的⽅式,它是匹配到某个模式后执⾏某种命令,
语法为 :[range]g/pattern/command
例如 :%g/^ xyz/normal dd。
表⽰对于以⼀个空格和xyz开头的⾏执⾏normal模式下的dd命令。
关于range的规定为:
如果不指定range,则表⽰当前⾏。
m,n: 从m⾏到n⾏。
0: 最开始⼀⾏(可能是这样)。
$: 最后⼀⾏
.: 当前⾏
%: 所有⾏
⾼级的查替换就要⽤到正则表达式。
\d: 表⽰⼗进制数(我猜的)
\s: 表⽰空格
\S: ⾮空字符
\a: 英⽂字母
\|: 表⽰或
\.: 表⽰.
{m,n}: 表⽰m到n个字符。这要和 \s与\a等连⽤,如 \a\{m,n} 表⽰m 到n个英⽂字母。
{m,}: 表⽰m到⽆限多个字符。
**: 当前⽬录下的所有⼦⽬录。
:help pattern得到更多帮助。
<< 向左缩进⼀个shiftwidth
>> 向右缩进⼀个shiftwidth
:
ce(nter) 本⾏⽂字居中
:le(ft) 本⾏⽂字靠左
:ri(ght) 本⾏⽂字靠右
gq 对选中的⽂字重排,即对过长的⽂字进⾏断⾏
gqq 重排当前⾏
gqnq 重排n⾏
gqQ 重排当前段对⽂章末尾
J 拼接当前⾏和下⼀⾏
gJ 同J,不过合并后不留空格。
:set spell-开启拼写检查功能
:set nospell-关闭拼写检查功能
]
s-移到下⼀个拼写错误的单词
[s-作⽤与上⼀命令类似,但它是从相反⽅向进⾏搜索
z=-显⽰⼀个有关拼写错误单词的列表,可从中选择
zg-告诉拼写检查器该单词是拼写正确的
zw-与上⼀命令相反,告诉拼写检查器该单词是拼写错误的
g ^g可以统计⽂档字符数,⾏数。将光标放在最后⼀个字符上,⽤字符数减去⾏数可以粗略统计中⽂⽂档的字数。以上对 Mac 或Unix 的⽂件格式适⽤。如果是 Windows ⽂件格式(即换⾏符有两个字节),字数的统计⽅法为:字符数 - ⾏数 * 2。
我们可以⼀次打开多个⽂件,如
b.
使⽤:next(:n)编辑下⼀个⽂件。
:2n 编辑下2个⽂件。
使⽤:previous或:N编辑上⼀个⽂件。
使⽤:wnext,保存当前⽂件,并编辑下⼀个⽂件。
使⽤:wprevious,保存当前⽂件,并编辑上⼀个⽂件。
使⽤:args 显⽰⽂件列表。
:n filenames或:args filenames 指定新的⽂件列表。
vi -o filenames 在⽔平分割的多个窗⼝中编辑多个⽂件。
vi -O filenames 在垂直分割的多个窗⼝中编辑多个⽂件。
vim -p files: 打开多个⽂件,每个⽂件占⽤⼀个标签页。
:tabe, tabnew -- 如果加⽂件名,就在新的标签中打开这个⽂件,否则打开⼀个空缓冲区。
^w gf -- 在新的标签页⾥打开光标下路径指定的⽂件。
:tabn -- 切换到下⼀个标签。Control + PageDown,也可以。
:
tabp -- 切换到上⼀个标签。Control + PageUp,也可以。
[n] gt -- 切换到下⼀个标签。如果前⾯加了n,就切换到第n个标签。第⼀个标签的序号就是1。
:tab split -- 将当前缓冲区的内容在新页签中打开。
:tabc[lose] -- 关闭当前的标签页。
:tabo[nly] -- 关闭其它的标签页。
:tabs -- 列出所有的标签页和它们包含的窗⼝。
:tabm[ove] [N] -- 移动标签页,移动到第N个标签页之后。如tabm 0当前标签页,就会变成第⼀个标签页。
:buffers或:ls或:files 显⽰缓冲区列表。
ctrl+^:在最近两个缓冲区间切换。
:bn -- 下⼀个缓冲区。
:bp -- 上⼀个缓冲区。
:bl -- 最后⼀个缓冲区。
:b[n]或:[n]b -- 切换到第n个缓冲区。
:nbw(ipeout) -- 彻底删除第n个缓冲区。
:nbd(elete) -- 删除第n个缓冲区,并未真正删除,还在unlisted列表中。
:ba[ll] -- 把所有的缓冲区在当前页中打开,每个缓冲区占⼀个窗⼝。
vim -o file1 file2:⽔平分割窗⼝,同时打开file1和file2
vim -O file1 file2:垂直分割窗⼝,同时打开file1和file2
:split(:sp) -- 把当前窗⽔平分割成两个窗⼝。(CTRL-W s 或 CTRL-W CTRL-S) 注意如果在终端下,CTRL-S可能会冻结终端,请按CTRL-Q继续。
:split filename -- ⽔平分割窗⼝,并在新窗⼝中显⽰另⼀个⽂件。
:nsplit(:nsp) -- ⽔平分割出⼀个n⾏⾼的窗⼝。
:[N]new -- ⽔平分割出⼀个N⾏⾼的窗⼝,并编辑⼀个新⽂件。 (CTRL-W n或 CTRL-W CTRL-N)
ctrl+w f --⽔平分割出⼀个窗⼝,并在新窗⼝打开名称为光标所在词的⽂件。
C-w C-^ -- ⽔平分割⼀个窗⼝,打开刚才编辑的⽂件。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。