vim作为IDE的简单配置

本文参考以下两位作者的文章, 在其基础上稍做修改, 仅供学习

本人环境: 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

先来个整体布局图



左边是函数列表, 右边是文件列表, 中间....

详细配置过程大家直接参考上面两位大神的操作一遍,相信效果会更好

时间有限, 有时间再补充, 希望能帮到大家, 谢谢



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值