个人非常喜欢VIM来写代码,简洁、易用,但是刚开始使用的时候,有些命令还是很难记忆的。这里整理一下。

以下/代表或者。比如p/P代表p或者P;ctrl+f/b/u代表ctrl+f或者ctrl+b或者ctrl+u。

VIM分为几种模式:普通模式、插入模式、命令行、可视模式、执行shell命令等。

其中普通模式为打开vi的默认模式,它响应键盘,进行光标操作、复制、粘贴等。

插入模式,或者说是编辑模式,使用i、I、a、A、o、O、s、S等可以由普通模式进入,然后进行编辑。

命令行模式,在屏幕的最下方,使用Ctrl+c由插入模式转化到普通模式,再:由普通模式转化到命令行模式。该模式下执行VIM的命令,比如保存、退出、查找、替换等。

可视模式,使用V或者v,由普通模式转化到可视模式。这样可以按行、或者区块选定区域(使用上下左右键),然后复制等。

执行shell命令,在命令行模式下,使用:! 后面跟上shell命令,就可以执行了。

普通模式下,光标移动比较常用:hjkl和方向键一样的效果,还有ctrl+f/b/u等进行翻页,^$进行行首尾的定位,w/b按单词位移,gg回到文件首,G到文件末尾等。

普通模式下,字母的替换为:在当前光标位置按r,则当前字母被替换为下一输入的字母。

普通模式下,撤销与反撤销: u,U,ctrl+r。

普通模式下,复制与粘贴:yy是复制一行,3yy是复制3行(依此类推);dd是删除当前行,3dd是删除3行;p/P是粘贴(可以粘贴y或者d的内容)。vi中可以使用多个复制缓冲区,(”ay是复制到缓存区a,”ap是从缓冲区a粘贴,可以用26个字母命名缓冲区)

普通模式下,给文章加个行标记,下次从文件别的地方跳转回来:ma是给当前行标记为a,然后用’a跳转回来。

命令行模式下,查找:/为向下查找,?为向上查找,比如/aaaa,是查找匹配aaaa的字符串。n/N向下/上的下一个。为了避免输入,可以在当前光标所在单词处,使用*/#,向下/上查找当前单词(但是注意,这里实际上是匹配“整个”单词,就是包括单词边界,比如split实际上是/,也就是不可以匹配vsplit。)

命令行模式下,替换:语法为 :%s/aaaa/bbb/g,将所有的aaaa替换为bbb;后面的g代表全部替换,否则仅替换一次。这里支持一些正则。

命令行模式下,保存退出等: :w 保存; :q 退出; :wq保存并退出; :q!不保存退出。(在普通模式下,ZZ就是保存退出了)

命令行模式下,打开新窗口:split filename(水平打开),vspilt filename(垂直打开)。之后,使用ctrl+w加一些组合键来操作这些窗口。(Ctrl+w ctrl+w)在窗口间切换,(ctrl+w ,)方向键也是切换。(ctrl+w =)窗口等大小。(ctrl+w _)当前窗口最大化。(ctrl+w +/-)当前窗口变大/小一行。(移动窗口:ctrl+w H|J|K|L)

更方便的移动方式,在.vimrc中加入:

nmap j

nmap k

nmap h

nmap l

这样就可以利用 ctrl+h|j|k|l 来模拟 ctrl+w 再加hjkl的命令了。

命令行模式下,打开其他文件: :e filename,缓存会切换到新文件处,所以打开之前需要保存当前文件(不保持也没关系,它会提醒你的)。然后使用ctrl+^在文件间切换。

使用:e打开的多个文件其实都在文件缓冲区内,可以通过 :ls 命令查看,然后通过 :buffer Num 或者 Num ctrl+^ 切换。

(vim其实一下子可以打开多个文件,vi file1 file2 .. filen,之后使用:n/N在文件间切换)

(vi -d file1 file2打开两个文件,并且使用diff比较它们的异同)

可视模式,我唯一使用它的就是区域选择,然后可以使用yy、dd,或者命令行下的替换。

插入模式,经常使用的是补完,比如之前输入过单词verylong,那么下次输入到very的时候,ctrl+p/n可以补完。(ctrl+x ctrl+f)是在系统中搜索,补完文件名。(ctrl+x ctrl+l)是补完一条句子。

写代码的时候,可能想看看某个文件在什么地方,或者执行一些shell命令,这时可以(:! ls *)。

ps: set indentexpr=

最后,要多用help命令。在命令行模式下 :help pattern可以看到pattern相关的帮助,如果不带参数,就会看到vi的帮助文档。

使用ctrl+]|T (同ctags)在帮助文档的主题之间跳转。

—————————————————

