http://easwy.com/blog/archives/advanced-vim-skills-catalog/
非常好的链接

VIM中常用的替换模式总结:

1,简单替换表达式  

:%s/four/4/g

“%” 范围前缀表示在所有行中执行替换。最后的 “g” 标记表示替换行中的所有匹配点。如果仅仅对当前行进行操作,那么只要去掉%即可

用 “\<” 来指定匹配单词开头:

       :%s/\

显然,这样在处理 “fourty” 的时候还是会出错。用 “\>” 来解决这个问题:

       :%s/\/4/g

如果你在编码,你可能只想替换注释中的 “four”,而保留代码中的。由于这很难指定,可以在替换命令中加一个 “c” 标记,这样,Vim 会在每次替换前提示你:

       :%s/\/4/gc

2,删除多余的空格

要删除这些每行后面多余的空格,可以执行如下命令:

       :%s/\s\+$//

“\s\+$”表示行末($)前的一个或者多个(\+)空格(\s)。替换命令的 “to” 部分是空的:”//”。这样就会删除那些匹配的空白字符。


3,匹配重复性模式

星号项 “*” 规定在它前面的项可以重复任意次,和windows中的*不一样阿!

       /a*

匹配 “a”,”aa”,”aaa”,等等。但也匹配 “” (空字串),因为零次也包含在内。星号 “*”仅仅应用于那个紧邻在它前面的项。因此 “ab*” 匹配“a”,”ab”,”abb”,”abbb”,等等。如要多次重复整个字符串,那么该字符串必须被组成一个项。组成一项的方法就是在它前面加“\(”,后面加 “\)”。因此这个命令:

       /\(ab\)*

匹配: “ab”,”abab”,”ababab”,等等。而且也匹配 “”。

要避免匹配空字串,使用 “\+”。这表示前面一项可以被匹配一次或多次。

       /ab\+

匹配 “ab”,”abb”,”abbb”,等等。它不匹配 后面没有跟随 “b” 的 “a”。

要匹配一个可选项,用 “\=”。 例如:

       /folders\=

匹配 “folder” 和 “folders”。

4,指定重复次数

要匹配某一项的特定次数重复,使用 “\{n,m}” 这样的形式。其中 “n” 和 “m” 都是数字。在它前面的那个项将被重复 “n” 到 “m” 次 (|inclusive| 包含 “n” 和 “m”)。例如:

       /ab\{3,5}

匹配 “abbb”,”abbbb” 以及 “abbbbb”。

  当 “n” 省略时,被默认为零。当 “m” 省略时,被默认为无限大。当 “,m” 省略时,就表示重复正好 “n” 次。例如:

       模式          匹配次数

       \{,4}           0,1,2,3 或 4

       \{3,}           3,4,5,等等

       \{0,1}          0 或 1,同 \=

       \{0,}           0 或 更多,同 *

       \{1,}           1 或 更多,同 \+

       \{3}            3

5,查找匹配

在一个查找模式中,”或” 运算符是 “\|”。例如:

       /foo\|bar

这个命令匹配了 “foo” 或 “bar”。更多的抉择可以连在后面:

       /one\|two\|three

匹配 “one”,”two” 或 “three”。

  如要匹配其多次重复,那么整个抉择结构须置于 “\(” 和 “\)” 之间:

       /\(foo\|bar\)\+

这个命令匹配 “foo”,”foobar”,”foofoo”,”barfoobar”,等等。

  再举个例子:

       /end\(if\|while\|for\)

这个命令匹配 “endif”,”endwhile” 和 “endfor”。


查找块
\_.* :匹配多个换行符
\@!: 遇到某个标识符停止
 
/key\_.*key:匹配多行

------------------大小写的问题--------------

用vim处理字符的大小写转换
平时在写程序时经常会遇到大小写转换的问题,vim中提供了很多非常方便的大小写转换命令,可以快速的进行字母、单词、任意行的大小写转换,可以和vim的光标移动指令组合使用。

~ 将光标下的字母改变大小写
3~ 将光标位置开始的3个字母改变其大小写
g~~ 改变当前行字母的大小写
U 将可视模式下选择的字母全改成大写字母
u 将可视模式下选择的字母全改成小写
gUU 将当前行的字母改成大写
3gUU 将从光标开始到下面3行字母改成大写
guu 将当前行的字母全改成小写
gUw 将光标下的单词改成大写。
guw 将光标下的单词改成小写。


