[心得]基于vim打造高级代码开发环境

来源:互联网 发布:mac安装python2.7 编辑:程序博客网 时间:2024/06/18 07:34

代码编辑工具犹如古代士兵战场上的战马,非常重要。于是狠心补齐了一下这个短板。

主要参考的是两个资料:
https://github.com/yangyangwithgnu/use_vim_as_ide#6.1
http://blog.csdn.net/zxasqwedc/article/details/12358275

插件搜索来自这里:
https://github.com/vim-scripts/

实践
下面从0开始打造vim高级开发环境:
首先,定义前缀:
let mapleader=’;’

接着,定义一些常用的快捷键:
出于markdown有些字符有特殊含义,具体的命令不写了,请参考原始链接。这里只说其含义。

打开文件类型以及对应插件检测
;y 复制选中文本
;p 粘贴复制文本
;q 退出
;w 保存
;WQ 保存所有并退出
;Q 退出所有不保存

nw跳到下一个窗口
;lw 跳右侧窗口
;hw 跳左侧窗口
;kw 跳上侧窗口
;jw 跳下侧窗口
用% 匹配括号

实时搜索
不区分大小写
高亮搜索

设置背景色为黑色
设置主题为素雅solarized

禁止光标闪烁
禁止滚动条
禁止菜单和工具条

centos下用wmctrl控制全屏
总是显示状态栏
显示光标位置
显示行号
显示光标当前行和当前列

高亮语法
支持智能缩进
;i 切换显示竖线缩进对应条
按语义对代码行进行折叠
初始时展开所有折叠

;ilt 切换tagbar的状态
这个插件和taglist类似

za 打开或关闭当前折叠
zR打开所有折叠
zM折叠所有行

;sw 快速在.h和.cpp之间切换

ctags
ctag支持的标签:
c classes
d macro definitions
e enumerators (values inside an enumeration)
f function definitions
g enumeration names
l local variables [off]
m class, struct, and union members
n namespaces
p function prototypes [off]
s structure names
t typedefs
u union names
v variable definitions
x external and forward variable declarations [off]

让ycm插件自动引入标签:
let g:indexer_ctagsCommandLineOptions=”–c++-kinds=+p+l+x+c+d+e+f+g+m+n+s+t+u+v –fields=+iaSl –extra=+q”

;sp 进行快速搜索匹配
由接口快速生成实现框架 ultisnip

基于标签智能补全 omnicppcomplete
工程文件浏览NERDTree
;fl 打开工程文件浏览窗口
常用操作:
回车 -》打开文件
r -》刷新列表
I -》显示隐藏.文件
m-》跳出创建/删除等菜单

;bl 切换显示或隐藏minibufferexplorer
;tl 显示或者隐藏taglist

使用easymotion插件
;;f + 字符 -》将对要查找的字符模式编号,快速跳动

使用ctags进行快速跳转
ctrl+] 跳到当前单词的标签处
ctrl+o跳回上一次光标停留处
ctrl+t跳回上一个标签

vim自动补全——OmniCppComplete,另一个插件YouCompleteMe已经集成该插件

CSCOPE-ctags进化版
cscope的主要功能是通过其”find”子命令来实现的
“cscope find”的用法:
cs find c|d|e|f|g|i|s|t name
0 或 s 查找这个 C 符号(可以跳过注释)
1 或 g 查找这个定义
2 或 d 查找这个函数调用的函数
3 或 c 查找调用过这个函数的函数
4 或 t 查找这个字符串
6 或 e 查找这个 egrep 模式
7 或 f 查找这个文件
8 或 i 查找包含这个文件的文件
用法:
<1>、为源码建立一个cscope数据库
<2>、用vim打开某个源码文件,末行模式下,输入“:cs add cscope.out”(该命令已被我们映射为快捷键F4),添加cscope数据库到vim。因为我们已将vim配置为启动时,自动添加当前目录下的cscope数据库,所以你再添加该cscope数据库时,vim会提示“重复cscope数据库 未被加入“
<3>、完成前两步后,现在就可以用“cs find c”等Cscope查找命令查找关键字了。我们已在.vimrc中将“cs find c”等Cscope查找命令映射为c等快捷键(按法是先按Ctrl+Shift+-, 然后很快按下c)

