VIM使用系列之一——配置VIM下C/C++编程环境

1.基本配置
建立三个目录:mkdir ~/.vim/{plugin,doc,syntax} –p
建立配置文件:touch ~/.vimrc

vimrc作为vim的主要配置文件,我们在配置VIM时首先对它进行基本的设置。打开你home目录下的.vimrc文件。进行如下配置:

"基本配置 
set wildmenu 
"增强模式中的命令行自动完成操作 
set foldmethod=manual 
"设定折叠方式为手动 
set helplang=cn 
"设置帮助的语言为中文 
set cin     
"实现C程序的缩进 
set sw=4    
"设计(自动) 缩进使用4个空格 
set sta     
"插入时使用'shiftwidth' 
set backspace=2 
"指明在插入模式下可以使用删除光标前面的字符 
syntax enable 
"设置高亮关键字显示 
set nocompatible 
"去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限 
set number 
"显示行号 
filetype on 
"检测文件的类型 
map :q 
set history=1000 
""记录历史的行数 
set background=dark 
"背景使用黑色 
syntax on 
"语法高亮度显示 
set autoindent 
set smartindent 
"上面两行在进行编写代码时,在格式对起上很有用; 
"第一行,vim使用自动对起,也就是把当前行的对起格式应用到下一行; 
"第二行,依据上面的对起格式,智能的选择对起方式,对于类似C语言编写上很有用 
"第一行设置tab键为4个空格,第二行设置当行之间交错时使用4个空格 
set tabstop=4 
set shiftwidth=4 
set showmatch 
"设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号 
set ruler 
"在编辑过程中,在右下角显示光标位置的状态行 
set incsearch 
"查询时非常方便,如要查找book单词,当输入到/b时,会自动找到第一 
"个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的单词,依 
"次类推,进行查找时,使用此设置会快速找到答案,当你找要匹配的单词 
"时,别忘记回车。 
 set enc=chinese 
"设置编码为中文 
set winaltkeys=no 
"Alt组合键不映射到菜单上

保存文件,退出。

2.安装中文帮助手册
下载地址:http://vimcdoc.sourceforge.net/ 
安装:
$tar xvf vimcdoc-1.7.0.tar.gz

$ cd vimcdoc-1.7.0/

$ ./vimcdoc.sh –i

然后在~/.vimrc 加上set helplang=cn 这句话表明帮助文档为中文。

3.安装C-support--加速C/Cpp开发
下载地址:http://www.vim.org/scripts/script.php?script_id=213 

安装:
将下载的文件放到~/.vim目录中

$ cd ~/.vim





$ unzip cvim.zip

在.vimrc中添加 filetype plugin on 使能该插件。
使用方法:
1)自动添加文件头:
添加你自己的信息: vim ~/.vim/c-support/templates/Templates
~/.vim/c-support/templates 这个目录下还有许多模板,你可以自己定制。
现在试着vim test.c看一看效果。
2)使用热键
主要是一些模板的插入,种类几乎覆盖C/C++开发中大多数需要手动输入的东西。不过我不是很喜欢它的默认模板的代码风格,不过可以通过上述的目录中的文件去定制。这个功能在后边的code complete插件中也提供了。
另外一部分是编译运行的快捷键。
还有一个把另一个文件内容直接灌入当前文件的功能。
有关使用热键的方法见一个文档:http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf 
3)编译文件
快捷键:
修改c.vim文件,查找f9,将包含link的那一行注释掉,并且对save and compile 那一行从A-F9修改为F9
       F9     编译
  Ctrl-F9   执行
 Shift-F9   设置命令行参数

4.安装Exuberant Ctags + Tag list + WinManager——分析源码中Tags(function, class, variable, etc) 并且列出—— 在VIM中自由的查看源代码
Exuberant Ctags 下载安装:sudo apt-get install exuberant-ctags
Teh List下载地址:http://www.vim.org/scripts/download_script.php?src_id=7701 
安装:解压到home目录下的.vim子目录中。
WinManager(调整窗口布局)下载地址:http://www.vim.org/scripts/script.php?script_id=95 
安装:解压到home目录下的.vim子目录中。
配置:
进入$HOME/.vim/doc打开 Vim 运行 ":helptags ." 这个是要保证taglist帮助可以正常使用。其实平时也不太会用到。
生成系统API的tags:(具体为什么采用这样的参数请参考ctags命令行帮助)
ctags -R -f ~/.vim/systags --c-kinds=+p -- c++ - kinds= + px -- fields= + iaS -- extra= + q /usr/include /usr/local/include 
随后在vimrc中添加如下几行:

