VIM常用命令总结

多标签切换网上这类的文章太多了,看上去有点像标题党。我在这里只是想总结一下自己常用的一些,如果有更好的可以随时留言,感激不尽!

 

首先介绍一下 vi/vim是 unix/linux 下极为普遍的一种文本编辑器, 大部分机器上都有 vi 有各种变种, 在不同的机器上常用不同的变种软件 其中 vim 比较好用也用得比较广泛 vim 是 Vi IMproved 的缩写, 表示更好的 vi 本文就说些其中比较有用, 比较常用的命令, 若能熟练运用这些命令, 那么会发现编辑文件很大帮助,尤其是做开发的人员,能快速的提高开发效率。

另附一张图,上面又一些非常常用的命令

说明:

以下的例子中 xxx 表示在命令模式下输入 xxx 并回车

以下的例子中 :xxx 表示在扩展模式下输入 xxx 并回车

小括号中的命令表示相关命令

在编辑模式或可视模式下输入的命令会另外注明

 插入/保存

 

i →在光标前插入

a → 在光标后插入

o → 在当前行后插入一个新行

O → 在当前行前插入一个新行


w → 存盘

x →表示仅在需要时保存

wq→保存并退出

ZZ→不需要输入冒号并回车

saveas <path/to/file> → 另存为 <path/to/file>

e <path/to/file> → 打开一个文件

bn 和 bp → 你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件

qa! → 强行退出所有的正在编辑的文件,就算别的文件有更改。

 

查找

/xxx(?xxx)    表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示向上查找其中xxx可以是正规表达式,关于正规式就不多说了               

                一般来说是区分大小写的, 要想不区分大小写, 那得先输入

                :set ignorecase

                查找到以后, 再输入 n 查找下一个匹配处, 输入 N 反方向查找