vim中大小写转化的命令是gu或者gU
形象一点的解释就是小u意味着转为小写;大U意味着转为大写.

剩下的就是对这两个命令的限定(限定操作的行,字母,单词)等等

1、整篇文章大写转化为小写
打开文件后,无须进入命令行模式。键入:ggguG

2、整篇文章小写转化为大写
打开文件后,无须进入命令行模式。键入:gggUG

3、只转化某个单词

4、转换几行的大小写

将光标定位到想转换的行上,键入:1gU 从光标所在行 往下一行都进行小写到大写的转换
10gU,则进行11行小写到大写的转换
以此类推,就出现其他的大小写转换命令
gU0  


vim中的粘贴板
vim(我这是GVIM)有17个粘贴板,分别是"、 0、1、2、...、9、-、*、+、. 、 : 、/:: ;用:reg命令可以查看各个粘贴板里的内容。在vim中简单用y只是复制到“(双引号)粘贴板里,同样用p粘贴的也是这个粘贴板里的内容;
要将vim的内容复制到某个粘贴板,需要退出编辑模式,进入正常模式后,选择要复制的内容,然后按"Ny完成复制,其中N为粘贴板号(注意是按一下双引号然后按粘贴板号最后按y),例如要把内容复制到粘贴板a,选中内容后按"ay就可以了,有两点需要说明一下:
VIM内部("):”号粘贴板(临时粘贴板)比较特殊,直接按y就复制到这个粘贴板中了,直接按p就粘贴这个粘贴板中的内容(也可以说是VIM专用吧);
与外部程序交互(*/+):+号粘贴板是系统粘贴板,用"+y将内容复制到该粘贴板后可以使用Ctrl+V将其粘贴到其他文档(如firefox、gedit)中,同理,要把在其他地方用Ctrl+C或右键复制的内容复制到vim中,需要在正常模式下按"+p
要将vim某个粘贴板里的内容粘贴进来,需要退出编辑模式,在正常模式按"Np,其中N为粘贴板号,如上所述,可以按"5p将5号粘贴板里的内容粘贴进来,也可以按"+p("+* 也行)将系统全局粘贴板里的内容粘贴进来。

返回之前的位置:
两个单引号''或者Ctrl-O

关于映射的更多内容需要参考
:h key-notation
:h map

 Insert  Command-lineLang-Arg ~
:map!  :noremap!  :unmap!  :mapclear!    yes       yes   -
:imap  :inoremap  :iunmap  :imapclear    yes-   -
:cmap  :cnoremap  :cunmap  :cmapclear     -       yes   -
:lmap  :lnoremap  :lunmap  :lmapclear    yes*       yes*  yes*



Vim下的跳转练习:
http://blog.csdn.net/moiyer/article/details/5439976


