代码编辑工具犹如古代士兵战场上的战马,非常重要。于是狠心补齐了一下这个短板。
主要参考的是两个资料:
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 off
set 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 on
filetype plugin on
nmap LB 0
nmap LE $
"copy select
vnoremap <Leader>y "+y
"paste copy to vim
nmap <Leader>p "+p
set autowrite
"close current split window
nmap <Leader>q :q<CR>
"save current window
nmap <Leader>w :w<CR>
"save and close window
nmap <Leader>WQ :wa<CR>:q<CR>
"exit and no save
nmap <Leader>Q :qa<CR>
"iterate all sub window
nnoremap nw <C-W><C-W>
"jump to right window
nnoremap <Leader>lw <C-W>l
"jump to left window
nnoremap <Leader>hw <C-W>h
"jump to up window
nnoremap <Leader>kw <C-W>k
"jump to down window
nnoremap <Leader>jw <C-W>j
"define match
nmap <Leader>M %
autocmd BufWritePost $MYVIMRC source $MYVIMRC
"open realtime search
set incsearch
"ignore case
set ignorecase
" highlight search results
set hlsearch
set smartcase
"close compatible mode
set nocompatible
"vim smart complete
set wildmenu
set background=dark
colorscheme solarized
"forbid shining
set gcr=a:block-blinkon0
"forbid scrollbar
set guioptions-=l
set guioptions-=L
set guioptions-=r
set guioptions-=R
"forbid menu and toolbar
set guioptions-=m
set guioptions-=T
"encapsulate outer cmd wmctrl
fun! ToggleFullscreen()
call system("wmctrl -ir " . v:windowid . " -b toggle,fullscreen")
endf
"fullscreen button
map <silent> <F11> :call ToggleFullscreen()<CR>
"fullscreen when start
autocmd VimEnter * call ToggleFullscreen()
" always show status line
set laststatus=2
" show cursor location
set ruler
" show line num
set number
" highlight current row/column
set cursorline
set cursorcolumn
" set gvim font
"set guifont=YaHei\ Consolas\ Hybrid\ 11.5
" disable wrap line
set nowrap
" set status line theme
let g:Powerline_colorscheme='solarized256'
" enable syntax
syntax enable
syntax on
" adaptive smart indent
filetype indent on
" expand tab to whitespace
set expandtab
" set tab =? whitespace
set tabstop=4
set shiftwidth=4
set softtabstop=4
" start with vim
let g:indent_guides_enable_on_vim_startup=1
let g:indent_guides_start_level=2
let g:indent_guides_guide_size=1
nmap <silent> <Leader>i <Plug>IndentGuidesToggle
set foldmethod=syntax
"set foldlevel=100
set nofoldenable
set foldcolumn=5
nmap <silent> <Leader>sw :FSHere<cr>
let tagbar_left=1
nnoremap <Leader>ilt :TagbarToggle<CR>
let tagbar_width=32
let g:tagbar_compact=1
let 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.tags
set tags+=/usr/include/sys.tags
imap <F3> <C-X><C-O>
imap <F2> <C-X><C-I>
" close smart complete preview window
set completeopt=menu,menuone
let OmniCpp_MayCompleteDot=1
let OmniCpp_MayCompleteArrow=1
let OmniCpp_MayCompleteScope=1
let OminCpp_SelectFirstItem=2
let OmniCpp_NamespaceSearch=2
let OmniCpp_ShowPrototypeInAbbr=1
let OmniCpp_GlobalScopeSearch=1
let OmniCpp_DisplayMode=1
let OmniCpp_DefaultNamespaces=["std"]
let OmniCpp_ShowScopeInAbbr=1
let OmniCpp_ShowAccess=1
"let g:protodefProtogetter='~/.vim/bundle/vim-protodef/pullproto.pl'
"let g:disable_protodef_sorting=1
nmap <Leader>fl :NERDTreeToggle<CR>
let NERDTreeWinSize=32
let NERDTreeWinPos='right'
let NERDTreeShowHidden=1
let NERDTreeMinialUI=1
let NERDTreeAutoDeleteBuffer=1
map <Leader>bl :MBEToggle<CR>
map <C-Tab> :MBEbn<CR>
map <C-S-Tab> :MBEbp<CR>
let g:miniBufExplMapWindowNavVim=1
let g:miniBufExplMapWindowNavArrows=1
let g:miniBufExplMapCTabSwitchBufs=1
let g:miniBufExplModSelTarget=1
set sessionoptions="blank,buffers,globals,localoptions,tabpages,sesdir,folds,help,options,resize,winpos,winsize"
set undodir=~/.undo_history/
set undofile
map <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 showcmd
set showmode
map <silent><Leader>tl :TlistToggle<CR>
let Tlist_Ctags_Cmd='ctags'
let Tlist_Use_Right_window=1
let Tlist_Show_One_File=0
let Tlist_File_Fold_Auto_Close=1
let Tlist_Exit_OnlyWindow=1
let Tlist_Process_File_Always=1
let Tlist_Inc_Winwidth=0
map <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 csverb
endif
map <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>