重要能把ctags用到php上面了,这里总结一下(ps:同时说说Project插件  http://www.vim.org/scripts/script.php?script_id=69)

1、下载vim的project插件,解压到home的.vimrc下面就可以了(具体我记得我上面博客说过)

2、使用\C,\R来新建和更新project,空格来缩放窗口

3、首先看看ctags的默认语言映射(就是用什么语言机制来解析一种后缀名的文件):

ctags –list-map

为了使.inc后缀的文件也映射到PHP,我们使用以下命令生成tag:

ctags –langmap=PHP:+.inc -R *

ctags 可以结合vim的taglist扩展,比如~/.ctags里可以修改各种语言的function/variable等的意义:

–regex-php=/^[ \t]*[(private| public|static)( \t)]*function[ \t]+([A-Za-z0-9_]+)[ \t]*\(/\1/f, function, functions/

–regex-php=/^[ \t]*[(private| public|static)]+[ \t]+\$([A-Za-z0-9_]+)[ \t]*/\1/p, property, properties/

–regex-php=/^[ \t]*(const)[ \t]+([A-Za-z0-9_]+)[ \t]*/\2/d, const, constants/

结合~/.vim/plugin/taglist.vim里的:

” php language

let s:tlist_def_php_settings = ‘php;c:class;f:function’

4、使用ctrl+] 、ctrl+t来在function之间跳转

5、如果报找不到tag,那么看~/.vimrc有没有一些关于ctags的配置,默认vim会在当前目录去load tag文件的

——————————————————-

在用鼠标粘贴内容到vim中的时候,它的自动补完、缩进等有时会很讨厌,这时可以这样:

在粘贴文本到 vim 前,先:

<span>:</span>set paste

完了再恢复:

<span>:</span>set paste<span>!</span>

其实先禁用 <code>smartindent</code>

也一样的,不过至少 <code>paste</code>

 比 <code>smartindent</code>

 短 6 个字符,呵呵。

———————————————————

vim配置问题:

1、打开vim,恢复到上次关闭的位置

if has("autocmd")

   autocmd BufRead *.txt set tw=78

   autocmd BufReadPost *

     / if line("'/"") > 0 && line ("'/"") <= line("$") |

      /   exe "normal g'/"" |

      / endif

endif

参考文档: http://man.lupaworld.com/content/manage/ringkee/vim.htm

———————————————————–

vim +Tlist +Project

参考文档: http://www.ibm.com/developerworks/cn/linux/l-tip-vim2/index.html

1、下载并按照project插件

2、下载 vim的taglist插件 :http://www.vim.org/scripts/download_script.php?src_id=7701

unzip taglist.zip -d ~/.vim

该插件特性:

  • 可以显示宏(macro)、函数(function)、变量(variable)、类型定义(typedef)、类(class)、结构(struct)等多种内容信息;
  • 打开多个文件时,可以同时看到多个文件的结构信息;
  • 在左边的 taglist 窗口显示的名称上双击鼠标或按回车键,右边主窗口中会跳转到相应的定义位置;
  • 右边窗口中光标的位置改变,左边的窗口也会在 4 秒内(缺省值,参见“:help ‘updatetime’”)黄色加亮显示相应的名称;
  • 在启用/关闭 taglist 时,插件能够自动改变当前 Vim 窗口的大小(不管是文本模式的 Vim 还是图形界面的 Vim),除非使用“:let Tlist_Inc_Winwidth=0”关闭这一功能(当使用这一功能导致兼容性问题时)。

图8

3、 vim +Tlist +Project filename

使用ctrl+ww在窗口之间切换。或者ctrl+w — h|l 控制向左|右窗口。

taglist 的折叠使用 – 控制。

—————————————————-

vim对grep和make的支持:

Make [17] 和grep [18] 应当算是 Unix 世界里无人不晓的基本工具了吧。很自然的,Vim

对它们有着特殊的支持。该支持主要通过访问一个特殊的快速修订窗口(quickfix window)来实现。直接在 Vim 的命令模式里输入相应的

make 或 grep 命令(如“:grep foo *.c”)即可将命令的执行结果放入该窗口,同时根据返回的结果跳转到第一个错误(make

的情况;在使用 grep 时是匹配成功之处)。以下是常用的“快速修订”命令:

  • :cn(显示下一个错误)
  • :cp(显示上一个错误)
  • :cl(列出所有的错误及其编号)
  • :cc(跳转到指定编号的错误)
  • :copen(打开快速修订窗口,在其中显示所有错误,可在错误上双击鼠标或按回车键跳转至该错误;示例参见图 4)图4
  • :cclose(关闭快速修订窗口)

Vim 的这个特性也可以与 make 和 grep 以外的程序一起工作(事实上,在 Windows XP

上,“:grep”命令一般调起的是“findstr /n”)。具体调用那个程序由选项 makeprg(Linux 下缺省为“make”)和

grepprg(Linux 下缺省为“grep -n $* /dev/null”)控制,而如何解析返回的内容则由选项 errorformat

和 grepformat 控制。鉴于在 Unix/Linux 下一般不需更改这些选项的内容,此处不再详述

———————–

vim 查找 取反:

:g!/searchkeyword

———————————-

查看vim插件等的加载位置::set runtimepath?

———————————-

以下zz from http://hi.baidu.com/newkedison/blog/item/d9704d8fcd63ade8f01f3688.html

1、滚屏

先用命令设置每次滚屏的行数,默认值是半个屏幕

:set scroll=3

设置每次滚动3行

然后用Ctrl+u上滚,Ctrl+d下滚

08.08.19补充

可以用3Ctrl+u实现先设置scroll为3,再上滚3行,这个比较实用,我的vimrc里面定义了两个映射

map 3 “定义空格键代替Ctrl+d,就是向下滚屏,相当于鼠标滚轮

map 3 “定义Alt+空格代替向上滚屏

这样就可以用空格和Alt+空格来模拟滚轮了

2、q/

在Normal模式输入q/就可以显示前面查找过的语句,这样对测试正则表达式非常有用,另外也可以先输入/然后按方向键的向上来看前面的记录

3、:reg

查看所有寄存器

08.08.19补充

:marks 查看所有书签,用m{a-z}定义的

4、自定义热键的作用范围

:nmap 键只对普通模式有效

:imap 键只对插入模式有效

:vmap 键只对可视模式有效

:cmap 键只在命令行下有效

:map 键在普通模式和可视模式都有效

:map! 键在插入模式和命令行下都有效

5、命令行中使用粘贴

Ctrl+R,然后跟寄存器名,可以将指定寄存器的内容粘贴到当前位置,特别的,用*(星号)寄存器表示剪贴板中的内容,这样以后看到网页上的命令,就不需要自己手打了.

:h i_CTRL-R   查看详细解释,输入时要注意大小写,可以直接试试复制的效果,先复制冒号后面的内容(不要复制冒号),然后在normal模式下按冒号,再按Ctrl+R,光标下会出现一个双引号,那是提示输入寄存器名,按Shift+8输入星号即可

6、复制中也能用正则表达式

比如按y,然后输入一个/开头的正则表达式,会从光标当前的位置,复制到正则表达式匹配的地方,包括光标下的字符,但是不包括正则表达式匹配到的内容,只复制到匹配内容的前面,我用\zs试了一下,无法使正则表达式中\zs前面的一部分也一起复制

7、粘贴在下一行

以前我是按o,然后ESC,再p,后来发现,其实:pu就可以了,这个命令还有其他扩展功能,见:h pu

08.08.19 补充

这里说的复制不包括用yy整行复制,如果是整行复制的话,用p就直接复制到下一行了

8、字符串

在需要用到字符串的函数,或者是定义一个变量作为字符串,我们都可以用一对双引号或一对单引号表示一个字符串.他们有一定的区别,

在单引号里面,除了单引号本身,其他任意符号(如双引号,斜杆等)均表示其本身,没有任何特别含义,而用两个单引号,可以表示一个单引号,其实就和VB的字符串的双引号是一样的

如果是在双引号里面,则斜杆\作为转义字符,可以有很多特殊的用法,如\t跳格,\n换行等,如果要表示双引号,则用\”,单引号不需要转义

详见:h 41.2

08.08.19

字符串可以用小数点.拼接一些变量,类似于VB中的&符号

9、命令行中使用函数

在输入命令的时候,也可以调用函数还输入一些内容,方法是按Ctrl+r,再按=,然后前面输入的内容就不见了(隐藏起来了)前面变成了一个=号,光标停在等号上面,这里就可以输入函数,输入结束后按回车,函数执行的结果就紧跟在你刚才按Ctrl+r的地方了.

比如

:split =expand(“%:p:h”)

注意,表示按Ctrl+r,不是原样输入

这个执行的效果是把当前的路径显示到命令行,然后回车后会出来一个可以选择打开哪个文件的窗口,关于expand函数详见:h expand

10. 让光标可以停在任意位置

默认的效果是,光标只能停在有字符的区域,可以用

:set ve=all

使光标可以到达任意位置

如果要恢复默认的设置,用:set ve=

具体内容查看:h virtualedit

11. 不保留备份文件

:set nobackup

具体内容查看 :h backup

12. 设置Tab键宽度,以及用空格代替Tab

我喜欢Tab键宽度为两格,而且是用两个空格替换Tab,这样有个好处,文件的格式不会因为各个编辑器不同的设置而改变样子

set tabstop=2     “实际Tab键的宽度

set expandtab     “用空格代替Tab键,这样当按了Tab键后,会被替换成两个空格,删除的时候也是按空格来删除

set autoindent    “自动缩进,在VIM能识别的语法下,会自动输入Tab,缩进的宽度由下一行的设置确定

set shiftwidth=2 “设置自动缩进的宽度

12. modeline

查看VIM帮助时,可以看到最后都有一行vim:开头的内容,这行东西在vim中叫modeline,具体用法通过

:h modeline

查看

Leave a Reply