跳转到函数、变量定义处: 
[+ctrl+i 跳转到函数、变量和#define
[+ctrl+d 跳转到#define处
ctrl+i 向前跳到前几次光标位置
ctrl+o 向后跳到后几次光标位置
vim 跳到函数开头或结尾:[[对于{不单独一行的程序是无法跳转到函数开头的。
1: 跳到函数头 [{
2: 跳到函数尾 ]}

$1自动加小括号
函数体跳转: 
[[
]]
[]
][
{}

'       跳转前的位置 
 "       最后编辑的位置 
[       最后修改的位置的开头 
]       最后修改的位置的结尾 

`. – 跳转到上次修改的行、列位置。
‘. – 跳转到上次修改的行位置。

5.
如何查看系统信息?

cat /proc/meminfo(cpuinfo/pci...)

6.查看目录的大小?

du -sh dir

9.在多级目录中查找某个文件的方法?

1 find /dir -name filename.ext 

2 du -a | grep filename.ext 

3 locate filename.ext 

10.用ls只列出目录?

ls -lF | grep ^d 

ls -lF | grep /$ 

ls -F | grep /$ 


11. 关于vim分割窗口的大小

vim 竖向分割窗口时调整窗口大小的操作
看过的教程中,关于分割窗口的操作,一般都只说到横向分割窗口的各种操作:
CTRL_W + 窗口边界上移
CTRL_W - 窗口边界下移
CTRL_W _ 将当前窗口调到最大
CTRL_W = 平分窗口 
可是我多数时候倾向用vsp。这时,按键是不同的:
CTRL_W < 窗口边界左移
CTRL_W > 窗口边界右移
CTRL_W | 将当前窗口调到最大
CTRL_W = 平分窗口,这个快捷键是通用的。

12. 保存工程的状态
http://www.linuxsir.org/bbs/thread206448.html
用vim编辑文档时,我们经常会在同一个vim中同时打开几个文档在不同的窗口中并且会定义一些marks和在registers里面存储一些内容. 当我们退出vim后,这些信息大部分丢失了,特别是当我们重新打开文件后,原来打开的多窗口不会恢复,我们只打开了一个当前文件窗口. 由于vim强大的功能,我们想能不能在打开文件时,完全恢复原来退出时的状态, 就象我们没退出过一样.包括marks和registers都没被改变.答案是 可以.下面就列出来我是怎么修改vim的配置达到目的的 : 


在你的 /etc/vim/gvimrc或/etc/vim/gvimrc.local中加入一下两行: 


au VimLeave * mksession! ~/.vim/session/%:t.session 
au VimLeave * wviminfo! ~/.vim/session/%:t.viminfo 


并保证 目录~/.vim/session存在. 


然后写一个脚本程序gvims: 
#!/bin/sh 
if [ -r ~/.vim/session/$1.session ]; then 
gvim "+source ~/.vim/session/$1.session" "+rviminfo ~/.vim/session/$1.viminfo" 
else 
gvim $1 
fi 


当用gvim编辑完后,退出是,文件是以当前子窗口的名字保存窗口信息的,所以下次打开时,要用那个窗口名字作为gvims的参数.


这样的话, 对于一个项目的编辑非常有用. 例如: 我们现在做一个项目,名字是storm. 我们切换到项目storm所在的目录,运行 gvims storm. 这样就会打开一个gvim窗口,然后我们用 命令 :new storm.c 回车, 然后有输入命令 :vert new storm.h. 然后调整窗口大小,编辑,保存. 现在我们这个gvim窗口里有三个子窗口,一个显示storm, 一个显示storm.c,一个显示storm.h. 这时,我们切换到storm的编辑窗口,然后我们输入命令 :qa 退出gvim. 过了几天,我们可能要重新编辑项目storm,这是 你在任一个目录下(不一定是 项目storm的目录), 输入shell命令 
gvims storm (如果你还记得你的项目名字是storm的话 (= ). 当gvim运行后,你会发现你的gvim显示的状态就象你几天前没退出一样. enjoy!


13. 关于引入session后mark.vim 失效的问题
13.1 我在gvim中用的是dessert配色方案,需要在/usr/share/vim/vim72/colors/desert.vim的最后加入就可以
" For mark.vim plugin
    highlight def MarkWord1  ctermbg=Cyan     ctermfg=Black  guibg=#8CCBEA    guifg=Black
    highlight def MarkWord2  ctermbg=Green    ctermfg=Black  guibg=#A4E57E    guifg=Black
    highlight def MarkWord3  ctermbg=Yellow   ctermfg=Black  guibg=#FFDB72    guifg=Black
    highlight def MarkWord4  ctermbg=Red      ctermfg=Black  guibg=#FF7272    guifg=Black
    highlight def MarkWord5  ctermbg=Magenta  ctermfg=Black  guibg=#FFB3FF    guifg=Black
    highlight def MarkWord6  ctermbg=Blue     ctermfg=Black  guibg=#9999FF    guifg=Black

13.2 据说一个mark.vim的bug
gvim 7.1.298 for Windows,mark.vim 现在按 \m 不灵或者全都高亮成前景色 ???

不知道哪里把 :hi MarkWord 的高亮设置清掉了,把 mark.vim 开头的六个 
:hi 设置移到 function! s:InitMarkVariables() 函数的 
     let g:mwHistAdd = "/@" 
后就好了。


14 TagList 常用命令

www.cnblogs.com/ifys/archive/2010/10/24/1860610.html


16 VIM缓冲区使用方法
打开多个文件后,使用命令 :ls 或者 :buffers 来查看缓冲区的文件列表。最前面是序号,第二列是 缓存文件状态,第三列,文件名(不一定有名字),第四列,在对应的缓存区里面,鼠标当前所处的位置。


缓存文件状态有以下属性:


a 表示激活的缓冲区
h 表示隐藏的缓冲区
% 代表当前缓冲区
# 代表交换缓冲区
= 代表吟诗缓冲区
+ 代表已修改过的缓冲区
打开某个缓冲区使用 :buffer num num代表缓冲区编号 也可以用 :buffer file 直接指定文件名。
在不同缓冲区之间切换使用 CTRL+^ ,当然也可以使用 左右方向键(不推荐)。


在新窗口里面打开 某个特点的缓冲区使用 :sbuffer num/file 命令。
转到下一个缓冲区使用 :bnext
转到上一个缓冲区使用 :bpre
转到最后一个缓冲区使用 :blast
转到第一个缓冲区使用 :bfirst
删除一个缓冲区使用 :bdele
卸载一个缓冲区使用 :bunload

17 vim书签

:delm[arks]  删除某一书签
  :delmarks a      deletes mark a
  :delmarks a b 1    deletes marks a, b and 1
  :delmarks Aa       deletes marks A and a
  :delmarks p-z      deletes marks in the range p to z
  :delmarks ^.[]     deletes marks ^ . [ ]
  :delmarks \"      deletes mark "
<{not in Vi}

:delm[arks]! 删除所有书签
A-Z or 0-9.
{not in Vi}



ma – 创建一个书签,标记为a,如果你要创建全局书签,要用大写字母。
`a – 跳转到书签a所在的行、列位置,a是你创建时候使用的字母。
‘a – 跳转到书签a所在的行位置。
:marks – 显示所有的书签。


引入两个插件

我的vim 7.0在切换到其它缓冲区然后再切换回来时,原来被标记的文本会失去高亮。而作者说他并不存在此问题。如果你存在类似的问题,可以打上我所加的补丁:

--- easwy/mark.vim	2006-12-01 13:02:18.000000000 +0800
+++ plugin/mark.vim	2007-03-23 10:22:02.000000000 +0800
@@ -440,6 +440,43 @@
 	endif
 endfunction

+" easwy add
+" return the mark string under the cursor. multi-lines marks not supported
+function! 

用法:
保存该patch到某一目录,例如:/tmp/mark.vim.patch
    cd到你的.vim目录:cd ~/.vim
    运行命令:cat /tmp/mark.vim.patch | patch -p0
由于用的是最新版1.1.8-g注意要把b:mwWord 改成 g:mwWord

×××关于颜色的设置参考:http://easwy.com/blog/archives/advanced-vim-skills-syntax-on-colorscheme/
我用的是新建color目录,名为desert_my.vim

18 折叠命令
zf 手动创建折叠
zo 将当前折叠打开
zO 对所在范围内所有嵌套的折叠点展开
zc 折叠光标所在处(不一定有效,但是条件不清楚,有括号的时候可以成功)
zm 折叠所有层次(依层次折叠)   
zM 折叠所有 (依层次折叠)
zr 打开所有折叠层次(依层次打开)
zR 打开所有折叠 (依层次打开)
zi 切换折叠与不折叠指令
zj 向下移动。到达下一个折叠的开始处。关闭的折叠也被计入
zk 向上移动到前一折叠的结束处。关闭的折叠也被计入
zd 删除折叠(其实在折叠上面dd就可以删除了)
zD 删除所有折叠


19 doxygentoolkit.vim的使用
http://www.vim.org/scripts/script.php?script_id=987
安装:Copy to your '~/.vim/plugin' directory
"doxygen toolkit 
let g:DoxygenToolkit_briefTag_pre="@synopsis  "
let g:DoxygenToolkit_paramTag_pre="@param "
let g:DoxygenToolkit_returnTag="@returns   "
let g:DoxygenToolkit_blockHeader="--------------------------------------------------------------------------"
let g:DoxygenToolkit_blockFooter="----------------------------------------------------------------------------"
let g:DoxygenToolkit_authorName="Drunkedcat"
let g:DoxygenToolkit_licenseTag="GPL 2.0"


let g:DoxygenToolkit_authorName="drunkedcat, [email protected]"
let s:licenseTag = "Copyright(C)\
10-12 04:54