"禁止自动改变当前Vim窗口的大小 
let Tlist_Inc_Winwidth=0 
"把方法列表放在屏幕的右侧 
let Tlist_Use_Right_Window=1 
"让当前不被编辑的文件的方法列表自动折叠起来, 这样可以节约一些屏幕空间 
let Tlist_File_Fold_Auto_Close=1 
"映射F4为功能键调出tages浏览器 
"映射F3为功能键调出winmanager的文件浏览器 
"let g:winManagerWindowLayout='FileExplorer|TagList' "你要是喜欢这种布局可以注释掉这一行 
map :TlistToggle 
map :WMToggle 
"将当前的工程的tags导入 
set tags=./tags 
"将系统已经生成的tags导入 
set tags+=~/.vim/systags 

使用方法:按F4 调出函数、变量等tags,按F3出现文件管理器。 例如:把光标移动到某个元素上,CTRL+],就会跳转到对应的定义

5.安装cscope——升级的Ctags
下载 安装:sudo apt-get install cscope
在vimrc中添加

map :call Do_CsTag()//以后按F12就可以对一个工程进行tags索引建立并且引入了 
nmap s :cs find s =expand("")    
nmap g :cs find g =expand("")    
nmap c :cs find c =expand("")    
nmap t :cs find t =expand("")    
nmap e :cs find e =expand("")    
nmap f :cs find f =expand("")    
nmap i :cs find i ^=expand("")$ 
nmap d :cs find d =expand("") 
function Do_CsTag() 
    if(executable('cscope') && has("cscope") ) 
        if(g:iswindows!=1) 
            silent! execute "!find . -name '*.h' -o -name '*.c' -o -name '*.cpp' -o -name '*.java' -o -name '*.cs' -o -name '*.cxx' -o -name '*.hxx'> cscope.files" 
        else 
            silent! execute "!dir /b *.c,*.cpp,*.h,*.java,*.cs >> cscope.files" 
        endif 
        silent! execute "!cscope -bq" 
        if filereadable("cscope.out") 
            execute "cs add cscope.out" 
        endif 
    endif 
endf 


使用:F12生成这个目录及其子目录的索引,然后将光标指向一些函数名或者变量名,使用Crtl+/+以下字母

  • s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
  • g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
  • d: 查找本函数调用的函数
  • c: 查找调用本函数的函数
  • t: 查找指定的字符串
  • e: 查找egrep模式,相当于egrep功能,但查找速度快多了
  • f: 查找并打开文件,类似vim的find功能
  • i: 查找包含本文件的文件


6.安装A——同名头文件和源文件切换
下载:http://www.vim.org/scripts/script.php?script_id=3 1 

将a.vim 放到 ~/.vim/plugin 文件夹中
使用: 在源文件或者头文件中输入:A就可以切换了。

7.安装code_complete——函数、模板自动补全
下载地址:http://www.vim.org/scripts/script.php?script_id=1764 
把插件文件中的tab都改为C-b防止与后来我们要安装的supertab冲突。
将下边这一段加入到template段中以添加bash模板补全功能

----------------------------------------------- 
"Bash Templates 
"Bash Structure by warmbupt@gmail.com 
let g:template['sh'] = {} 
let g:template['sh']['sif'] = "if ".g:rs."...".g:re." ; then/".g:rs."...".g:re."/fi" 
let g:template['sh']['sife'] = "if ".g:rs."...".g:re." ; then/".g:rs."...".g:re."/else/".g:rs."...". 
            /g:re."/fi" 
let g:template['sh']['scase'] = "case ".g:rs."...".g:re." in/".g:rs."...".g:re.")//" .g:rs."...".g:re.";;//". 
            /g:rs."...".g:re.")//" .g:rs."...".g:re.";;///esac/" 