*(#)          当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的下(上)

                一个单词 同样, 再输入 n 查找下一个匹配处, 输入 N 反方向查找                

g*(g#)       此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而是匹配包含该单词的所有字符串               

gd              本命令查找与光标所在单词相匹配的单词, 并将光标停留在文档的非注释段中第一次出现这个单词的地方             

%             本命令查找与光标所在处相匹配的反括号, 包括 () [] { }

f(F)x           本命令表示在光标所在行进行查找, 查找光标右(左)方第一个x字符

                找到后:

                输入 ; 表示继续往下找

                输入 , 表示反方向查找

 

 快速移动光标

   在 vi 中, 移动光标和编辑是两件事, 正因为区分开来, 所以可以很方便的进行光标定

位和编辑 因此能更快一点移动光标是很有用的

 

w(e)          移动光标到下一个单词

b             移动光标到上一个单词

 

0             移动光标到本行最开头

^             移动光标到本行最开头的字符处

$             移动光标到本行结尾处

 

H             移动光标到屏幕的首行

M             移动光标到屏幕的中间一行

L             移动光标到屏幕的尾行

gg              移动光标到文档首行

G             移动光标到文档尾行

c-f          (即 ctrl 键与 f 键一同按下) 本命令即 page down

c-b          (即 ctrl 键与 b 键一同按下, 后同) 本命令即 page up

''          此命令相当有用, 它移动光标到上一个标记处, 比如用 gd, * 等查找到某个单词后, 再输入此命令则回到上次停留的位置

'              此命令相当好使, 它移动光标到上一次的修改行

`              此命令相当强大, 它移动光标到上一次的修改点

 

 拷贝, 删除与粘贴

   在 vi 中 y 表示拷贝, d 表示删除, p 表示粘贴 其中拷贝与删除是与光标移动命令

结合的, 看几个例子就能够明白了

x                删当前光标所在的一个字符。

yw              表示拷贝从当前光标到光标所在单词结尾的内容

dw              表示删除从当前光标到光标所在单词结尾的内容

y0              表示拷贝从当前光标到光标所在行首的内容

d0              表示删除从当前光标到光标所在行首的内容

y$              表示拷贝从当前光标到光标所在行尾的内容

d$              表示删除从当前光标到光标所在行尾的内容

yfa          表示拷贝从当前光标到光标后面的第一个a字符之间的内容

dfa          表示删除从当前光标到光标后面的第一个a字符之间的内容

 

特殊地:

yy              表示拷贝光标所在行

dd              表示删除光标所在行

D             表示删除从当前光标到光标所在行尾的内容

关于拷贝, 删除和粘贴的复杂用法与寄存器有关, 可以自行查询

 

 数字与命令

   在 vi 中数字与命令结合往往表示重复进行此命令, 若在扩展模式的开头出现则表示行

号定位 如:

 

5fx          表示查找光标后第5个x字符

5w(e)           移动光标到下五个单词

5yy          表示拷贝光标以下 5 行

5dd          表示删除光标以下 5 行

y2fa          表示拷贝从当前光标到光标后面的第二个a字符之间的内容

:12,24y       表示拷贝第12行到第24行之间的内容

:12,y           表示拷贝第12行到光标所在行之间的内容

:,24y           表示拷贝光标所在行到第24行之间的内容 删除类似

 

 快速输入字符

   在 vi 中, 不要求你输入每一个字符, 可以有很多种方法快速输入一些字符

   使用 linux/unix 的同学一定有一个经验, 在命令行下输入命令时敲入头几个字符再按

TAB 系统就会自动将剩下的字符补齐, 假如有多个匹配则会打印出来 这就是著名的命令

补齐(其实windows中也有文件名补齐功能) vi 中有许多的字符串补齐命令, 非常方便

 

c-p(c-n)        在编辑模式中, 输入几个字符后再输入此命令则 vi 开始向上(下)搜

                索开头与其匹配的单词并补齐, 不断输入此命令则循环查找 此命令

                会在所有在这个 vim 程序中打开的文件中进行匹配

c-x-l           在编辑模式中, 此命令快速补齐整行内容, 但是仅在本窗口中出现的

                文档中进行匹配

c-x-f           在编辑模式中, 这个命令表示补齐文件名 如输入:

                /usr/local/tom 后再输入此命令则它会自动匹配出:

                /usr/local/tomcat/

abbr          即缩写 这是一个宏操作, 可以在编辑模式中用一个缩写代替另一个

                字符串 比如编写java文件的常常输入 Systemoutprintln, 这很

                是麻烦, 所以应该用缩写来减少敲字 可以这么做:

                :abbr sprt Systemoutprintln

                以后在输入sprt后再输入其他非字母符号, 它就会自动扩展为System

                outprintln

 

 替换

   替换是 vi 的强项, 因为可以用正规表达式来匹配字符串以下提供几个例子


:s/aa/bb/g    将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb

:s/\<aa\>/bb/g   将光标所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词

:%s/aa/bb/g     将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb

:12,23s/aa/bb/g 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb

:12,23s/^/#/ 将从12行到23行的行首加入 # 字符

:%s= *$==    将所有行尾多余的空格删除

:g/^\s*$/d    将所有不包含字符(空格也不包含)的空行删除

 

 多文件查找替换

查找命令

vimgrep

vimgrep是vim自带的一个工具,类似于grep的用法就可以实现。语法如下: 

      :vimgrep /{pattern}/[g][j] {file} ...

      简单来讲,就是在路径和文件命符合{file}的所有文件中,查找符合{pattern}的字符串.(查找的结果可以用:copen命令打开quickfix列表查看).
      没有参数g的话,则行只查找一次关键字.反之会查找所有的关键字.
      没有参数j的话,查找后,VIM会跳转至第一个关键字所在的文件.反之,只更新结果列表(quickfix).
 

   比如要在当前目录查找word,使用如下:

   :vimgrep word * 

   如果想要递归查找所有下级目录里面,那么就用:

   :vimgrep word **

 

   再举一些其他的例子

      :vimgrep /the menu/ *.php  

      表示在当前目录下的扩展名为php的所有文件中,查找字符串"the menu".    
      :vimgrep /the menu/ ./includes/*.* 

      表示在当前目录中的"includes"目录里的所有文件中,查找字符串"the menu".

      :vimgrep /the menu/ **/*.* 

      在当前目录及其子目录

里的所有文件中,查找字符串"the menu".

 

查找的结果可以用":copen"命令查看,在列表里,将光标移动至相应的位置,按回车就打开对应的文件了.

注: 

:copen    打开quickfix

:cclose   关闭quickfix

:cc       转到当前查找到的位置

:cn       转到下一个位置 

:cp       转到前一个位置

 

另外,如果想要在使用是快捷查找当前光标下的字母,则只需要在vimrc中添加如下代码:

"对搜索的设置
map ft :call Search_Word()<CR>:copen<CR>
function Search_Word()
let w = expand("<cword>") " 在当前光标位置抓词
execute "vimgrep " w " *"

endfunction

 

替换: 

args

  举例说明一下

  如果你想将当前目录下所有类型的文件中的 oldword 替换为 newword,那么只需要打开当前目录下的某个文件,输入如下两条命令并回车:

:args *.*

:argdo %s/oldword/newword/egc | update 

  接下来的工作就是确认Vim查找到的那个关键词是否要被替换。是则按下 y ,否则按下 n。

  解释下所用到的命令: 

  • 第一行,我们使用 args 命令,将当前目录下所有类型的文件都加入到参数列表中(不包括子文件夹中的文件,),以备后续操作。args命令我还没完全搞清楚。实验了下,使用 :args */* 的话,是将当前目录下 所有在子文件夹中的目录和子文件夹中的文件(不包括下一级文件)加入参数列表中。了解了这点,你也可以只替换需要的类型,如 :args *.html。举一反三,反不出来的,再去Google。 
  • 第二行,使用 argdo 命令,对参数列表中的文件进行替换操作。s 就是替换命令了,加上 % 指对所有行,即全文匹配。g 指对每一行中所有匹配的地方都执行替换,e 指使用正则模式,为了区分大小写。最后的 c 指每次替换前,都要确认一下。
上面的命令是直接操作文件,即存盘了的。
操作失误?那就只能狂按 u 了,如果没有备份的话。

 

分屏

分屏启动Vim
vim -On file1 file2 …——使用大写的O参数来垂直分屏。
vim -on file1 file2 …——使用小写的o参数来水平分屏。
注释: n是数字,表示分成几个屏。

关闭分屏
Ctrl+W c ——关闭当前窗口。
Ctrl+W q ——关闭当前窗口,如果只剩最后一个了,则退出Vim。

分屏
Ctrl+W s ——上下分割当前打开的文件。
:sp filename ——上下分割,并打开一个新的文件。
Ctrl+W v ——左右分割当前打开的文件。
:vsp filename ——左右分割,并打开一个新的文件。

移动光标
Vi中的光标键是h, j, k, l,要在各个屏间切换,只需要先按一下Ctrl+W
Ctrl+W+l ——把光标移到右边的屏。
Ctrl+W+h ——把光标移到左边的屏中。
Ctrl+W+k ——把光标移到上边的屏中。
Ctrl+W+j ——把光标移到下边的屏中。
Ctrl+W+w ——把光标移到下一个的屏中。

屏幕尺寸
下面是改变尺寸的一些操作,主要是高度,对于宽度你可以使用Ctrl+W <或是>,但这可能需要最新的版本才支持。
Ctrl+W =   让所有的屏都有一样的高度。
Ctrl+W +   增加高度。
Ctrl+W -   减少高度。

 

多标签切换 

使用:tabe命令和文件名参数,可以在新标签页中打开指定的文件。也可以使用:tabnew命令,在新标签页中编辑新的文件。命令:tab split将在新标签页中,打开当前缓冲区中的文件。

命令:tabf允许你在当前目录搜索文件,并在新标签页中打开。比如我想打开当前目录下的img.txt文件,那么就可以使用:tabf img.*命令。请注意,此命令只能打开一个文件,如果搜索出多个匹配文件,将提示你“文件名过多”,这时你需要给出更精确的搜索条件以打开文件。

Vim默认最多只能打开10个标签页。你可以用set tabpagemax=15改变这个限制。

列示标签

命令:tabs可以显示已打开标签页的列表,并用“>”标识出当前页面,用“+”标识出已更改的页面。

关闭标签

命令:tabc可以关闭当前标签页。而命令:tabo将关闭所有的标签页。

切换标签

命令:tabngt可以移动到下一个标签页。而命令:tabpgT将移动到上一个标签页。如果已经到达最后面或最前面的标签页,将会自动转向循环。

如果你打开了很多标签页,那么可以使用:tabfirst:tabr命令,移动到第一个标签页。使用:tablast命令,移动到最后一个标签页。

移动标签

如果你希望按照指定的次序排列标签页,那么你可以使用:tabm命令。请注意,标签页次序是从0开始计数的。比如命令:tabm 1将把当前标签页移动到第2的位置。如果你没有为:tabm命令指定参数,那么当前标签页将会被移动到最后。

配置标签

默认情况下,只有用户新建标签页才会在窗口上方显示标签栏,这是由选项set showtabline=1决定的。如果我们希望总是显示标签栏,那么可以用set showtabline=2命令来设置。如果我们希望完全不显示标签栏,那么可以使用set showtabline=0来设置。

标签页命令

使用:tabdo命令,我们可以同时在多个标签页中执行命令。比如我们打开了多个标签页,需要把这些文件中的“food”都替换成“drink”,那么就可以使用:tabdo %s/food/drink/g命令,一次完成对所有文件的替换操作,而不用针对每个文件重复操作。

图形界面

如果你使用的是带有图形界面的gVim,那么新建、关闭和打开标签页的操作,都可以通过在标签页上右击鼠标完成。只需要点击相应标签,就可以在不同的标签页间切换。

通过:help tab-page-intro命令,可以获得关于标签页使用的更多信息。

命令小结
:tabnew新建标签
:tabs显示已打开标签页的列表
:tabc关闭当前标签
:tabn移动到下一个标签
:tabp移动到上一个标签
:tabfirst移动到第一个标签
:tablast移动到最后一个标签

 

 

 

posted @ 2011-10-02 22:57  漠北风  阅读(1482)  评论(1编辑  收藏  举报