终于快到尾声了,这篇博客边练手边写,花了整整一个上午!

常用快捷键
1. % 跳转到配对的括号去
2. [[ 跳转到当前或者上一代码块(函数定义、类定义等)的开头去(但要求代码块中’{‘必须单独占一行)
3. ][ 跳转到当前代码块(函数定义、类定义等)的结尾去(但要求代码块中’{‘必须单独占一行)
4. ]] 跳转到下一代码块(函数定义、类定义等)的开头去(但要求代码块中’{‘必须单独占一行)
5. [/ 跳到注释开头(只对/* */注释有效)
6. ]/ 跳到注释结尾(只对/* */注释有效) centOS上经实际使用无效
7. gD 跳转到当前文件内标识符首次出现的位置,可用于跳转到全部变量的定义处;查找局部变量时,要是多个函数中定义了该局部变量,使用gD进行查找,找到的变量定义可能不是你需要的
8. gd 跳转到当前函数内标识符首次出现的位置,可用于跳转到局部变量的定义处
9. ” 跳转到光标上次停靠的地方, 是两个’, 而不是一个”
10. mx 设置书签,x只能是a-z的26个字母
11. `x 跳转到书签处(“`”是1左边的键)
12. > 增加缩进,”x>”表示增加以下x行的缩进
13. < 减少缩进,”x<”表示减少以下x行的缩进

最后给一个完整的设置出来:

filetype offset rtp+=/home/topcoder/.vim/bundle/vundle/call vundle#begin()Plugin 'VundleVim/Vundle.vim'Plugin 'altercation/vim-colors-solarized'Plugin 'tomasr/molokai'Plugin 'vim-scripts/phd'Plugin 'Lokaltog/vim-powerline'Plugin 'octol/vim-cpp-enhanced-highlight'Plugin 'nathanaelkane/vim-indent-guides'Plugin 'derekwyatt/vim-fswitch'Plugin 'kshenoy/vim-signature'Plugin 'vim-scripts/BOOKMARKS--Mark-and-Highlight-Full-Lines'Plugin 'majutsushi/tagbar'Plugin 'vim-scripts/indexer.tar.gz'Plugin 'vim-scripts/DfrankUtil'Plugin 'vim-scripts/vimprj'Plugin 'dyng/ctrlsf.vim'Plugin 'terryma/vim-multiple-cursors'Plugin 'scrooloose/nerdcommenter'Plugin 'vim-scripts/DrawIt'Plugin 'SirVer/ultisnips'Plugin 'Valloric/YouCompleteMe'Plugin 'derekwyatt/vim-protodef'Plugin 'scrooloose/nerdtree'Plugin 'fholgado/minibufexpl.vim'Plugin 'gcmt/wildfire.vim'Plugin 'sjl/gundo.vim'Plugin 'Lokaltog/vim-easymotion'"Plugin 'suan/vim-instant-markdown'"Plugin 'lilydjwg/fcitx.vim'Plugin 'vim-scripts/taglist.vim'Plugin 'vimplugin/project.vim'Plugin 'vim-scripts/OmniCppComplete'Plugin 'vim-scripts/echofunc.vim'call vundle#end()filetype plugin indent on"define map prefix <Leader>let mapleader=";"filetype onfiletype plugin onnmap LB 0nmap LE $"copy selectvnoremap <Leader>y "+y "paste copy to vimnmap <Leader>p "+pset autowrite        "close current split windownmap <Leader>q :q<CR>"save current windownmap <Leader>w :w<CR>"save and close windownmap <Leader>WQ :wa<CR>:q<CR>"exit and no savenmap <Leader>Q :qa<CR>"iterate all sub windownnoremap nw <C-W><C-W>"jump to right windownnoremap <Leader>lw <C-W>l"jump to left windownnoremap <Leader>hw <C-W>h"jump to up windownnoremap <Leader>kw <C-W>k"jump to down windownnoremap <Leader>jw <C-W>j"define matchnmap <Leader>M %autocmd BufWritePost $MYVIMRC source $MYVIMRC "open realtime searchset incsearch"ignore caseset ignorecase" highlight search resultsset hlsearchset smartcase        "close compatible modeset nocompatible"vim smart completeset wildmenuset background=darkcolorscheme solarized"forbid shiningset gcr=a:block-blinkon0"forbid scrollbarset guioptions-=lset guioptions-=Lset guioptions-=rset guioptions-=R"forbid menu and toolbarset guioptions-=mset guioptions-=T"encapsulate outer cmd wmctrlfun! ToggleFullscreen()    call system("wmctrl -ir " . v:windowid . " -b toggle,fullscreen")endf"fullscreen buttonmap <silent> <F11> :call ToggleFullscreen()<CR>"fullscreen when startautocmd VimEnter * call ToggleFullscreen()" always show status lineset laststatus=2" show cursor locationset ruler" show line numset number" highlight current row/columnset cursorlineset cursorcolumn" set gvim font"set guifont=YaHei\ Consolas\ Hybrid\ 11.5" disable wrap lineset nowrap" set status line themelet g:Powerline_colorscheme='solarized256'" enable syntaxsyntax enablesyntax on" adaptive smart indentfiletype indent on" expand tab to whitespaceset expandtab" set tab =? whitespaceset tabstop=4set shiftwidth=4set softtabstop=4" start with vimlet g:indent_guides_enable_on_vim_startup=1let g:indent_guides_start_level=2let g:indent_guides_guide_size=1nmap <silent> <Leader>i <Plug>IndentGuidesToggleset foldmethod=syntax"set foldlevel=100set nofoldenableset foldcolumn=5nmap <silent> <Leader>sw :FSHere<cr>let tagbar_left=1nnoremap <Leader>ilt :TagbarToggle<CR>let tagbar_width=32let g:tagbar_compact=1let g:tagbar_type_cpp = {            \ 'kinds' : [            \ 'c:classes:0:1',            \ 'd:macros:0:1',            \ 'e:enuerators:0:0',            \ 'f:functions:0:1',            \ 'g:enumeration:0:1',            \ 'l:local:0:1',            \ 'm:members:0:1',            \ 'n:namespaces:0:1',            \ 'p:functions_prototypes:0:1',            \ 's:structs:0:1',            \ 't:typedefs:0:1',            \ 'u:unions:0:1',            \ 'v:global:0:1',            \ 'x:external:0:1'            \ ],            \ 'sro':'::',            \ 'kind2scope': {                \ 'g':'enum',                \ 'n':'namespace',                \ 'c':'class',                \ 'u':'union'                \ },            \ 'scope2kind': {                \ 'enum': 'g',                \ 'namespace':'n',                \ 'class': 'c',                \ 'struct':'s',                \ 'union':'u'            \ }\ }nmap <Leader>tn :tnext<CR>nmap <Leader>tp :tprevious<CR>let g:indexer_ctagsCommandLineOptions="--c++-kinds=+p+l+x+c+d+e+f+g+m+n+s+t+u+v --fields=+liaS --extra=+q""nnoremap <Leader>jc :YcmCompleter GoToDeclaration<CR>"nnoremap <Leader>jd :YcmCompleter GoToDefinition<CR>nnoremap <Leader>sp :CtrlSF<CR>"let g:UltiSnipsSnippetDirectories=["mysnippets"]let g:UltiSnipsExpandTrigger="<Leader><tab>"let g:UltiSnipsJumpForwardTrigger="<Leader><tab>"let g:UltiSnipsJumpBackwardTrigger="<Leader><s-tab>""let OmniDefaultNamespaces=["_GLIBCXX_STD"]set tags+=/usr/include/c++/4.4.7/stdcpp.tagsset tags+=/usr/include/sys.tagsimap <F3> <C-X><C-O>imap <F2> <C-X><C-I>" close smart complete preview windowset completeopt=menu,menuonelet OmniCpp_MayCompleteDot=1let OmniCpp_MayCompleteArrow=1let OmniCpp_MayCompleteScope=1let OminCpp_SelectFirstItem=2let OmniCpp_NamespaceSearch=2let OmniCpp_ShowPrototypeInAbbr=1let OmniCpp_GlobalScopeSearch=1let OmniCpp_DisplayMode=1let OmniCpp_DefaultNamespaces=["std"]let OmniCpp_ShowScopeInAbbr=1let OmniCpp_ShowAccess=1"let g:protodefProtogetter='~/.vim/bundle/vim-protodef/pullproto.pl'"let g:disable_protodef_sorting=1nmap <Leader>fl :NERDTreeToggle<CR>let NERDTreeWinSize=32let NERDTreeWinPos='right'let NERDTreeShowHidden=1let NERDTreeMinialUI=1let NERDTreeAutoDeleteBuffer=1map <Leader>bl :MBEToggle<CR>map <C-Tab> :MBEbn<CR>map <C-S-Tab> :MBEbp<CR>let g:miniBufExplMapWindowNavVim=1let g:miniBufExplMapWindowNavArrows=1let g:miniBufExplMapCTabSwitchBufs=1let g:miniBufExplModSelTarget=1set sessionoptions="blank,buffers,globals,localoptions,tabpages,sesdir,folds,help,options,resize,winpos,winsize"set undodir=~/.undo_history/set undofilemap <Leader>ss :mksession! my.vim<CR> :wviminfo! my.viminfo<CR>map <Leader>rs :source my.vim<CR> :rviminfo my.viminfo<CR>set backspace=2    set showmatch        set linebreak        set whichwrap=b,s,<,>,[,] "set mouse=a            set mouse=            " Disable mouse usage (all modes)set showcmdset showmodemap <silent><Leader>tl :TlistToggle<CR>let Tlist_Ctags_Cmd='ctags'let Tlist_Use_Right_window=1let Tlist_Show_One_File=0let Tlist_File_Fold_Auto_Close=1let Tlist_Exit_OnlyWindow=1let Tlist_Process_File_Always=1let Tlist_Inc_Winwidth=0map <F6> :make clean<CR><CR><CR>map <F7> :make<CR><CR><CR>:copen<CR><CR>map <F8> :cp<CR>map <F9> :cn<CR>if has('cscope')    set csprg=/usr/bin/cscope    set csto=0    set cst    set cscopequickfix=s-,c-,d-,i-,t-,e-    set nocsverb    if filereadable('cscope.out')        cs add cscope.out    elseif $CSCOPE_DB != ""        cs add $CSCOPE_DB    endif    set csverbendifmap <F4> :cs add ./cscope.out<CR><CR><CR> :cs reset<CR>imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>map <C-_>s:cs find s <C-R>=expand("<cword>")<CR><CR>:copen<CR><CR>nmap <C-_>g:cs find g <C-R>=expand("<cword>")<CR><CR>nmap <C-_>d:cs find d <C-R>=expand("<cword>")<CR><CR>:copen<CR><CR>nmap <C-_>c:cs find c <C-R>=expand("<cword>")<CR><CR>:copen<CR><CR>nmap <C-_>t:cs find t <C-R>=expand("<cword>")<CR><CR>:copen<CR><CR>nmap <C-_>e:cs find e <C-R>=expand("<cword>")<CR><CR>:copen<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>:copen<CR><CR>
0 0
原创粉丝点击