let g:template['sh']['swhile'] = "while ".g:rs."...".g:re." /do/".g:rs."...".g:re."/done" 
let g:template['sh']['suntil'] = "until ".g:rs."...".g:re." /do/".g:rs."...".g:re."/done" 
let g:template['sh']['sfor'] = "for ".g:rs."...".g:re." in " .g:rs."...".g:re."/do/".g:rs."...".g:re."/done" 
let g:template['sh']['sselect'] = "select ".g:rs."...".g:re." in " .g:rs."...".g:re."/do/".g:rs."...".g:re."/done" 

使用:在输入函数时可以出现原型提示是安装这个插件的主要目的。Crtl+b是万能的,比如输入pthread_cre,然后Crtl+b就可以看到效果了。

8.安装supertab+snipMate+echofunc——超级补全
下载地址:
http://www.vim.org/scripts/script.php?script_id=1643 
http://www.vim.org/scripts/script.php?script_id=2540 
http://www.vim.org/scripts/script.php?script_id=1735
安装:用vim打开supertab.vba ,然后使用:so % 进行安装。后两者直接解压在.vim目录里即可。
使用:使用tab就可以完成一些文件中已经出现的词汇的补全和常见结构的补全了,这个功能与code_complete的结构快速补充有所重叠,不过是使 用tab键,你还可以在.vim/snippets目录里自己定制。对于函数原型提示和补全,你可以试着输入select(就可以看到了下边的原型提示 了),shift+tab转换对应原型,并且在结合code_complete的Ctrl+b还可以进行直接补全。

9.安装astyle——代码格式整理
下载安装:$sudo apt-get install astyle

在vimrc中写入:

"定义源代码格式化 
map :call FormartSrc() 
"定义FormartSrc() 
func FormartSrc() 
exec "w" 
"C程序,Perl程序,Python程序 
if &filetype == 'c' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
elseif &filetype == 'cpp' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
elseif &filetype == 'perl' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
elseif &filetype == 'py' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
"Java程序 
elseif &filetype == 'java' 
exec "!astyle --style=java --suffix=none %" 
exec "e! %" 
elseif &filetype == 'jsp' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
elseif &filetype == 'xml' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
elseif &filetype == 'html' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
elseif &filetype == 'htm' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
endif 
endfunc 
"结束定义FormartSrc 

使用:F11直接格式化源代码

10.安装NERD_tree——多tab支持
下载地址:http://www.vim.org/scripts/script.php?script_id=1658 
安装:解压到.vim目录即可
"设置tab的快捷键
"Shift+t为新建一个标签,按两次Shirt+t为跳转标签
map :tabnew .
map :tabnext
使用:Shift+t就可以新建一个标签,连按Shfit+t两次就可以切换标签。

11.生成STL库tags——
下载地址:http://www.vim.org/scripts/script.php?script_id=2358 
解压后运行ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ cpp_src

将其移动到.vim目录:mv tags ../.vim/stltags
然后在vimrc中添加:set tags+=~/.vim/stltags
另外还需要omnicppcomplete  下载地址:http://www.vim.org/scripts/script.php?script_id=1520 
这样就ok了。

12.定义一些常用的功能:

"设置建立新行但是不插入 
map o 
"设置全选快捷键 
map ggVG 
"设置快速不保存退出快捷键 
map :q!:q!:q! 

"替换 
map :L1,L2s/src/tar/g 
imap 

"设置快速注释键 
"F10是在该行后边添加注释,Shift+F10为注释掉该行,两次Shift+F10是去掉改行的注释,然后将光标置于下一行 
map I// 
map! I// 
map 02x 
map! 02x 
map $a// 
map! $a// 

"设置编译快捷键 
"F5为make,两次F5为make clean 
"F6为quickfix,查看详细信息, 两次F6关闭详细信息 
"F7为下一个结果,两次F7为上一个结果 
"F8为编译和运行单个程序、两次F8为调试 
map :make 
map :make clean 
map :cw 
map :ccl 
map :cn 
map :cp 
map :call CompileRun() 
map :call Debug() 


