vi代碼智能提示功能及相關配置

vim是一款支持插件、功能無比強大的編輯器,不管你的系統是linux、unix、mac仍是windows,都可以選擇他來編輯文件或是進行工程級別 的coding。若是能把vim用好了,不只編程效率能獲得大幅度提升,周圍人也會所以而看得頭暈眼花佩服不已,本身內心固然也會心花盛開啦。下面就讓我 來介紹一下如何來進行配置。這些配置所涉及到的內容有:autocomplpop, ctags, TagList,omnicppcompletephp

首 先Vim是內建代碼補全功能的,在不須要經過任何設置的狀況下就能使用。在您編輯代碼的時候,鍵入 ctrl+x, ctrl+o, ctrl+n, ctrl+p 等快捷鍵,就會彈出智能提示的菜單。可是這仍然不知足你們的要求。大多數IDE中,只要代碼輸入到相應的位置,補全提示就會自動的彈出來,而vim的這種 補全還須要本身手動的來觸發。那麼下面就介紹一種能夠自動彈出補全提示的插件 — autocomplpophtml

== Autocomplpop ==python

首先,從http://www.vim.org/scripts/script.php?script_id=1879處 下載autocomplpop.vim文件(咱們所說的vim插件就是這樣的*.vim格式的文件),而後將其放入vim文件目錄下的plugin目錄中 (unix/linux平臺在/usr/share/vim/vim71中, windows平臺在安裝目錄的vim71目錄中),而後重啓一下vim就會發如今編碼時會自動彈出提示了。linux

細心的朋友會發現,光是利用 autocomplpop這個插件還遠遠達不到要求。好比說:在c++中使用.或是->訪問對象或指針中的成員和函數時還沒法自動彈出提示,另外, 即使是自動提示也只能提示咱們在當前文檔中已輸入的字符串。針對這種狀況,咱們就須要安裝ctags工具和OmniCppComplete插件。 ctags是用來對文件作標記的工具,OmniCppComplete是在c和c++語言範疇內,對上述智能補全的加強版。c++

== ctags ==git

ctags在http://ctags.sourceforge.net/下載源碼,編譯後安裝。常規的標記命令爲 ctags -R 。"-R"表示遞歸建立,也就包括源代碼根目錄下的全部子目錄下的源程序。github

 

== CppCompleete ==編程

OmniCppComplete在http://www.vim.org/scripts/script.php?script_id=1520下載。下載 好以後根據裏面的doc文檔進行安裝和使用。ubuntu

這樣一來,代碼補全就比較完善了。可是根據以往的經驗,IDE中還有一個功能,那就是函數和變量的跳轉查看。好比代碼中出現
代碼:
if(true){
doThis();
}vim

咱們想知道doThis()函數是如何定義和實現的,那麼如何快速的來查看呢?咱們就須要安裝Taglist插件

== Taglist ==

插件在http://vim.sourceforge.net/scripts/script.php?script_id=273下載。下載好以後,咱們能夠根據其中的doc文檔進行安裝和配置。

咱們發現其實Taglist的使用也必需要依靠ctags所建立出來的tag文件。當tag文件造成、一切配置都配置完成以後。咱們能夠ctrl+]來進行函數或者是變量跳轉。好了,今後你就能夠開始像IDE同樣來使用vim進行編碼了。

 

正文

1. 引言

可使用腳本/插件來給vim添加各類神奇的功能,從更換顏色主題、到代碼智能提示,甚至項目管理。無數開發者經過開源社區貢獻本身開發的插件,使得vim有可能變得無比強大。這兒http://vim-scripts.org/vim/scripts.html 是一份vim擴展腳本的列表。

然而,個人思想是儘可能不要使用vim插件,除了那些很是優秀且對本身的工做而言所必需的。這樣,當須要配置一臺新電腦或者臨時要在別人的電腦上工做時,最起碼能比較方便地配置好環境,或者直接使用默認環境熟練地完成任務,而不是離開了插件什麼也不會。

對我本身而言,我基本上只須要4個(種)插件:

  1. 管理插件的插件(插件管理器)
  2. 最喜歡的配色方案
  3. Doxygen註釋自動生成
  4. 代碼智能提示與補全

除了顏色主題因我的喜愛和環境不一樣各不相同外,其他插件我都只會選擇最流行,且公認最優、最好用的那個。下文將分別介紹這幾種插件,並給出在Linux(Ubuntu, CentOS)和Mac OSX上配置的方法。可是在這以前,最好確認如下幾個條件:

  1. 連上寬帶互聯網
  2. 安裝好git
  3. 安裝好vim並確認其版本號至少是7.3.584,且支持python2(這是代碼提示與補全插件要求的)

2. 插件管理器

Vundle是一個流行的vim插件管理器,它的網址是https://github.com/VundleVim/Vundle.vim

