本文参考以下两位作者的文章, 在其基础上稍做修改, 仅供学习
本人环境: CentOS 6.8 vim7.4
http://blog.chinaunix.net/uid-22606185-id-3373132.html
https://github.com/yangyangwithgnu/use_vim_as_ide#3.2
1. 此前直接在linux下面写代码, 用的eclipse, 但这个启动时间... 对于追求效率(急性子)的人实在忍不了, CodeBlocks怎么配置都不爽,而且启动时间也有一点点长
2. 后来做嵌入开发,就把系统装到vm了,很方便, 系统配置不满意了,可以恢复到快照, 搞个samba/nfs, 公司同事都用source insight, 不错的工具,
但其界面实在说不上好看, 加上其没有折叠功能; 如果很不幸的你拿到一个不是很精致的代码, 哼哼...小心你的右手要废掉
3. vs很强, 只是太臃肿
4. 但是伟大的互联网告诉我, vim和emacs也可以做轻巧的IDE, 而且很灵活, 一个编辑器之神, 一个神之编辑器, 咱不是神, 曾经搜过emacs的文章, 要么不成熟, 要么无法完整操作
无意间看到上面两位大神的文章, 根据总结了一些东西, 分享出来
以下为本人在其它前辈的基础上总结的, 目前在用, 但还有些不完美, 比如没有添加进YouCompleteMe, 所说它的语法匹配高亮做的比较好.
以下是我的vim配置, 有些功能不能实现, 或者出错的, 暂时屏蔽了. 若有更好的方案, 欢迎留言
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set fileencodings=ucs-bom,utf-8,latin1
endif
" 定义快捷键的前缀,即<Leader>
let mapleader=";"
" 开启语法高亮功能
syntax enable
" 允许用指定语法高亮配色方案替换默认方案
syntax on
filetype on "开启文件类型侦测
filetype plugin on "根据侦测到的不同类型加载对应的插件
" 定义快捷键到行首和行尾
nmap LB 0
nmap LE $
" 设置快捷键将选中文本块复制至系统剪贴板
"vnoremap <Leader>y "+y
" 设置快捷键将系统剪贴板内容粘贴至 vim
"nmap <Leader>p "+p
" 定义快捷键关闭当前分割窗口
nmap <Leader>q :q<CR>
" 定义快捷键保存当前窗口内容
nmap <Leader>w :w<CR>
" 定义快捷键保存所有窗口内容并退出 vim
"nmap <Leader>WQ :wa<CR>:q<CR>
" 不做任何保存,直接退出 vim
"nmap <Leader>Q :qa!<CR>
" 依次遍历子窗口
nnoremap nw <C-W><C-W>
" 跳转至右方的窗口
"nnoremap <Leader>lw <C-W>l
" 跳转至左方的窗口
"nnoremap <Leader>hw <C-W>h
" 跳转至上方的子窗口
"nnoremap <Leader>kw <C-W>k
" 跳转至下方的子窗口
"nnoremap <Leader>jw <C-W>j
" 定义快捷键在结对符之间跳转
nmap <Leader>M %
" 让配置变更立即生效
autocmd BufWritePost $MYVIMRC source $MYVIMRC
set nocompatible " 关闭兼容模式
"set incsearch " 开户实时搜索功能, 打开后搜索速度会变慢
set ignorecase " 搜索时不区分大小写
set wildmenu " vim 自身命令行模式智能补全
"需要安装插件,先找到其在 github.com 的地址,再将配置信息其加入 vimrc
"中的call vundle#begin() 和 call vundle#end()之间,最后进入 vim 执行
":PluginInstall
"便可通知 vundle 自动安装该插件及其帮助文档。
"要卸载插件,先在 vimrc 中注释或者删除对应插件配置信息,然后在 vim 中执行
":PluginClean
"即可删除对应插件。插件更新频率较高,差不多每隔一个月你应该看看哪些插件有推出新版本,批量更新,只需执行
":PluginUpdate
"即可。
"通过 vundle 管理插件后,切勿通过发行套件自带的软件管理工具安装任何插件,不然.vim/ 又要混乱了
"
"vundle 环境设置
filetype off
set rtp+=/usr/share/vim/vimfiles/bundle/Vundle.vim
" vundle 管理的插件列表必须位于 vundle#begin()和vundle#end()之间
call vundle#begin()
Bundle 'gmarik/vundle'
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'
" 打开后报错-start
" Plugin 'everzet/vim-indexer'
" Plugin 'shemere/vim-indexer'
" Plugin 'vim-scripts/DfrankUtil'
" Plugin 'vim-scripts/vimprj'
" Plugin 'dyng/ctrlsf.vim'
" 打开后报错-end
Plugin 'terryma/vim-multiple-cursors'
Plugin 'scrooloose/nerdcommenter'
Plugin 'vim-scripts/DrawIt'
Plugin 'SirVer/ultisnips'
" Plugin 'Valloric/YouCompleteMe'
" Bundle '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'
" 插件列表结束
call vundle#end()
filetype plugin indent on
" 选中结对符内的文本, 一次空格选中最近一层结对符内的文本,
" 两次则选中近两层内的文本,三次三层,依此类推
map <SPACE> <Plug>(wildfire-fuel)
"vmap <S-SPACE> <Plug>(wildfire-water) " 打开后导致enter键也选中文本
" 适用于哪些结对符
let g:wildfire_objects = ["i'", 'i"', "i)", "i]", "i}", "i>", "ip"]
"配色方案, 目前不能用,需下载本色方案: https://github.com/yangyangwithgnu/use_vim_as_ide#3.2
set background=dark
" colorscheme solarized
colorscheme molokai
" colorscheme phd
" 禁止光标闪烁
" set gcr=a:block-blinkon0
" 禁止显示滚动条
set guioptions-=l
set guioptions-=L
set guioptions-=r
set guioptions-=R
" 禁止显示菜单和工具条
set guioptions-=m
set guioptions-=T
"vim-cpp-enhanced-highlight 主要通过
".vim/bundle/vim-cpp-enhanced-highlight/after/syntax/cpp.vim
"控制高亮关键字及规则,所以,当你发现某个 STL
"容器类型未高亮,那么将该类型追加进 cpp.vim 即可。如,initializer_list
"默认并不会高亮,需要添加
let g:cpp_class_scope_highlight=1
let g:cpp_experimental_template_highlight=1
syntax keyword cppSTLtype initializer_list
set bs=indent,eol,start " allow backspacing over everything in insert mode
"set ai " always set autoindenting on
set backup " keep a backup file
set viminfo='20,\"50 " read/write a .viminfo file, don't store more than 50 lines of registers
set history=50 " keep 50 lines of command line history
" 将外部命令 wmctrl 控制窗口最大化的命令行参数封装成一个 vim 的函数
fun! ToggleFullscreen()
call system("wmctrl -ir " . v:windowid . " -b toggle,fullscreen")
endf
" 全屏开/关快捷键
map <silent> <F11> :call ToggleFullscreen()<CR>
" 启动 vim 时自动全屏
autocmd VimEnter * call ToggleFullscreen()
" 总是显示状态栏
set laststatus=2
" 显示光标当前位置
set ruler
" 开启行号显示
set number
" 高亮显示当前行/列
set cursorline
set cursorcolumn
" 高亮显示搜索结果
set hlsearch
" 设置 gvim 显示字体, 中文字体,我喜欢饱满方正的(微软雅黑),英文字体喜欢圆润的(Consolas),
"vim 无法同时使用两种字体,有人制作发布了一款中文字体用微软雅黑、英文字体用 Consolas 的混合字体
"—— yahei consolas hybrid 字体,号称最适合中国程序员使用的字体,效果非常不错,
"由于字体名存在空格,需要用转义符“\”进行转义;最后的 11.5 用于指定字体大小。
"set guifont=YaHei\ Consolas\ Hybrid\ 11.5
"禁止折行
set nowrap
" 设置状态栏主题风格, Powerline插件能在状态显示 文件名, 函数名,
" 文件编码格式,文件类型等信息
let g:Powerline_colorscheme='solarized256' " 状态栏带底色
" let g:Powerline_symbols='unicode' " 带小箭头
let g:Powerline_symbols='fancy' " 带大箭头
set t_Co=256
set term=screen-256color
" 自适应不同语言的智能缩进
filetype indent on
" 将制表符扩展为空格
set expandtab
" 设置编辑时制表符占用空格数
set tabstop=4
" 设置格式化时制表符占用空格数
set shiftwidth=4
" 让 vim 把连续数量的空格视为一个制表符
set softtabstop=4
"用Indent Guides插件,使代码可视化方式关联起来
" 随 vim 自启动
let g:indent_guides_enable_on_vim_startup=1
" 从第二层开始可视化显示缩进
let g:indent_guides_start_level=2
" 色块宽度
let g:indent_guides_guide_size=1
" 快捷键 i 开/关缩进可视化
nmap <silent> <Leader>i <Plug>IndentGuidesToggle
" 接口与实现快速切换: ;sw
"插件 vm-fswitch 在接口文件中,vim 自动帮我找到对应的实现文件,键入快捷键,在新 buffer
"中打开对应实现文件。 *.cpp 和 *.h 间切换, 键入 ;sw 就能在实现文件和接口文件间切换
nmap <silent> <Leader>sw :FSHere<cr>
" 4.5 代码收获
"书签所在行与普通行外观上没任何差别,肉眼,找不到
"让书签可视化的插件,vim-signature(https://github.com/kshenoy/vim-signature")。vim-signature
"通过在书签所在行的前面添加字符的形式,以此可视化书签,这就要求你源码安装的
"vim 具备 signs 特性, 具体在命令模式下键入 :echo has('signs')
" vim-signature 快捷键如下:
let g:SignatureMap = {
\ 'Leader' : "m",
\ 'PlaceNextMark' : "m,",
\ 'ToggleMarkAtLine' : "m.",
\ 'PurgeMarksAtLine' : "m-",
\ 'DeleteMark' : "dm",
\ 'PurgeMarks' : "mda",
\ 'PurgeMarkers' : "m<BS>",
\ 'GotoNextLineAlpha' : "']",
\ 'GotoPrevLineAlpha' : "'[",
\ 'GotoNextSpotAlpha' : "`]",
\ 'GotoPrevSpotAlpha' : "`[",
\ 'GotoNextLineByPos' : "]'",
\ 'GotoPrevLineByPos' : "['",
\ 'GotoNextSpotByPos' : "mn",
\ 'GotoPrevSpotByPos' : "mp",
\ 'GotoNextMarker' : "[+",
\ 'GotoPrevMarker' : "[-",
\ 'GotoNextMarkerAny' : "]=",
\ 'GotoPrevMarkerAny' : "[=",
\ 'ListLocalMarks' : "ms",
\ 'ListLocalMarkers' : "m?"
\ }
" 4.6 标识符列表
" 设置 tagbar 子窗口的位置出现在主编辑区的左边
let tagbar_left=1
" 设置显示/隐藏标签列表子窗口的快捷键。速记:identifier list by tag
nnoremap <Leader>ilt :TagbarToggle<CR>
" 设置标签子窗口的宽度
let tagbar_width=32
" tagbar 子窗口中不显示冗余帮助信息
let g:tagbar_compact=1
" 设置 ctags 对哪些代码标识符生成标签
let g:tagbar_type_cpp = {
\ 'kinds' : [
\ 'c:classes:0:1',
\ 'd:macros:0:1',
\ 'e:enumerators: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',
\ 's' : 'struct',
\ 'u' : 'union'
\ },
\ 'scope2kind' : {
\ 'enum' : 'g',
\ 'namespace' : 'n',
\ 'class' : 'c',
\ 'struct' : 's',
\ 'union' : 'u'
\ }
\ }
" {short}:{long}[:{fold}[:{stl}]]
" --c++-kinds=+p+l+x+c+d+e+f+g+m+n+s+t+u+v
" 4.7 声明/定义跳转
" 正向遍历同名标签
nmap <Leader>tn :tnext<CR>
" 反向遍历同名标签
nmap <Leader>tp :tprevious<CR>
" 设置插件 indexer 调用 ctags 的参数
" 默认 --c++-kinds=+p+l,重新设置为 --c++-kinds=+p+l+x+c+d+e+f+g+m+n+s+t+u+v
" 默认 --fields=+iaS 不满足 YCM 要求,需改为 --fields=+iaSl
" let g:indexer_ctagsCommandLineOptions="--c++-kinds=+p+l+x+c+d+e+f+g+m+n+s+t+u+v --fields=+iaSl --extra=+q"
"基于语义的声明/定义跳转
"有个 vim 插件叫 YCM,有个 C++ 编译器叫 clang,只要正确使用它俩,你将获得无与伦比的代码导航用户体验
nnoremap <leader>jc :YcmCompleter GoToDeclaration<CR>
" 只能是 #include 或已打开的文件
nnoremap <leader>jd :YcmCompleter GoToDefinition<CR>
" 4.9 内容替换
" vim-multiple-cursors 默认快捷键与我系统中其他软件的快捷键冲突,按各自习惯重新设置:
let g:multi_cursor_next_key='<S-n>'
let g:multi_cursor_skip_key='<S-k>'
" 替换函数。参数说明:
" confirm:是否替换前逐一确认
" wholeword:是否整词匹配
" replace:被替换字符串
function! Replace(confirm, wholeword, replace)
wa
let flag = ''
if a:confirm
let flag .= 'gec'
else
let flag .= 'ge'
endif
let search = ''
if a:wholeword
let search .= '\<' . escape(expand('<cword>'), '/\.*$^~[') . '\>'
else
let search .= expand('<cword>')
endif
let replace = escape(a:replace, '/\&~')
execute 'argdo %s/' . search . '/' . replace . '/' . flag . '| update'
endfunction
" 不确认、非整词
nnoremap <Leader>R :call Replace(0, 0, input('Replace '.expand('<cword>').' with: '))<CR>
" 不确认、整词
nnoremap <Leader>rw :call Replace(0, 1, input('Replace '.expand('<cword>').' with: '))<CR>
" 确认、非整词
nnoremap <Leader>rc :call Replace(1, 0, input('Replace '.expand('<cword>').' with: '))<CR>
" 确认、整词
nnoremap <Leader>rcw :call Replace(1, 1, input('Replace '.expand('<cword>').' with: '))<CR>
nnoremap <Leader>rwc :call Replace(1, 1, input('Replace '.expand('<cword>').' with: '))<CR>
" 默认情况下,UltiSnips 模板补全快捷键是 <tab>,与后面介绍的 YCM 快捷键有冲突
" UltiSnips 的 tab 键与 YCM 冲突,重新设定
let g:UltiSnipsExpandTrigger="<leader><tab>"
let g:UltiSnipsJumpForwardTrigger="<leader><tab>"
let g:UltiSnipsJumpBackwardTrigger="<leader><s-tab>"
let OmniCpp_DefaultNamespaces = ["_GLIBCXX_STD"]
" 5.4 由接口快速生成实现框架
" 成员函数的实现顺序与声明顺序一致
let g:disable_protodef_sorting=1
" 设置 pullproto.pl 脚本路径
let g:protodefprotogetter='~/.vim/bundle/vim-protodef/pullproto.pl'
" 成员函数的实现顺序与声明顺序一致
let g:disable_protodef_sorting=1
" 启用:Man命令查看各类man信息
source $VIMRUNTIME/ftplugin/man.vim
" 定义:Man命令查看各类man信息的快捷键
nmap <Leader>man :Man 3 <cword><CR>
" 6 工程文件浏览
" 使用 NERDTree 插件查看工程文件。设置快捷键,速记:file list
nmap <Leader>fl :NERDTreeToggle<CR>
" 设置NERDTree子窗口宽度
let NERDTreeWinSize=32
" 设置NERDTree子窗口位置
let NERDTreeWinPos="right"
" 显示隐藏文件
let NERDTreeShowHidden=1
" NERDTree 子窗口中不显示冗余帮助信息
let NERDTreeMinimalUI=1
" 删除文件时自动删除文件对应 buffer
let NERDTreeAutoDeleteBuffer=1
" 显示/隐藏 MiniBufExplorer 窗口
map <Leader>bl :MBEToggle<cr>
" buffer 切换快捷键
map <C-Tab> :MBEbn<cr>
map <C-S-Tab> :MBEbp<cr>
"有时为了去除干扰,集中精力在某部分代码片段上,我会把不关注部分代码折叠起来。vim
"自身支持多种折叠:手动建立折叠(manual)、基于缩进进行折叠(indent)、基于语法进行折叠(syntax)、未更改文本构成折叠(diff)等等,其中,indent、syntax
"比较适合编程,按需选用。增加如下配置信息:
" 基于缩进或语法进行代码折叠
"set foldmethod=indent
set foldmethod=syntax
" 启动 vim 时关闭折叠代码
set nofoldenable
" Only do this part when compiled with support for autocommands
if has("autocmd")
augroup redhat
autocmd!
" In text files, always limit the width of text to 78 characters
autocmd BufRead *.txt set tw=78
" When editing a file, always jump to the last cursor position
autocmd BufReadPost *
\ if line("'\"") > 0 && line ("'\"") <= line("$") |
\ exe "normal! g'\"" |
\ endif
" don't write swapfile on most commonly used directories for NFS mounts or USB sticks
autocmd BufNewFile,BufReadPre /media/*,/mnt/* set directory=~/tmp,/var/tmp,/tmp
" start with spec file template
autocmd BufNewFile *.spec 0r /usr/share/vim/vimfiles/template.spec
augroup END
endif
if has("cscope") && filereadable("/usr/bin/cscope")
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
endif
" Switch syntax highlighting on, when the terminal has colors
" Also switch on highlighting the last used search pattern.
if &t_Co > 2 || has("gui_running")
syntax on
" set hlsearch
endif
if &term=="xterm"
set t_Co=8
set t_Sb=[4%dm
set t_Sf=[3%dm
endif
" Don't wake up system with blinking cursor:
" http://www.linuxpowertop.org/known.php
let &guicursor = &guicursor . ",a:blinkon0"
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
" add window file manager
let Tlist_Ctags_Cmd='/usr/local/bin/ctags'
let g:winManagerWindowLayout='FileExplorer|TagList'
nmap wm :WMToggle
" scope function definication location and global variables and references .etc
set cscopequickfix=s-,c-,d-,i-,t-,e-
if has("cscope")
set csprg=/usr/local/bin/cscope
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
endif
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>
"查看编译错误信息: cp - find up, cn - find next
nmap cn :cn
nmap cp :cp
"auto completion 括号自动补全 (, {, [, ', "
" :inoremap ( ()
" :inoremap ) =ClosePair(')')
" :inoremap { {}
" :inoremap } =ClosePair('}')
" :inoremap [ []
" :inoremap ] =ClosePair(']')
" :inoremap " ""
" :inoremap ' ''
" function ClosePair(char)
" if getline('.')[col('.') - 1] == a:char
" return "\"
" else
" return a:char
" endif
" endfunction
" 匹配模式,若输入一个左括号,会匹配相应的右括号
set showmatch
set autoindent
set smartindent
"C,C++ 按F7编译运行
map <F7> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!g++ % -o %<"
exec "! ./%<"
elseif &filetype == 'cpp'
exec "!g++ % -o %<"
exec "! ./%<"
elseif &filetype == 'java'
exec "!javac %"
exec "!java %<"
elseif &filetype == 'sh'
:!./%
elseif &filetype == 'py'
exec "!python %"
exec "!python %<"
endif
endfunc
"C,C++的调试
map <C-F5> :call Rungdb()<CR>
func! Rungdb()
exec "w"
exec "!g++ % -g -o %<"
exec "!gdb ./%<"
endfunc
"highlight Functions,这可以高亮函数
syn match cFunction /\<\w\+\%(\s*(\)\@=/
hi default link cFunction Include
先来个整体布局图
左边是函数列表, 右边是文件列表, 中间....
详细配置过程大家直接参考上面两位大神的操作一遍,相信效果会更好
时间有限, 有时间再补充, 希望能帮到大家, 谢谢