"定义CompileRun函数,用来对不用外接库的小程序进行编译和运行,自己可以根据文件名扩展或实际情况修改参数 
func CompileRun() 
exec "w" 
"C程序 
if &filetype == 'c' 
exec "!gcc % -g -o %<" 
exec "!.//%<" 
endif 
endfunc 
"结束定义CompileRun 

"定义Debug函数,用来调试小程序 
func Debug() 
exec "w" 
"C程序 
if &filetype == 'c' 
exec "!rm %<" 
exec "!gcc % -g -o %<" 
exec "!gdb %<" 
elseif &filetype == 'cpp' 
exec "!rm %<" 
exec "!g++ % -g -o %<" 
exec "!gdb %<" 
"Java程序 
exec "!rm %<.class" 
elseif &filetype == 'java' 
exec "!javac %" 
exec "!jdb %<" 
endif 
endfunc 
"定义dubug结束 

autocmd BufNewFile *.cc,*.sh,*.java exec ":call SetTitle()" 
"新建.cc,.java,.sh, 
"定义函数SetTitle,自动插入文件头 
func SetTitle() 
"如果文件类型为.sh文件 
if &filetype == 'sh' 
call setline(1, "/#!/bin/bash") 
call append(line("."), "/#########################################################################") 
call append(line(".")+1, "/# Author: gnuhpc(http://blog.csdn.net/gnuhpc)") 
call append(line(".")+2, "/# Created Time: ".strftime("%c")) 
call append(line(".")+3, "/# File Name: ".expand("%")) 
call append(line(".")+4, "/# Description: ") 
call append(line(".")+5, "/#########################################################################") 
call append(line(".")+6, "") 
else 
call setline(1, "/*************************************************************************") 
call append(line("."), " Author: gnuhpc(http://blog.csdn.net/gnuhpc)") 
call append(line(".")+1, " Created Time: ".strftime("%c")) 
call append(line(".")+2, " File Name: ".expand("%")) 
call append(line(".")+3, " Description: ") 
call append(line(".")+4, " ************************************************************************/") 
call append(line(".")+5, "") 
endif 
endfunc 

"自动将shell脚本设置为可执行权限 
au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent !chmod a+x | endif | endif
"保存上次打开的位置 
if has("autocmd")



   autocmd BufRead *.txt set tw=78



   autocmd BufReadPost *



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



      /   exe "normal g'/"" |



      / endif



endif

总结一下现在可以使用的快捷键:

F3                   文件浏览器 
F4                   Tags浏览器 
F5                   make 
2*F5               make clean 
F6                   quickfix查看详细信息 
2*F6               关闭详细信息 
F7                   下一个结果 
2*F7               上一个结果 
F8                   编译和运行单个程序 
2*F8               调试单个程序 
F9                   编译 
Ctrl+F9            执行 
Shift+F9          设置命令行参数                
F12                 在该行后边添加注释 
Shift+F12        注释掉该行 
2*(Shift+F12) 去掉改行的注释 
F11                 格式化代码 
F10                 建立目录及子目录下的索引Tags 
Shift+t            新建标签 
2*(Shift+t)     标签间跳转 
Shift+o           建立新行但是不插入 
Ctrl+a             全选 
2*(Shift+q)     快速不保存 
Ctrl+h             替换 



Tags相关:Ctrl+/+字母

    * s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方 
    * g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能 
    * d: 查找本函数调用的函数 
    * c: 查找调用本函数的函数 
    * t: 查找指定的字符串 
    * e: 查找egrep模式,相当于egrep功能,但查找速度快多了 
    * f: 查找并打开文件,类似vim的find功能 
    * i: 查找包含本文件的文件 

TagList操作:

          跳到光标下tag所定义的位置,用鼠标双击此tag功能也一样 
o             在一个新打开的窗口中显示光标下tag 
       显示光标下tag的原型定义 
u             更新taglist窗口中的tag 
s             更改排序方式,在按名字排序和按出现顺序排序间切换 
x             taglist窗口放大和缩小,方便查看较长的tag 
+             打开一个折叠,同zo 
-             将tag折叠起来,同zc 
*             打开所有的折叠,同zR 
=             将所有tag折叠起来,同zM 
[[            跳到前一个文件 
]]            跳到后一个文件 
q             关闭taglist窗口 
          显示帮助 