如下是安裝步驟:

  1. git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    若是目錄.vim/bundle不存在請先建立
  2. 打開~/.vimrc,在文件頭加入如下內容
    複製代碼
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    " Vundle
    set nocompatible              " be iMproved, required
    filetype off                  " required
    
    " set the runtime path to include Vundle and initialize
    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()
    " alternatively, pass a path where Vundle should install plugins
    "call vundle#begin('~/some/path/here')
    
    " let Vundle manage Vundle, required
    Plugin 'VundleVim/Vundle.vim'
    
    " The following are examples of different formats supported.
    " Keep Plugin commands between vundle#begin/end.
    " plugin on GitHub repo
    "Plugin 'tpope/vim-fugitive'
    " plugin from http://vim-scripts.org/vim/scripts.html
    "Plugin 'L9'
    " Git plugin not hosted on GitHub
    "Plugin 'git://git.wincent.com/command-t.git'
    " git repos on your local machine (i.e. when working on your own plugin)
    "Plugin 'file:///home/gmarik/path/to/plugin'
    " The sparkup vim script is in a subdirectory of this repo called vim.
    " Pass the path to set the runtimepath properly.
    "Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
    " Avoid a name conflict with L9
    "Plugin 'user/L9', {'name': 'newL9'}
    
    " All of your Plugins must be added before the following line
    call vundle#end()            " required
    filetype plugin indent on    " required
    " To ignore plugin indent changes, instead use:
    "filetype plugin on
    "
    " Brief help
    " :PluginList       - lists configured plugins
    " :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
    " :PluginSearch foo - searches for foo; append `!` to refresh local cache
    " :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
    "
    " see :h vundle for more details or wiki for FAQ
    " Put your non-Plugin stuff after this line
    
    
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    複製代碼

    從其中的註釋能夠知道,Vundle支持多種形式的插件源,並給出了示例。這些插件源包括:github上的插件、http://vim-scripts.org/vim/scripts.html上的插件、非github上的git插件、本地硬盤上的插件等。

  3. 打開vim,運行 :PluginInstall 命令來自動安裝插件,過程當中有可能須要輸入github用戶名和密碼。等待Vundle安裝完成便可。

Vundle正在自動安裝在.vimrc中指定的插件:

 

 

3. 配色方案

vim默認有一些配色方案,若是這些都不喜歡,能夠從網上下載安裝別的配色方案。solarized和molokai都是流行的配色方案,然而這兩個主題在終端(terminal)模式下或者SecureCRT上使用都會有一些問題,而我目前最喜歡的khaki沒有這個問題,它的樣子以下圖所示(其中設置了行號、當前號高亮、語法高亮等)

安裝步驟:

  1. 在~/.vimrc中的Vundle插件列表區域中添加khaki的源位置
    Plugin 'vim-scripts/khaki.vim' 
    保存後退出,再打開vim,運行:PluginInstall命令安裝。
  2. 在~/.vimrc中,Vundle區域後面的某處,添加
    if !has("gui_running")                                          
        set t_Co=256                                                
    endif                                                                                         
    colorscheme khaki 

    保存後重啓vim便可。

4. Doxygen註釋自動生成

