vim IDE平臺-打造屬于自己的配置
一、前言
目前工作環境基本以linux為主,自然用到VIM也很多,很早就對如何提高VIM的使用效率有所研究,限于時間關系,也沒做個系統記錄和資料積累,時間久了又容易忘,好久沒寫文檔了,算是對自己一個交代。本文所涉及的配置和插件在附件中有下載。
二、環境
開篇之前,有必要交代一下系統環境和常用軟件版本。
操作系統: centos 6.2,2.6.32-431.el6.i686
git 版本: 3.2.29
yum版本: 1.8
vim版本 : 7.2.411
三、vim配置
3.1 基本配置
包括一些基本的語法,縮進,代碼折疊,高亮模式,窗口分割等,具體如下:
syn on " 打開語法高亮set expandtab " 轉義tab,當寫python代碼時很有用set tabstop=4 " 設置tab鍵的寬度set softtabstop=4set backspace=2 " 設置退格鍵可用set smartindent " 智能對齊方式set shiftwidth=4 " 換行時行間交錯使用4個空格set autoindent " 自動對齊set cindent "設置C/C++縮進方式"set ai! " 設置自動縮進set nu! " 顯示行號set linebreak " 整詞換行set whichwrap=b,s,<,>,[,] " 光標從行首和行末時可以跳到另一行去set autochdir " 自動設置目錄為正在編輯的文件所在的目錄set hidden " 沒有保存的緩沖區可以自動被隱藏set scrolloff=5"--------------------------------------------------------------------------------" 查找/替換相關的設置"--------------------------------------------------------------------------------set hlsearch " 高亮顯示搜索結果set incsearch " 查詢時非常方便,如要查找book單詞,當輸入到/b時,會自動找到 " 第一個b開頭的單詞,當輸入到/bo時,會自動找到第一個bo開頭的 " 單詞,依次類推,進行查找時,使用此設置會快速找到答案,當你 " 找要匹配的單詞時,別忘記回車set gdefault " 替換時所有的行內匹配都被替換,而不是只有第一個set showmatch " 設置匹配模式,類似當輸入一個左括號時會匹配相應的那個右括號colorscheme desert "設置顏色模式"--------------------------------------------------------------------------------" 代碼折疊"--------------------------------------------------------------------------------set foldmethod=syntaxset foldlevel=100 " Don't autofold anything (but I can still fold manually)"set foldopen-=search " don't open folds when you search into them"set foldopen-=undo " don't open folds when you undo stuff"set foldcolumn=4" 窗口操作的快捷鍵"--------------------------------------------------------------------------------" 垂直分割當前窗口nmap wv <C-w>v " 關閉當前窗口nmap wc <C-w>c " 水平分割當前窗口nmap ws <C-w>sView Code
3.2 插件管理
前期基本對VIM插件未進行管理,導致所有的插件都集中在.vim目錄下,這對于刪除一個插件來說還是比較麻煩的,目前管理vim插件的工具有幾個,比較出名的如pathogen和vundle這兩類,這兩個插件各有優勢,應用領域有所不同,關鍵區別如下:
pathogen: 解決多插件文件分散問題, 集中管理插件目錄,增加,刪除插件都很方便,
vundle: 解決自動搜索和下載插件問題, 方便插件的安裝和更新,使插件能夠時刻保持與線上版本一致
3.2.1 pathogen的安裝與配置
1) 下載:git clone https://github.com/tpope/vim-pathogen
2) 在.vim目錄下新建 autoload和bundle目錄
3) 將下載的pathogen包中的pathogen.vim拷貝到~/.vim/autoload
4) 配置pathogen: 在~/.vimrc中配置如下一句:
call pathogen#infect()
注意:此句一定要配置再filetype plugin on 之前
5) 作用:配好后,pathogen會自動加載位于bundle目錄下的所有插件
3.2.2 vundle配置
1) 下載:git clone https://github.com/gmarik/vundle.git
2) 安裝:將其復制到~/.vim/bundle目錄
3) 配置:
set nocompatible " be iMPRoved filetype off " required! /** 從這行開始,vimrc配置 **/ set rtp+=~/.vim/bundle/vundle/ call vundle#rc() " let Vundle manage Vundle " required! Bundle 'gmarik/vundle' " Github上非vim-scripts倉庫插件格式(github用戶名/插件名) Bundle 'tpope/vim-fugitive' Bundle 'tpope/vim-rails.git' " Github vim-scripts倉庫插件格式 Bundle 'python.vim' " 非上述兩種模式 Bundle 'git://git.wincent.com/command-t.git' " ... filetype plugin indent on " 必須有這句
四 、其它插件安裝
4.1 Taglist
作用:顯示文件變量、宏、函數等tag, 以tags文件為基礎,結合ctags軟件使用
下載:http://sourceforge.net/projects/vim-taglist/files/vim-taglist/
安裝:直接拷貝vim-taglist目錄到~/.vim/bundle
配置:
"--------------------------------------------------------------------------------" TagList :Tlist"--------------------------------------------------------------------------------let Tlist_Show_One_File=1let Tlist_Exit_OnlyWindow = 1"let Tlist_Use_Right_Window=1
效果截圖:
4.2 winmanager
作用:規劃布局各插件在vim中的顯示,使其顯示分明
下載:http://www.vim.org/scripts/script.php?script_id=95
安裝:解壓目錄放到~/.vim/bundle下
配置:
"--------------------------------------------------------------------------------" WinManager :WMToggle"--------------------------------------------------------------------------------let g:winManagerWindowLayout='FileExplorer|TagList'"是nomal模式的命令,不是Ex模式的nmap wm :WMToggle<cr> "快捷鍵
使用: 直接在vim命令行模式輸入WMToggle即可顯示winmanager布局,再次輸入WMToggle即可關閉布局
效果圖:
4.3 MiniBufExplorer
作用:顯示打開的文件標簽欄,即類似于tab效果,方便文件間切換
下載: http://www.vim.org/scripts/script.php?script_id=159
安裝:直接將下載文件解壓放至~/.vim/bundle
配置:
"--------------------------------------------------------------------------------" MiniBufExp"--------------------------------------------------------------------------------let g:miniBufExplMapWindowNavArrows = 1 “按左右箭頭切換文件標簽,再按enter鍵即可打開選擇的文件標簽let g:miniBufExplMapCTabSwitchBufs = 1 "按Tab鍵也可達到切換效果
使用: 當打開winmanger布局時,用ctrl+w+w命令進入FileExplorer窗口, 按上下選擇鍵選擇文件回車打開,即可再miniBufExplorer窗口顯示打開的文件標簽.
效果:如winmanager截圖,最上面的小窗口所示,同時打開了3個文件
4.4 grep.vim
作用:類似于grep功能,查找關鍵字
下載: http://www.vim.org/scripts/script.php?script_id=311
安裝: 解壓目錄至~/.vim/bundle
配置:
"直接按下<F3>鍵來查找光標所在的字符串nnoremap <silent> <F3> :Rgrep<CR>
使用: 移動光標至關鍵字處,按F3,會在vim命令行處顯示查找相關關鍵字的提示,按enter鍵進入查找,然后選擇查找目錄,默認是當前目錄,按回車后會出現查找模式,默認為*,即只要包含此管鍵字的文件行都會被查找出來,要退出查找過程也很簡單,按ESC鍵即可。
效果如下:如要查找about_pages關鍵字,鼠標移動到該處,會作相應的提示,最后一張是查找結果圖
4.5 a.vim
作用:頭文件和源文件快速切換,這對于C/C++項目來說還是很方便的
下載: http://www.vim.org/scripts/script.php?script_id=31
安裝: 解壓目錄至 ~/.vim/bundle
配置:
nnoremap <silent> <F12> :A<CR>
使用: 按F12鍵則可在源文件和頭文件之間切換
4.6 omnicppcomplete
作用: 智能C/C++庫補全, 為了使用此控件,還要下載專門的C++源庫文件,同時得先安裝好ctags軟件以便生成tags文件
下載:
#omnicomplete下載http://www.vim.org/scripts/script.php?script_id=1520#文件結構類似于|--omnicppcomplete|---after| |---ftplugin|---autoload| |---omni| | |---common| | |---cpp|---doc#C++源庫下載http://www.vim.org/scripts/script.php?script_id=2358
安裝:
1) 對于omnicppcomplete, 解壓文件到~/.vim, 有after、autoload、doc三個目錄, autoload下有omni子目錄,注意使用bundle來管理時,如果將包解壓在~/.vim/bundle下時會識別不到,omni補全將失效;
2) 對于源碼,將其解壓到指定目錄,如/usr/local/cpp_src, 進入該目錄,執行ctags命令生成tags文件,具體如下:
cd /usr/local/cpp_srctar -jxvf cpp_src.tar.bz2ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . #不能簡單的執行ctags -R, 需要帶參數才能識別C++庫move tags cpp #重命名,非必須為區別起見
配置:
set completeopt=longest,menu " 關掉智能補全時的預覽窗口filetype plugin indent on " 加了這句才可以用智能補全let OmniCpp_MayCompleteDot = 1 " autocomplete withlet OmniCpp_MayCompleteArrow = 1 " autocomplete with ->let OmniCpp_MayCompleteScope = 1 " autocomplete with ::let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included fileslet OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup windowlet OmniCpp_GlobalScopeSearch=1 " enable the global scope searchlet OmniCpp_DisplayMode=1 " Class scope completion mode: always show all memberslet OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last columnlet OmniCpp_Showaccess=1"默認以std 命名空間為準, using namespace stdlet OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
"加載CPP庫tags文件set tags+=/usr/local/cpp_src/cpp
使用效果如下圖:
4.7 cscope
作用: 此插件作用相信用過的人誰用誰知道,windows下有SourceInsights, Linux 下也有Cscope來撐腰,通過它可以方便的查看函數定義及其函數調用關系
安裝:http://cscope.sourceforge.net/, 下載源碼包,編譯安裝,由于現在vim7.2已經集成有cscope,所以如果vim版本是7以上的話就不用安裝了,同時為方便操作,cscope提供了大量的快捷鍵來操作以提高操作效率,快捷鍵映射需借助cscope_maps.vim插件,下載地址:在vim.org上有,可自行網上下載,下載后直接安裝在~/.vim/bundle/cscope下
配置:
"--------------------------------------------------------------------------------" cscope"--------------------------------------------------------------------------------cs add /home/src/cscope.out /home/src:set cscopequickfix=s-,c-,d-,i-,t-,e-:set cscopetag" 按下面這種組合鍵有技巧,按了<C-_>后要馬上按下一個鍵,否則屏幕一閃" 就回到nomal狀態了" <C-_>s的按法是先按"Ctrl+Shift+-",然后很快再按"s"nmap <C-_>s :cs find s <C-R>=expand("<cWord>")<cr><cr> :cw<cr> "查找C代碼符號nmap <C-_>g :cs find g <C-R>=expand("<cword>")<cr><cr> :cw<cr> "查找本定義nmap <C-_>c :cs find c <C-R>=expand("<cword>")<cr><cr> :cw<cr> "查找調用本函數的函數nmap <C-_>t :cs find t <C-R>=expand("<cword>")<cr><cr> :cw<cr> "查找本字符串nmap <C-_>e :cs find e <C-R>=expand("<cword>")<cr><cr> :cw<cr> "查找本egrep模式nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<cr><cr> "查找本文件nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<cr><cr> :cw<cr> "查找包含本文件的文件nmap <C-_>d :cs find d <C-R>=expand("<cword>")<cr><cr> :cw<cr> " 查找本函數調用函數
使用:
1) 先生成cscope數據庫文件,如在/home/src/下,執行 cscope -Rbq, 即可生成cscope.out文件
2)配置:然后可像上述配置一樣將cscope.out文件加載到vimrc中,也可手動加載,執行: cs add cscope.out /home/src
3)快捷鍵: 將光標移至函數名稱處,先按ctrl+下劃線,再快速按相應字母即可實現相應的查找功能。
4.8 其它插件
還有一些其它插件,根據需求來安裝,如markdown,python, emmet等,這些直接下載相應文件到bundle目錄即可,markdown還需要一些配置,可參考附件vimrc文件
五、總結
終于總結完了,在用vim的過程中,遇到很多問題,雖然用了很久,但深知還有很多功能尚未用到,還有待挖掘,只能不斷學習總結。
六、附件
6.1 vimrc
call pathogen#infect()set expandtabset tabstop=4 " 設置tab鍵的寬度set softtabstop=4set shiftwidth=4set backspace=2 " 設置退格鍵可用set nu! " 顯示行號set linebreak " 整詞換行set whichwrap=b,s,<,>,[,] " 光標從行首和行末時可以跳到另一行去set autochdir " 自動設置目錄為正在編輯的文件所在的目錄set hidden " 沒有保存的緩沖區可以自動被隱藏set scrolloff=5"--------------------------------------------------------------------------------" 查找/替換相關的設置"--------------------------------------------------------------------------------set hlsearch " 高亮顯示搜索結果set incsearch " 查詢時非常方便,如要查找book單詞,當輸入到/b時,會自動找到 " 第一個b開頭的單詞,當輸入到/bo時,會自動找到第一個bo開頭的 " 單詞,依次類推,進行查找時,使用此設置會快速找到答案,當你 " 找要匹配的單詞時,別忘記回車set gdefault " 替換時所有的行內匹配都被替換,而不是只有第一個"--------------------------------------------------------------------------------" 狀態欄相關的設置"--------------------------------------------------------------------------------set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]set laststatus=2 " always show the status lineset ruler " 在編輯過程中,在右下角顯示光標位置的狀態行"--------------------------------------------------------------------------------" 編程相關的設置"--------------------------------------------------------------------------------set completeopt=longest,menu " 關掉智能補全時的預覽窗口filetype plugin indent on " 加了這句才可以用智能補全let OmniCpp_MayCompleteDot = 1 " autocomplete withlet OmniCpp_MayCompleteArrow = 1 " autocomplete with ->let OmniCpp_MayCompleteScope = 1 " autocomplete with ::let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included fileslet OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup windowlet OmniCpp_GlobalScopeSearch=1 " enable the global scope searchlet OmniCpp_DisplayMode=1 " Class scope completion mode: always show all memberslet OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last columnlet OmniCpp_ShowAccess=1let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]"set tags=./tags"set tags+=/usr/include/c++/tagsset tags+=/usr/local/cpp_src/cppsyn on " 打開語法高亮set showmatch " 設置匹配模式,類似當輸入一個左括號時會匹配相應的那個右括號set smartindent " 智能對齊方式set shiftwidth=4 " 換行時行間交錯使用4個空格set autoindent " 自動對齊set cindent "設置C/C++縮進方式"set ai! " 設置自動縮進colorscheme desert"--------------------------------------------------------------------------------" 代碼折疊"--------------------------------------------------------------------------------set foldmethod=syntaxset foldlevel=100 " Don't autofold anything (but I can still fold manually)"set foldopen-=search " don't open folds when you search into them"set foldopen-=undo " don't open folds when you undo stuff"set foldcolumn=4" 窗口操作的快捷鍵"--------------------------------------------------------------------------------" 垂直分割當前窗口nmap wv <C-w>v " 關閉當前窗口nmap wc <C-w>c " 水平分割當前窗口nmap ws <C-w>s "###############################################################################" The following is the Plugins' setting"###############################################################################"--------------------------------------------------------------------------------" TagList :Tlist"--------------------------------------------------------------------------------let Tlist_Show_One_File=1let Tlist_Exit_OnlyWindow = 1"let Tlist_Use_Right_Window=1"--------------------------------------------------------------------------------" netrw 文件瀏覽器 :e <PATH>"--------------------------------------------------------------------------------"let g:netrw_winsize = 30 " 瀏覽器寬度"--------------------------------------------------------------------------------" QuickFix"--------------------------------------------------------------------------------" 切換到下一個結果nmap <F6> :cn<cr> " 切換到上一個結果nmap <F7> :cp<cr> "--------------------------------------------------------------------------------" WinManager :WMToggle"--------------------------------------------------------------------------------let g:winManagerWindowLayout='FileExplorer|TagList'"是nomal模式的命令,不是Ex模式的nmap wm :WMToggle<cr> "--------------------------------------------------------------------------------" MiniBufExp"--------------------------------------------------------------------------------let g:miniBufExplMapWindowNavArrows = 1let g:miniBufExplMapCTabSwitchBufs = 1"--------------------------------------------------------------------------------" cscope"--------------------------------------------------------------------------------cs add /home/src/cscope.out /home/src:set cscopequickfix=s-,c-,d-,i-,t-,e-:set cscopetag" 按下面這種組合鍵有技巧,按了<C-_>后要馬上按下一個鍵,否則屏幕一閃" 就回到nomal狀態了" <C-_>s的按法是先按"Ctrl+Shift+-",然后很快再按"s"nmap <C-_>s :cs find s <C-R>=expand("<cword>")<cr><cr> :cw<cr>nmap <C-_>g :cs find g <C-R>=expand("<cword>")<cr><cr> :cw<cr>nmap <C-_>c :cs find c <C-R>=expand("<cword>")<cr><cr> :cw<cr>nmap <C-_>t :cs find t <C-R>=expand("<cword>")<cr><cr> :cw<cr>nmap <C-_>e :cs find e <C-R>=expand("<cword>")<cr><cr> :cw<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> :cw<cr>nmap <C-_>d :cs find d <C-R>=expand("<cword>")<cr><cr> :cw<cr>"--------------------------------------------------------------------------------" Grep"--------------------------------------------------------------------------------"直接按下<F3>鍵來查找光標所在的字符串nnoremap <silent> <F3> :Rgrep<CR>"--------------------------------------------------------------------------------" A"--------------------------------------------------------------------------------nnoremap <silent> <F12> :A<CR>" NERD_commenter"--------------------------------------------------------------------------------let NERD_c_alt_style = 1 " 將C語言的注釋符號改為//, 默認是/**/"nmap <F5> ,cc"--------------------------------------------------------------------------------" SuperTab :SuperTabHelp"--------------------------------------------------------------------------------let g:SuperTabRetainCompletionType = 2let g:SuperTabDefaultCompletionType = "<C-X><C-O>""--------------------------------------------------------------------------------" CVim :help csupport"--------------------------------------------------------------------------------let g:C_Comments = "no" " 用C++的注釋風格let g:C_BraceOnNewLine = "no" " '{'是否獨自一行let g:C_AuthorName = "Wen Qiuliang"let g:C_Project="F9"let g:C_TypeOfH = "c" " *.h文件的文件類型是C還是C++let g:user_emmet_settings = { / 'php' : { / 'extends' : 'html', / 'filters' : 'c', / }, / 'xml' : { / 'extends' : 'html', / }, / 'haml' : { / 'extends' : 'html', / }, /}" vim markdown configau BufRead,BufNewFile *.{md,mdown,mkd,mkdn,markdown,mdwn} set filetype=mkdlet g:vim_markdown_folding_disabled=1let g:vim_markdown_frontmatter=1View Code
6.2 插件
本文所涉及的所有插件都上傳在github中,地址如下:
https://git.oschina.net/ballwql/vim-plugin.git
無
新聞熱點
疑難解答