在浏览代码时Taglist常用操作为: 
gd 转到当前光标所指的局部变量的定义 
* 转到当前光标所指的单词下一次出现的地方 
# 转到当前光标所指的单词上一次出现的地方 
ctrl+] 转到函数定义的地方 
ctrl+o 回退到函数调用的地方 

Winmanager文件操作技巧:

  显示帮助
  如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件
- 返回上级目录
c 切换vim 当前工作目录正在浏览的目录
d 创建目录
D 删除目录或文件
i 切换显示方式
R 文件或目录重命名
s 选择排序方式
x 定制浏览方式, 使用你指定的程序打开该文件


C-Support常见补全结构与快捷键

-- 常用结构 --------------------------------------------------------- 
/sd do { } while 
/sf for 
/sfo for { } 
/sif if { } 
/sife if { } else { } 
/swh while { } (n,v,i) 
/ss switch (n,v,i) 
/sc case (n,i) 
/s{ { } (n,v,i) 

-- 预处理命令 ------------------------------------------------------- 
/p< #include <> (n,i) 
/p" #include "" (n,i) 
/pd #define (n,i) 
/pu #undef (n,i) 
/pie #if #else #endif (n,v,i) 
/pid #ifdef #else #endif (n,v,i) 
/pin #ifndef #else #endif (n,v,i) 
/pind #ifndef #def #endif (n,v,i) 
/pi0 #if 0 #endif (n,v,i) 
/pr0 remove #if 0 #endif (n,i) 
/pe #error (n,i) 
/pl #line (n,i) 
/pp #pragma (n,i) 

-- 常用短语 ------------------------------------------------------------- 
/im main() (n,v,i) 
/i0 for( x=0; x 
/in for( x=n-1; x>=0; x-=1 ) (n,v,i) 
/ie enum + typedef (n,i) 
/is struct + typedef (n,i) 
/iu union + typedef (n,i) 
/ip printf() (n,i) 
/isc scanf() (n,i) 
/ica p=calloc() (n,i) 
/ima p=malloc() (n,i) 
/isi sizeof() (n,v,i) 
/ias assert() (n,v) 

-- C++ ---------------------------------------------------------------- 
/+c class (n,i) 
/+cn class (using new) (n,i) 
/+ci class implementation (n,i) 
/+cni class (using new) implementation (n,i) 
/+mi method implementation (n,i) 
/+ai accessor implementation (n,i) 

/+tc template class (n,i) 
/+tcn template class (using new) (n,i) 
/+tci template class implementation (n,i) 
/+tcni template class (using new) impl. (n,i) 
/+tmi template method implementation (n,i) 
/+tai template accessor implementation (n,i) 

/+tf template function (n,i) 
/+ec error class (n,i) 
/+tr try ... catch (n,v,i) 
/+ca catch (n,v,i) 
/+c. catch(...) (n,v,i) 


Code Complete常用结构:Ctrl +b补全

xt 插入当前时间 

        C/C++语言:

cc /*  */ 
de #define 
in #include    "" 
is #include    <> 
ff #ifndef  
ife  if...els 

       BASH:

sif               if 
sife             if...els 
scase          case 
swhile         while 
suntil          until 
sfor             for 
sselect        select

参考文献:

http://www.vimer.cn/
http://qixinglu.com/archives/vim_key_mapping
http://easwy.com/blog/archives/advanced-vim-skills-cscope/
http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx

附上述vimrc配置文件:

"基本配置 
set wildmenu 
"增强模式中的命令行自动完成操作 
set foldmethod=manual 
"设定折叠方式为手动 
set helplang=cn 
"设置帮助的语言为中文 
set cin    
"实现C程序的缩进 
set sw=4   
"设计(自动) 缩进使用4个空格 
set sta    
"插入<tab>时使用'shiftwidth' 
set backspace=2 
"指明在插入模式下可以使用<BS>删除光标前面的字符 
syntax enable 
"设置高亮关键字显示 
set nocompatible 
"去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限 
set number 
"显示行号 
filetype on 
"检测文件的类型 
map <fe> :q 
set history=1000 
""记录历史的行数 
set background=dark 
"背景使用黑色 
syntax on 
"语法高亮度显示 
set autoindent 
set smartindent 
"上面两行在进行编写代码时,在格式对起上很有用; 
"第一行,vim使用自动对起,也就是把当前行的对起格式应用到下一行; 
"第二行,依据上面的对起格式,智能的选择对起方式,对于类似C语言编写上很有用 
"第一行设置tab键为4个空格,第二行设置当行之间交错时使用4个空格 
set tabstop=4 
set shiftwidth=4 
set showmatch 
"设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号 
set ruler 
"在编辑过程中,在右下角显示光标位置的状态行 
set incsearch 
"查询时非常方便,如要查找book单词,当输入到/b时,会自动找到第一 
"个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的单词,依 
"次类推,进行查找时,使用此设置会快速找到答案,当你找要匹配的单词 
"时,别忘记回车。 
 set enc=chinese 
"设置编码为中文 
set winaltkeys=no 
"Alt组合键不映射到菜单上 

set helplang=cn 

filetype plugin on 

"禁止自动改变当前Vim窗口的大小 
let Tlist_Inc_Winwidth=0 
"把方法列表放在屏幕的右侧 
let Tlist_Use_Right_Window=1 
"让当前不被编辑的文件的方法列表自动折叠起来, 这样可以节约一些屏幕空间 
let Tlist_File_Fold_Auto_Close=1 
"映射F4为功能键调出tages浏览器 
"映射F3为功能键调出winmanager的文件浏览器 
"let g:winManagerWindowLayout='FileExplorer|TagList' "你要是喜欢这种布局可以注释掉这一行 
map <F4> :TlistToggle<cr> 
map <F3> :WMToggle<cr> 
"将当前的工程的tags导入 
set tags=./tags 
"将系统已经生成的tags导入 
set tags+=~/.vim/systags 

    map <F10> :call Do_CsTag()<CR>//以后按F10就可以对一个工程进行tags索引建立并且引入了 
    nmap <C-/>s :cs find s <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-/>g :cs find g <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-/>c :cs find c <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-/>t :cs find t <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-/>e :cs find e <C-R>=expand("<cword>")<CR><CR>   
    nmap <C-/>f :cs find f <C-R>=expand("<cfile>")<CR><CR>   
    nmap <C-/>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR> 
    nmap <C-/>d :cs find d <C-R>=expand("<cword>")<CR><CR> 
    function Do_CsTag() 
        if(executable('cscope') && has("cscope") ) 
            if(g:iswindows!=1) 
                silent! execute "!find . -name '*.h' -o -name '*.c' -o -name '*.cpp' -o -name '*.java' -o -name '*.cs' -o -name '*.cxx' -o -name '*.hxx'> cscope.files" 
            else 
                silent! execute "!dir /b *.c,*.cpp,*.h,*.java,*.cs >> cscope.files" 
            endif 
            silent! execute "!cscope -bq" 
            if filereadable("cscope.out") 
                execute "cs add cscope.out" 
            endif 
        endif 
    endf 

"定义源代码格式化 
map <F11>:call FormartSrc()<CR> 
"定义FormartSrc() 
func FormartSrc() 
exec "w" 
"C程序,Perl程序,Python程序 
if &filetype == 'c' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
elseif &filetype == 'cpp' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
elseif &filetype == 'perl' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
elseif &filetype == 'py' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
"Java程序 
elseif &filetype == 'java' 
exec "!astyle --style=java --suffix=none %" 
exec "e! %" 
elseif &filetype == 'jsp' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
elseif &filetype == 'xml' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
elseif &filetype == 'html' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
elseif &filetype == 'htm' 
exec "!astyle --style=gnu --suffix=none %" 
exec "e! %" 
endif 
endfunc 
"结束定义FormartSrc 

"设置tab的快捷键 
"Shift+t为新建一个标签,按两次Shirt+t为跳转标签 
map <S-t> :tabnew .<CR> 
map <S-t><S-t> <ESC>:tabnext<CR> 

"设置建立新行但是不插入 
map <S-o> o<ESC><CR> 
"设置全选快捷键 
map <C-a> ggVG 
"设置快速不保存退出快捷键 
map <S-q><S-q> :q!<CR>:q!<CR>:q!<CR> 

"替换 
map <C-H> :L1,L2s/src/tar/g 
imap <C-H> <Esc><C-H> 

"设置快速注释键 
"F12是在该行后边添加注释,Shift+F12为注释掉该行,两次Shift+F12是去掉改行的注释,然后将光标置于下一行 
map <S-F12> <ESC>I//<ESC><CR> 
map! <S-F12> <ESC>I//<ESC><CR> 
map <S-F12><S-F12> 02x<ESC><CR> 
map! <S-F12><S-F12> <ESC>02x<ESC><CR> 
map <F12> <ESC>$a// 
map! <F12> <ESC>$a// 

"设置编译快捷键 
"F5为make,两次F5为make clean 
"F6为quickfix,查看详细信息, 两次F6关闭详细信息 
"F7为下一个结果,两次F7为上一个结果 
"F8为编译和运行单个程序、两次F8为调试 
map <F5> :make<CR> 
map <F5><F5> :make clean<CR> 
map <F6> :cw<CR> 
map <F6><F6> :ccl<CR> 
map <F7> :cn<CR> 
map <F7><F7> :cp<CR> 
map <F8> :call CompileRun()<CR> 
map <F8><F8> :call Debug()<CR> 


"定义CompileRun函数,用来对不用外接库的小程序进行编译和运行,自己可以根据文件名扩展或实际情况修改参数 
func CompileRun() 
exec "w" 
"C程序 
if &filetype == 'c' 
exec "!gcc % -g -o %<" 
exec "!.//%<" 
endif 
endfunc 
"结束定义CompileRun 

"定义Debug函数,用来调试小程序 
func Debug() 
exec "w" 
"C程序 
if &filetype == 'c' 
exec "!rm %<" 
exec "!gcc % -g -o %<" 
exec "!gdb %<" 
elseif &filetype == 'cpp' 
exec "!rm %<" 
exec "!g++ % -g -o %<" 
exec "!gdb %<" 
"Java程序 
exec "!rm %<.class" 
elseif &filetype == 'java' 
exec "!javac %" 
exec "!jdb %<" 
endif 
endfunc 
"定义dubug结束 

autocmd BufNewFile *.cc,*.sh,*.java exec ":call SetTitle()" 
"新建.cc,.java,.sh, 
"定义函数SetTitle,自动插入文件头 
func SetTitle() 
"如果文件类型为.sh文件 
if &filetype == 'sh' 
call setline(1, "/#!/bin/bash") 
call append(line("."), "/#########################################################################") 
call append(line(".")+1, "/# Author: gnuhpc(http://blog.csdn.net/gnuhpc)") 
call append(line(".")+2, "/# Created Time: ".strftime("%c")) 
call append(line(".")+3, "/# File Name: ".expand("%")) 
call append(line(".")+4, "/# Description: ") 
call append(line(".")+5, "/#########################################################################") 
call append(line(".")+6, "") 
else 
call setline(1, "/*************************************************************************") 
call append(line("."), " Author: gnuhpc(http://blog.csdn.net/gnuhpc)") 
call append(line(".")+1, " Created Time: ".strftime("%c")) 
call append(line(".")+2, " File Name: ".expand("%")) 
call append(line(".")+3, " Description: ") 
call append(line(".")+4, " ************************************************************************/") 
call append(line(".")+5, "") 
endif 
endfunc 

"自动将shell脚本设置为可执行权限 
au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent !chmod a+x <afile> | endif | endif 
"保存上次打开的位置 
if has("autocmd")



   autocmd BufRead *.txt set tw=78



   autocmd BufReadPost *



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



      /   exe "normal g'/"" |



      / endif



endif
 
声明:OSCHINA 博客文章版权属于作者,受法律保护。未经作者同意不得转载。
posted @ 2012-12-15 18:54  北海石松  阅读(1137)  评论(0)    收藏  举报