爲本身的代碼寫好註釋是一個良好的習慣,而編寫Doxygen風格的註釋更是能夠經過doxygen工具爲代碼本身生成文檔,很是好用。DoxygenToolkit(https://github.com/vim-scripts/DoxygenToolkit.vim)就是這樣的一個插件。安裝和使用:

  1. 在~/.vimrc中的Vundle插件列表區域中添加DoxygenToolkit的源位置
    Plugin 'vim-scripts/DoxygenToolkit.vim'
    保存後退出,再打開vim,運行:PluginInstall命令安裝
  2. 在~.vimrc中,Vundle區域後的某處,設置DoxygenToolkit插件在@author區域自動填充的做者名稱,好比
    let g:DoxygenToolkit_authorName="zzq@moon.net" 
  3. 使用時,將光標定位到文件首行,輸入:DoxAuthor將插入文件頭註釋骨架(第一次會讓你輸入文件版本號),以下:
    複製代碼
      /**                                                                
       * @file test.cpp                                                  
       * @brief                                                                                       
       * @author zzp@moon.net                                            
       * @version 1.0                                                    
       * @date 2015-08-21                                                
       */  
    複製代碼

    並把光標停留在@brief 後面,等待輸入文件描述。
    在光標定位到數據結構聲明或函數聲明的第一行,運行:Dox,將生成數據結構或函數的註釋骨架,以下:

    複製代碼
    /**                                                             
       * @brief                                                       
       */                                                             
      struct foo                                                      
      {                                                               
          char str;                                                   
          void* ptr;                                                  
      };                                                              
                                                                      
      /**                                                             
       * @brief                                                       
       *                                                                                              
       * @param a                                                     
       * @param b                                                     
       *                                                              
       * @return                                                      
       */                                                             
      int bar(int a, int b)                                           
      {                                                               
          return a+b;                                                 
      }         
    複製代碼

    並把光標定位在@brief 後,期待你輸入具體的註釋內容。

5. 代碼智能提示與補全

寫代碼的時候,變量名、函數名、類名等代碼符號的智能提示和補全功能是很是有用的,能夠大大提升編碼效率。然而,在YouCompleteMe(簡稱YCM)這個神奇的插件出現以前,vim一直使用tag機制來完成這個功能。因爲tag只會笨拙地分析代碼中的字符串,並不能識別其語法說語義,致使代碼的提示並很差用。隨着clang的出現,使開發人員能夠對程序代碼進行事實上的語義分析(調用clang分析器之類的),因而真正的智能提示和補全插件出現了,它就是由 google 的工程師 Strahinja Val Markovic 所開發的YCM(https://github.com/Valloric/YouCompleteMe)。

5.1 YouCompleteMe的安裝與配置

YCM使用C++和python開發,是一個複雜的插件,光是經過Vundle下載的文件就達到120多MB。另外YCM不僅是有新的開發的功能,它還包含了其餘一些有用的插件。下圖是做者本人提示的演示動圖:

除了代碼提示與補全外,藉助libclang強大的語法與語義分析能力,YCM還能夠在編輯的時候提示出錯的行與出錯緣由,以下圖所示:

另外,YCM還能夠補全路徑,文件名等。

 

安裝與配置步驟:

  1. 若是是在Ubuntu 14.04上,運行如下命令安裝
      
    sudo apt-get install vim-addon-manager 
    sudo apt-get install vim-youcompleteme
    vim-addons install youcompleteme
    來安裝YCM插件,很是簡單。不然到2.

    ==2016.12.30補充 在CentOS7上安裝YouCompleteMe==

    1.1.下載Vundle和YouCompleteMe插件

    輸入如下指令,下載Vundle

    git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    下載成功後,在用戶根目錄下面,修改.vimrc文件,追加下面語句以便後續安裝YouCompleteMe插件

    set  nocompatible
    filetype off
    set  rtp+=~/.vim /bundle/Vundle .vim
    call vundle #begin()
    Plugin 'gmarik/Vundle.vim'
    Plugin 'Valloric/YouCompleteMe'
    call vundle #end()
    filetype plugin indent on   

    而後在vim中先按Esc建,而且輸入如下指令安裝插件:

    :PluginInstall 
    1.2.編譯YouCompleteMe

    在編譯以前下載編譯工具,準備編譯YouCompleteMe

    yum install gcc gcc-c++ cmake python-devel
    編譯YouCompleteMe使其支持C/C++ 自動補全

    cd ~/.vim/bundle/YouCompleteMe
    ./install.py --clang-completer

     

  2. 若是是Ubuntu 12.04,有好多問題要解決,若是條件容許最好直接用14.04. 不然到3.
    a. 系統自帶的vim版本太低,須要先把版本升級到7.4,目前除了下源碼編譯我不知道有什麼別的方法。
    參考:https://github.com/Valloric/YouCompleteMe/wiki/Building-Vim-from-source
    b. CMake版本太低,須要升級到2.8.11以上。到http://www.cmake.org/download/ 下一高版本便可。
    c. 有可能沒有安裝ctags,apt-get安裝一個便可,後文要用到。
  3. 與以上插件同樣,在.vimrc中添加 Plugin 'Valloric/YouCompleteMe',並運行:PluginInstall命令安裝。
  4. 下載最新的clang。
    YCM是爲clang 3.6設計的,理論上的最低版本不該低於3.2+。YCM使用clang提供的libclang來解析代碼主義等.
    從 http://llvm.org/releases/download.html 下載爲你的系統預編譯好的clang。
    但上面的列表並無爲全部系統提供精確的版本,好比我要在CentOS 7.0 64bit上編譯YCM,但上面沒有,因此只好本身編譯,方法是:
    a. 下載LLVM source code: llvm-3.6.2.src.tar.xz, 解壓到llvm-3.6.2.src
    b. 下載Clang source code: cfe-3.6.2.src.tar.xz, 解壓到llvm-3.6.2.src/tools/clang
    c. 下載Compiler RT source code: compiler-rt-3.6.2.src.tar.xz, 解壓到llvm-3.6.2.src/projects/compiler-rt
    d. 下載Clang tools Extra:clang-tools-extra-3.6.2.src.tar.xz,解壓到llvm-3.6.2.src/tools/clang/tools/extra
    e. 不妨在llvm-3.6.2.src父目錄中創建build目錄並編譯
    mkdir llvm_build; cd llvm_build
    ../llvm-3.6.2.src/configure --enable-optimized --enable-targets=host-only
    make && make install
    這裏必定要記得make install,不然clang源碼中的頭文件沒有放到/usr/include相關目錄下,一會編譯YCM庫時會報找不到頭文件的錯誤。(這個編譯的很是慢,生成1.6GB+文件)

  5. 編譯ycm_support_libs。
    a. 這要求系統安裝了cmake, python(2.6+), python-devel(2.6+)等,若是不知足條件cmake的時候會提示錯誤。
    b. cd~; mkdir ycm_build; cd ycm_build
    c. 若是是安裝了預編譯好的clang,請運行cmake -G "Unix Makefiles" -DPATH_TO_LLVM_ROOT=~/clang+llvm-3.4.2-x86_64-unknown-ubuntu12.04 . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp,生成Makefile。其中clang+llvm-3.4.2-x86_64-unknown-ubuntu12.04是clang預編譯包解壓後的路徑,裏面有bin,lib,include等目錄;
    不然,若是是本身在第4步從源碼編譯的clang,則運行 cmake -G "Unix Makefiles" -DEXTERNAL_LIBCLANG_PATH=~/llvm_build/Release+Asserts/lib/libclang.so . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp,生成Makefile。其中~/llvm_build是用於從源碼編譯的build目錄。
    d. 運行 make ycm_support_libs生成YCM支持庫
    這一過程會在~/.vim/bundle/YouCompleteMe/third_party/ycmd/下生成幾個.so。至此,YCM編譯已結束。
  6. 配置YCM
    a. YCM在語義分析時使用libclang,而libclang須要參數選項,這從哪裏來呢?YCM經過提供給一個代碼工程一個python文件的方式來通知libclang所需的參數選項,這個文件就是.ycm_extra_conf.py。YCM安裝好後在,在路徑~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py有一個默認的配置文件,能夠把它拷貝到你的代碼所在主目錄下,並進行修改。主要是修改此文件中的flags表,加入本身代碼所在路徑、語言類型(C/C++)等。
    複製代碼
    # These are the compilation flags that will be used in case there's no
    # compilation database set (by default, one is not set).
    # CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
    flags = [
    '-Wall',
    '-Wextra',
    '-Werror',
    '-Wc++98-compat',
    '-Wno-long-long',
    '-Wno-variadic-macros',
    '-fexceptions',
    '-DNDEBUG',
    # You 100% do NOT need -DUSE_CLANG_COMPLETER in your flags; only the YCM
    # source code needs it.
    '-DUSE_CLANG_COMPLETER',
    # THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which
    # language to use when compiling headers. So it will guess. Badly. So C++
    # headers will be compiled as C headers. You don't want that so ALWAYS specify
    # a "-std=<something>".
    # For a C project, you would set this to something like 'c99' instead of
    # 'c++11'.
    '-std=c++11',
    # ...and the same thing goes for the magic -x option which specifies the
    # language that the files to be compiled are written in. This is mostly
    # relevant for c++ headers.
    # For a C project, you would set this to 'c' instead of 'c++'.
    '-x',
    'c++',
    '-isystem',
    '../BoostParts',
    '-isystem',
    # This path will only work on OS X, but extra paths that don't exist are not
    # harmful
    '/System/Library/Frameworks/Python.framework/Headers',
    '-isystem',
    '../llvm/include',
    '-isystem',
    '../llvm/tools/clang/include',
    '-I',
    '.',
    '-I',
    './ClangCompleter',
    '-isystem',
    './tests/gmock/gtest',
    '-isystem',
    './tests/gmock/gtest/include',
    '-isystem',
    './tests/gmock',
    '-isystem',
    './tests/gmock/include',
    ]
    複製代碼

    b. 在.vimrc中添加如下配置項(更多項見https://github.com/Valloric/YouCompleteMe#general-usage)。

    複製代碼
    " YCM                                                              
    " 容許自動加載.ycm_extra_conf.py,再也不提示                         
    let g:ycm_confirm_extra_conf=0                                     
    " 補全功能在註釋中一樣有效                                         
    let g:ycm_complete_in_comments=1                                   
    " 開啓tags補全引擎                                                 
    let g:ycm_collect_identifiers_from_tags_files=1                    
    " 鍵入第一個字符時就開始列出匹配項                                 
    let g:ycm_min_num_of_chars_for_completion=1                        
    " YCM相關快捷鍵,分別是\gl, \gf, \gg                                                    
    nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR>              
    nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>               
    nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
    複製代碼

其中,

  • g:ycm_confirm_extra_conf若是不設爲0的話,用vim每次打開代碼文件,YCM都會提示是否確認加載某某.ycm_extra_conf.py文件;
  • ycm_collect_identifiers_from_tags_files設爲1,指定YCM收集傳統tags文件的信息,另外當tags改變時,YCM會從新索引它們。YCM對tags文件的格式有特殊的要求:The only supported tag format is the Exuberant Ctags format. The format from "plain" ctags is NOT supported. Ctags needs to be called with the --fields=+l option (that's a lowercase L, not a one) because YCM needs the language:<lang> field in the tags output。若有問題請參閱YCM官網相關FAQ;
    好比引入C++tags:
    " 引入 C++ 標準庫tags
    set tags+=/data/misc/vim/stdcpp.tags
  • 3個快捷鍵設置是用來快速跳轉到符號聲明或定義的。我每每只用gg,即將光標定位到某個符號上,按\鍵後(默認的leader鍵是\),快速按兩次g鍵,將跳轉到該符號的聲明或定義位置(Tips: 按<ctrl>+o返回)

其餘技巧:

  • 執行:YcmDiags顯示全部錯誤, 它實際上是打開了一個location list窗口,也可能經過:lopen打開. 使用:lclose能夠關閉
  • 有些系統函數如fopen, strcpy若是不智能提示,能夠按<Ctrl>+<Space>鍵。
  • 若是有的文件死活沒法正確提示(若是結構體之類),請檢查一下文件編碼,改爲utf-8。(vim中 :set fileencoding=utf8)

 

5.2 完善代碼提示與補全

 如5.1所述,YouCompleteMe插件是如此地強大。然而,某些時候它可能仍是會有些小問題,好比沒法提示宏定義等等,致使沒法補全,這時候仍是須要藉助傳統的tags文件。indexer插件能夠針對不一樣的工程目錄自動地生成、更新和引入不一樣的tags文件,詳見http://www.vim.org/scripts/script.php?script_id=3221。它須要依賴DfrankUtil和Vimprj 兩個插件,須要一併安裝。

安裝與配置步驟:

1. 在.vimrc的Vundle區域內加入如下內容

Plugin 'DfrankUtil'                                             
Plugin 'vimprj'                                                 
Plugin 'indexer.tar.gz'

以後運行:PluginInstall安裝;

2. 打開.vimrc,加入如下內容:

" indexer                                                       
" 設置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 --e
xtra=+q"

3. indexer會根據你的代碼工程的不一樣,自動生成並在其中的代碼文件被打開時自動加載tags文件。它是經過配置文件來指定工程設置的,此文件爲~/.indexer_files。如下是一個配置示例,演示了2個不一樣的工程的Indexer配置。

複製代碼
[CoolProject] 
/home/user/cool_project 

[AnotherProject] 
option:ctags_params = "--languages=c++" 
/home/user/another_project/src 
/home/user/another_project/lib 
複製代碼

 

6 參考

 

正文

1. 引言

可使用腳本/插件來給vim添加各類神奇的功能,從更換顏色主題、到代碼智能提示,甚至項目管理。無數開發者經過開源社區貢獻本身開發的插件,使得vim有可能變得無比強大。這兒http://vim-scripts.org/vim/scripts.html 是一份vim擴展腳本的列表。

然而,個人思想是儘可能不要使用vim插件,除了那些很是優秀且對本身的工做而言所必需的。這樣,當須要配置一臺新電腦或者臨時要在別人的電腦上工做時,最起碼能比較方便地配置好環境,或者直接使用默認環境熟練地完成任務,而不是離開了插件什麼也不會。

對我本身而言,我基本上只須要4個(種)插件:

  1. 管理插件的插件(插件管理器)
  2. 最喜歡的配色方案
  3. Doxygen註釋自動生成
  4. 代碼智能提示與補全

除了顏色主題因我的喜愛和環境不一樣各不相同外,其他插件我都只會選擇最流行,且公認最優、最好用的那個。下文將分別介紹這幾種插件,並給出在Linux(Ubuntu, CentOS)和Mac OSX上配置的方法。可是在這以前,最好確認如下幾個條件:

  1. 連上寬帶互聯網
  2. 安裝好git
  3. 安裝好vim並確認其版本號至少是7.3.584,且支持python2(這是代碼提示與補全插件要求的)

2. 插件管理器

Vundle是一個流行的vim插件管理器,它的網址是https://github.com/VundleVim/Vundle.vim

如下是安裝步驟:

  1. git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    若是目錄.vim/bundle不存在請先建立
  2. 打開~/.vimrc,在文件頭加入如下內容
    複製代碼
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    " Vundle
    set nocompatible              " be iMproved, required
    filetype off                  " required
    
    " set the runtime path to include Vundle and initialize
    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()
    " alternatively, pass a path where Vundle should install plugins
    "call vundle#begin('~/some/path/here')
    
    " let Vundle manage Vundle, required
    Plugin 'VundleVim/Vundle.vim'
    
    " The following are examples of different formats supported.
    " Keep Plugin commands between vundle#begin/end.
    " plugin on GitHub repo
    "Plugin 'tpope/vim-fugitive'
    " plugin from http://vim-scripts.org/vim/scripts.html
    "Plugin 'L9'
    " Git plugin not hosted on GitHub
    "Plugin 'git://git.wincent.com/command-t.git'
    " git repos on your local machine (i.e. when working on your own plugin)
    "Plugin 'file:///home/gmarik/path/to/plugin'
    " The sparkup vim script is in a subdirectory of this repo called vim.
    " Pass the path to set the runtimepath properly.
    "Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
    " Avoid a name conflict with L9
    "Plugin 'user/L9', {'name': 'newL9'}
    
    " All of your Plugins must be added before the following line
    call vundle#end()            " required
    filetype plugin indent on    " required
    " To ignore plugin indent changes, instead use:
    "filetype plugin on
    "
    " Brief help
    " :PluginList       - lists configured plugins
    " :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
    " :PluginSearch foo - searches for foo; append `!` to refresh local cache
    " :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
    "
    " see :h vundle for more details or wiki for FAQ
    " Put your non-Plugin stuff after this line
    
    
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    複製代碼

    從其中的註釋能夠知道,Vundle支持多種形式的插件源,並給出了示例。這些插件源包括:github上的插件、http://vim-scripts.org/vim/scripts.html上的插件、非github上的git插件、本地硬盤上的插件等。

  3. 打開vim,運行 :PluginInstall 命令來自動安裝插件,過程當中有可能須要輸入github用戶名和密碼。等待Vundle安裝完成便可。

Vundle正在自動安裝在.vimrc中指定的插件:

 

 

3. 配色方案

vim默認有一些配色方案,若是這些都不喜歡,能夠從網上下載安裝別的配色方案。solarized和molokai都是流行的配色方案,然而這兩個主題在終端(terminal)模式下或者SecureCRT上使用都會有一些問題,而我目前最喜歡的khaki沒有這個問題,它的樣子以下圖所示(其中設置了行號、當前號高亮、語法高亮等)

安裝步驟:

  1. 在~/.vimrc中的Vundle插件列表區域中添加khaki的源位置
    Plugin 'vim-scripts/khaki.vim' 
    保存後退出,再打開vim,運行:PluginInstall命令安裝。
  2. 在~/.vimrc中,Vundle區域後面的某處,添加
    if !has("gui_running")                                          
        set t_Co=256                                                
    endif                                                                                         
    colorscheme khaki 

    保存後重啓vim便可。

4. Doxygen註釋自動生成

爲本身的代碼寫好註釋是一個良好的習慣,而編寫Doxygen風格的註釋更是能夠經過doxygen工具爲代碼本身生成文檔,很是好用。DoxygenToolkit(https://github.com/vim-scripts/DoxygenToolkit.vim)就是這樣的一個插件。安裝和使用:

  1. 在~/.vimrc中的Vundle插件列表區域中添加DoxygenToolkit的源位置
    Plugin 'vim-scripts/DoxygenToolkit.vim'
    保存後退出,再打開vim,運行:PluginInstall命令安裝
  2. 在~.vimrc中,Vundle區域後的某處,設置DoxygenToolkit插件在@author區域自動填充的做者名稱,好比
    let g:DoxygenToolkit_authorName="zzq@moon.net" 
  3. 使用時,將光標定位到文件首行,輸入:DoxAuthor將插入文件頭註釋骨架(第一次會讓你輸入文件版本號),以下:
    複製代碼
      /**                                                                
       * @file test.cpp                                                  
       * @brief                                                                                       
       * @author zzp@moon.net                                            
       * @version 1.0                                                    
       * @date 2015-08-21                                                
       */  
    複製代碼

    並把光標停留在@brief 後面,等待輸入文件描述。
    在光標定位到數據結構聲明或函數聲明的第一行,運行:Dox,將生成數據結構或函數的註釋骨架,以下:

    複製代碼
    /**                                                             
       * @brief                                                       
       */                                                             
      struct foo                                                      
      {                                                               
          char str;                                                   
          void* ptr;                                                  
      };                                                              
                                                                      
      /**                                                             
       * @brief                                                       
       *                                                                                              
       * @param a                                                     
       * @param b                                                     
       *                                                              
       * @return                                                      
       */                                                             
      int bar(int a, int b)                                           
      {                                                               
          return a+b;                                                 
      }         
    複製代碼

    並把光標定位在@brief 後,期待你輸入具體的註釋內容。

5. 代碼智能提示與補全

寫代碼的時候,變量名、函數名、類名等代碼符號的智能提示和補全功能是很是有用的,能夠大大提升編碼效率。然而,在YouCompleteMe(簡稱YCM)這個神奇的插件出現以前,vim一直使用tag機制來完成這個功能。因爲tag只會笨拙地分析代碼中的字符串,並不能識別其語法說語義,致使代碼的提示並很差用。隨着clang的出現,使開發人員能夠對程序代碼進行事實上的語義分析(調用clang分析器之類的),因而真正的智能提示和補全插件出現了,它就是由 google 的工程師 Strahinja Val Markovic 所開發的YCM(https://github.com/Valloric/YouCompleteMe)。

5.1 YouCompleteMe的安裝與配置

YCM使用C++和python開發,是一個複雜的插件,光是經過Vundle下載的文件就達到120多MB。另外YCM不僅是有新的開發的功能,它還包含了其餘一些有用的插件。下圖是做者本人提示的演示動圖:

除了代碼提示與補全外,藉助libclang強大的語法與語義分析能力,YCM還能夠在編輯的時候提示出錯的行與出錯緣由,以下圖所示:

另外,YCM還能夠補全路徑,文件名等。

 

安裝與配置步驟:

  1. 若是是在Ubuntu 14.04上,運行如下命令安裝
      
    sudo apt-get install vim-addon-manager 
    sudo apt-get install vim-youcompleteme
    vim-addons install youcompleteme
    來安裝YCM插件,很是簡單。不然到2.

    ==2016.12.30補充 在CentOS7上安裝YouCompleteMe==

    1.1.下載Vundle和YouCompleteMe插件

    輸入如下指令,下載Vundle

    git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    下載成功後,在用戶根目錄下面,修改.vimrc文件,追加下面語句以便後續安裝YouCompleteMe插件

    set  nocompatible
    filetype off
    set  rtp+=~/.vim /bundle/Vundle .vim
    call vundle #begin()
    Plugin 'gmarik/Vundle.vim'
    Plugin 'Valloric/YouCompleteMe'
    call vundle #end()
    filetype plugin indent on   

    而後在vim中先按Esc建,而且輸入如下指令安裝插件:

    :PluginInstall 
    1.2.編譯YouCompleteMe

    在編譯以前下載編譯工具,準備編譯YouCompleteMe

    yum install gcc gcc-c++ cmake python-devel
    編譯YouCompleteMe使其支持C/C++ 自動補全

    cd ~/.vim/bundle/YouCompleteMe
    ./install.py --clang-completer

     

  2. 若是是Ubuntu 12.04,有好多問題要解決,若是條件容許最好直接用14.04. 不然到3.
    a. 系統自帶的vim版本太低,須要先把版本升級到7.4,目前除了下源碼編譯我不知道有什麼別的方法。
    參考:https://github.com/Valloric/YouCompleteMe/wiki/Building-Vim-from-source
    b. CMake版本太低,須要升級到2.8.11以上。到http://www.cmake.org/download/ 下一高版本便可。
    c. 有可能沒有安裝ctags,apt-get安裝一個便可,後文要用到。
  3. 與以上插件同樣,在.vimrc中添加 Plugin 'Valloric/YouCompleteMe',並運行:PluginInstall命令安裝。
  4. 下載最新的clang。
    YCM是爲clang 3.6設計的,理論上的最低版本不該低於3.2+。YCM使用clang提供的libclang來解析代碼主義等.
    從 http://llvm.org/releases/download.html 下載爲你的系統預編譯好的clang。
    但上面的列表並無爲全部系統提供精確的版本,好比我要在CentOS 7.0 64bit上編譯YCM,但上面沒有,因此只好本身編譯,方法是:
    a. 下載LLVM source code: llvm-3.6.2.src.tar.xz, 解壓到llvm-3.6.2.src
    b. 下載Clang source code: cfe-3.6.2.src.tar.xz, 解壓到llvm-3.6.2.src/tools/clang
    c. 下載Compiler RT source code: compiler-rt-3.6.2.src.tar.xz, 解壓到llvm-3.6.2.src/projects/compiler-rt
    d. 下載Clang tools Extra:clang-tools-extra-3.6.2.src.tar.xz,解壓到llvm-3.6.2.src/tools/clang/tools/extra
    e. 不妨在llvm-3.6.2.src父目錄中創建build目錄並編譯
    mkdir llvm_build; cd llvm_build
    ../llvm-3.6.2.src/configure --enable-optimized --enable-targets=host-only
    make && make install
    這裏必定要記得make install,不然clang源碼中的頭文件沒有放到/usr/include相關目錄下,一會編譯YCM庫時會報找不到頭文件的錯誤。(這個編譯的很是慢,生成1.6GB+文件)

  5. 編譯ycm_support_libs。
    a. 這要求系統安裝了cmake, python(2.6+), python-devel(2.6+)等,若是不知足條件cmake的時候會提示錯誤。
    b. cd~; mkdir ycm_build; cd ycm_build
    c. 若是是安裝了預編譯好的clang,請運行cmake -G "Unix Makefiles" -DPATH_TO_LLVM_ROOT=~/clang+llvm-3.4.2-x86_64-unknown-ubuntu12.04 . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp,生成Makefile。其中clang+llvm-3.4.2-x86_64-unknown-ubuntu12.04是clang預編譯包解壓後的路徑,裏面有bin,lib,include等目錄;
    不然,若是是本身在第4步從源碼編譯的clang,則運行 cmake -G "Unix Makefiles" -DEXTERNAL_LIBCLANG_PATH=~/llvm_build/Release+Asserts/lib/libclang.so . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp,生成Makefile。其中~/llvm_build是用於從源碼編譯的build目錄。
    d. 運行 make ycm_support_libs生成YCM支持庫
    這一過程會在~/.vim/bundle/YouCompleteMe/third_party/ycmd/下生成幾個.so。至此,YCM編譯已結束。
  6. 配置YCM
    a. YCM在語義分析時使用libclang,而libclang須要參數選項,這從哪裏來呢?YCM經過提供給一個代碼工程一個python文件的方式來通知libclang所需的參數選項,這個文件就是.ycm_extra_conf.py。YCM安裝好後在,在路徑~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py有一個默認的配置文件,能夠把它拷貝到你的代碼所在主目錄下,並進行修改。主要是修改此文件中的flags表,加入本身代碼所在路徑、語言類型(C/C++)等。
    複製代碼
    # These are the compilation flags that will be used in case there's no
    # compilation database set (by default, one is not set).
    # CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
    flags = [
    '-Wall',
    '-Wextra',
    '-Werror',
    '-Wc++98-compat',
    '-Wno-long-long',
    '-Wno-variadic-macros',
    '-fexceptions',
    '-DNDEBUG',
    # You 100% do NOT need -DUSE_CLANG_COMPLETER in your flags; only the YCM
    # source code needs it.
    '-DUSE_CLANG_COMPLETER',
    # THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which
    # language to use when compiling headers. So it will guess. Badly. So C++
    # headers will be compiled as C headers. You don't want that so ALWAYS specify
    # a "-std=<something>".
    # For a C project, you would set this to something like 'c99' instead of
    # 'c++11'.
    '-std=c++11',
    # ...and the same thing goes for the magic -x option which specifies the
    # language that the files to be compiled are written in. This is mostly
    # relevant for c++ headers.
    # For a C project, you would set this to 'c' instead of 'c++'.
    '-x',
    'c++',
    '-isystem',
    '../BoostParts',
    '-isystem',
    # This path will only work on OS X, but extra paths that don't exist are not
    # harmful
    '/System/Library/Frameworks/Python.framework/Headers',
    '-isystem',
    '../llvm/include',
    '-isystem',
    '../llvm/tools/clang/include',
    '-I',
    '.',
    '-I',
    './ClangCompleter',
    '-isystem',
    './tests/gmock/gtest',
    '-isystem',
    './tests/gmock/gtest/include',
    '-isystem',
    './tests/gmock',
    '-isystem',
    './tests/gmock/include',
    ]
    複製代碼

    b. 在.vimrc中添加如下配置項(更多項見https://github.com/Valloric/YouCompleteMe#general-usage)。

    複製代碼
    " YCM                                                              
    " 容許自動加載.ycm_extra_conf.py,再也不提示                         
    let g:ycm_confirm_extra_conf=0                                     
    " 補全功能在註釋中一樣有效                                         
    let g:ycm_complete_in_comments=1                                   
    " 開啓tags補全引擎                                                 
    let g:ycm_collect_identifiers_from_tags_files=1                    
    " 鍵入第一個字符時就開始列出匹配項                                 
    let g:ycm_min_num_of_chars_for_completion=1                        
    " YCM相關快捷鍵,分別是\gl, \gf, \gg                                                    
    nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR>              
    nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>               
    nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
    複製代碼

其中,

  • g:ycm_confirm_extra_conf若是不設爲0的話,用vim每次打開代碼文件,YCM都會提示是否確認加載某某.ycm_extra_conf.py文件;
  • ycm_collect_identifiers_from_tags_files設爲1,指定YCM收集傳統tags文件的信息,另外當tags改變時,YCM會從新索引它們。YCM對tags文件的格式有特殊的要求:The only supported tag format is the Exuberant Ctags format. The format from "plain" ctags is NOT supported. Ctags needs to be called with the --fields=+l option (that's a lowercase L, not a one) because YCM needs the language:<lang> field in the tags output。若有問題請參閱YCM官網相關FAQ;
    好比引入C++tags:
    " 引入 C++ 標準庫tags
    set tags+=/data/misc/vim/stdcpp.tags
  • 3個快捷鍵設置是用來快速跳轉到符號聲明或定義的。我每每只用gg,即將光標定位到某個符號上,按\鍵後(默認的leader鍵是\),快速按兩次g鍵,將跳轉到該符號的聲明或定義位置(Tips: 按<ctrl>+o返回)

其餘技巧:

  • 執行:YcmDiags顯示全部錯誤, 它實際上是打開了一個location list窗口,也可能經過:lopen打開. 使用:lclose能夠關閉
  • 有些系統函數如fopen, strcpy若是不智能提示,能夠按<Ctrl>+<Space>鍵。
  • 若是有的文件死活沒法正確提示(若是結構體之類),請檢查一下文件編碼,改爲utf-8。(vim中 :set fileencoding=utf8)

 

5.2 完善代碼提示與補全

 如5.1所述,YouCompleteMe插件是如此地強大。然而,某些時候它可能仍是會有些小問題,好比沒法提示宏定義等等,致使沒法補全,這時候仍是須要藉助傳統的tags文件。indexer插件能夠針對不一樣的工程目錄自動地生成、更新和引入不一樣的tags文件,詳見http://www.vim.org/scripts/script.php?script_id=3221。它須要依賴DfrankUtil和Vimprj 兩個插件,須要一併安裝。

安裝與配置步驟:

1. 在.vimrc的Vundle區域內加入如下內容

Plugin 'DfrankUtil'                                             
Plugin 'vimprj'                                                 
Plugin 'indexer.tar.gz'

以後運行:PluginInstall安裝;

2. 打開.vimrc,加入如下內容:

" indexer                                                       
" 設置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 --e
xtra=+q"

3. indexer會根據你的代碼工程的不一樣,自動生成並在其中的代碼文件被打開時自動加載tags文件。它是經過配置文件來指定工程設置的,此文件爲~/.indexer_files。如下是一個配置示例,演示了2個不一樣的工程的Indexer配置。

複製代碼
[CoolProject] 
/home/user/cool_project 

[AnotherProject] 
option:ctags_params = "--languages=c++" 
/home/user/another_project/src 
/home/user/another_project/lib 
複製代碼

 

6 參考

相關文章
相關標籤/搜索