Ubuntu13.04配置:Vim+Syntastic+Vundle+YouCompleteMe

序言

    使用Ubuntu和vim已經有一段時間了,對於Vim下的插件應用,我老是抱着一股狂熱的態度。此次,又在網上閒逛着,發現了一個我的博客提到了Vim代碼補全這回事,並提到了YouCompleteMe這個插件。頓時激起了我折騰的慾望。之前我都是使用Ctags+<C-n>或<C-p>來進行補全,然而其命中率卻比較低,有時候根本就亂匹配。因而決定將YouCompleteMe這個插件安裝好適用一下,同時,用Vundle也好讓我將.vim文件夾下的文件清理一下.html

1、準備

(1)相關連接python

  1. PPA for vim 7.4. YouCompleteMe插件要求Vim 版本在7.3.584及以上,而Ubuntu13.04源中的Vim已經比較老了。因此,咱們能夠在源中添加PPA,或者編譯源碼手動更新VIM的版本。
  2. Vundle. 這是一個新生代vim插件管理器,使用git進行插件安裝和更新。之前有一個pathogen。插件管理器的好處是:使用簡單,自動化管理vim的插件。讓你的.vim文件夾遠離混亂不堪的窘境,今後一手.vimrc走天下。
  3. Clang+LLVM. LLVM+Clang是Apple公司資助的一個項目,YouCompleteMe精確的補全功能徹底依賴於Clang的代碼解析。咱們須要安裝好Clang 3.2+以便爲YCM提供支持。
  4. SVN和Git。用於從代碼庫中檢出源代碼。在Ubuntu下這兩個軟件的安裝都很是簡單,使用apt-get命令便可安裝完成。
  5. YouCompleteMeSyntastic.這兩個插件都是配合使用的。YCM不用再說,Syntastic用於源碼的實時檢查。具體效果如同Eclipse同樣,在代碼編寫的過程當中便可實時報告語法錯誤。
  6. Cmake.後面在編譯過程當中會使用到,安裝命令:sudo apt-get install cmake.

(2)配置VIMlinux

  1. 升級到7.3.584+。Ubuntu下須要手動添加PPA(Personal Package Archives),可使用命令行add-apt-repository來進行添加,如:
    $ sudo add-apt-repository ppa:nmi/vim-snapshots
    $ sudo apt-get update
    $ sudo apt-get install vim

    某些PPA也提供了源地址,那麼就能夠直接打開/etc/apt/source.list進行添加。兩者的本質是同樣的。如從源碼編譯vim,可參考這裏c++

  2. 下載Vundle。Vundle託管在Github上,須要使用到git來檢出源代碼。
    $ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

    以上命令直接將源代碼檢出到了~/.vim/bundle/vundle這個目錄下。git

  3. 下載完了vundle後,須要配置好.vimrc文件。須要配置的模板以下(摘在github):
    set nocompatible              " be iMproved
    filetype off                  " required!
    
    set rtp+=~/.vim/bundle/vundle/
    call vundle#rc()
    
    " let Vundle manage Vundle
    " required! 
    Bundle 'gmarik/vundle'
    
    " My bundles here:
    "
    " original repos on GitHub
    Bundle 'tpope/vim-fugitive'
    Bundle 'Lokaltog/vim-easymotion'
    Bundle 'rstacruz/sparkup', {'rtp': 'vim/'}
    Bundle 'tpope/vim-rails.git'
    " vim-scripts repos
    Bundle 'L9'
    Bundle 'FuzzyFinder'
    " non-GitHub repos
    Bundle 'git://git.wincent.com/command-t.git'
    " Git repos on your local machine (i.e. when working on your own plugin)
    Bundle 'file:///Users/gmarik/path/to/plugin'
    " ...
    
    filetype plugin indent on     " required!

    其中須要說明的是:filetype off這一條實際上並不須要。由於這條命令將致使語法着色失敗。個人.vimrc裏面並沒配置這一條。當所須要的vim插件託管在Github上時,該插件的可寫成「Bundle 'scrooloose/syntastic'」;當插件在www.vim.org上面時,咱們只須要寫明該插件的名稱,還要加上.vim擴展名。不然vundle沒法更新該插件。基本上這兩種狀況能夠知足咱們大部分人的須要了。github

  4. vundle的使用。先將~/.vim/下面原先安裝的插件都"rm -rf"掉吧,由vundle來接手管理工做。打開一個vim窗口,執行命令:BundleInstall。接下來vundle會自動去網上將相關插件下載下來並安裝好。在此過程當中,vundle還會:helptags命令。所以,咱們能夠直接在vim中查看插件的幫助文檔。要刪除一個插件也很簡單,先在~/.vimrc中移除該插件條目,而後進入vim執行命令:BundleClean。嘿嘿,vundle將自動清除掉插件的文件夾!狂拽炫酷吊炸天!ubuntu

  5. 編譯LLVM+Clang的源代碼。在http://clang.llvm.org上面Clang 3.3並無Ubuntu13.04 32bit的預編譯的二進制程序,因此只好下載源碼進行手工編譯。命令以下:
    //Checkout LLVM:
    cd llvmsrc
    svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
    //Checkout Clang:
    cd llvmsrc
    cd llvm/tools
    svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
    //Checkout Compiler-RT:
    cd llvmsrc
    cd llvm/projects
    svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
    //Get the Test Suite Source Code [Optional]
    cd llvmsrc
    cd llvm/projects
    svn co http://llvm.org/svn/llvm-project/test-suite/trunk test-suite
    //Configure and build LLVM and Clang:
    cd llvmsrc
    mkdir build (for building without polluting the source dir)
    cd build
    ../llvm/configure --enable-optimized

    以上步驟中惟一須要注意的是configure的時候,須要指定--enable-optimized參數。不然默認configure的將是Debug版本,問題多多。最後,咱們使用make命令進行編譯。編譯過程比較長,耗時半個小時左右。這一步主要是爲了下面編譯YouCompleteMe插件作準備。vim

2、配置

(1)編譯YouCompleteMe。沒錯,這個插件須要編譯!在Github項目說明中有詳細的安裝和使用方法,不過呢,官方說明中的Full Installation並無針對Ubuntu13.04 32bit的編譯說明,並且,該說明中使用的是預編譯Clang包。原先按照這個說明執行了一次,可是老是在libclang.so上面出錯,要不就是版本不對,要不就是根本不生成libclang.so。最後在網上找到了一個帖子,再結合官方說明編譯成功的。編譯步驟以下:服務器

  1. 下載源碼。咱們在前面使用vundle已經下載好了,所以這一步跳過。
  2. 執行命令:
    $ cd ~ 
    $ mkdir ~/ycm_build
    $ cd ~/ycm_build
    $ cmake -G "Unix Makefiles"  ~/.vim/bundle/YouCompleteMe/cpp -DEXTERNAL_LIBCLANG_PATH=~/ycm_temp/llvmsrc/lib/libclang.so 
    $ make ycm_core

    這裏要注意的是-DEXTERNAL_LIBCLANG_PATH這個參數,用於指定libclang.so的位置。若是不指定的話,YCM將沒法正常工做,老是報:The YCM shut down, crash report...之類的錯誤。而這個libclang.so就是咱們在編譯Clang的時候生成的。所以,相關路徑(也即~/ycm_temp/llvmsrc/lib/libclang.so)須要替換成本身對應的路徑。架構

  3. 關於make。在官方文檔中只使用了:make ycm_support_libs.而我在實際操做中卻屢屢失敗。實際上,首先要執行:make ycm_core。這樣將在~/.vim/bundle/YouCompleteMe/python/目錄下自動生成兩個文件(libclang.so和ycm_core.so),以下圖:

  4. 這仍是不夠的,還必須執行命令:make ycm_support_libs。 這條命令纔會生成第三個文件ycm_client_support.so。由於,YouCompleteMe是C/S架構的,因此存在服務器和服務端的說 法。另外,在/tmp/ycm_temp/目錄下還能夠看到服務和請求日誌,更加能夠驗證這一點。
  5. 最後,爲了能順利的完成配置工做,咱們還須要配置一下.ycm_extra_conf.py這個文件。項目說明中有個配置模板,咱們須要作改動的就是flags部分。使用-isystem標誌添加系統的頭文件進行解析,而-I標誌用於添加第三分的頭文件進行解析。個人flags在最後增長以下:
    '-isystem',
    '/usr/include',
    '-isystem',
    '/usr/include/c++/',
    '-isystem',
    '/usr/include/i386-linux-gnu/c++'

    此外,爲了更好的提升補全效率,咱們能夠保留原先使用的用Ctags生成的tags文件,並在~/.vimrc中添加:let g:ycm_collect_identifiers_from_tag_files = 1.其中,在vim中使用 :echo tagfiles()能夠查看當前使用的tags文件。至於生成tags文件的方法,能夠看Ctags的幫助文件或者上網搜索。

  6. 至此,配置還沒有結束。.ycm_extra_conf.py文件能夠是針對工程而言,也能夠設置全局的。對工程而言,放在工程的根目錄便可。不過每次打開文件都會詢問是否加載,這時能夠在~/.vimrc中設置:let g:ycm_confirm_extra_conf=0來關閉提示。若是是針對全局的,那麼能夠在~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py中設置。若是沒有問題,應該能夠看到YouCompleteMe強大的一面了,效果在下面。

(2)Syntastic和Vundle的安裝很簡單,主要在於配置,因此就不花時間講解安裝,看看配置就能夠了。而重點和難點在於YouCompleteMe和Clang的編譯工做,這兩個編譯步驟都比較複雜,編譯耗時較長。因此花了很大篇幅講解。

3、附錄

(1)效果圖。這是補全C++的圖,圖中紅色的小叉是Syntastic的效果。若是須要補全C,還得去.ycm_extra_conf.py中修改一下。

沒有想到的是,YCM還能補全文件和目錄。。。

下面是Syntastic的效果圖,警告和錯誤標誌可配置,光標在錯誤行時,vim的命令行會有相關錯誤信息:

(2)遇到的問題。

  1. libclang.so的版本必定要在3.2+,不然YCM沒法正常工做。必需要經過上面的make ycm_core和make ycm_support_libs來生成上述的三個.so文件,不能手工拷貝。
  2. 若是出現bits/c++config.h文件沒法找到的錯誤.那麼能夠考慮將系統中存在的c++config.h文件所在的文件夾中的全部文件,拷貝到/usr/include/c++/4.8/bits目錄下,參考連接!

(3)相關說明。

  1. 編譯vim源碼的時候,須要打開python選項。
  2. vundle中的插件條目,若是託管在www.vim.org上,須要加.vim擴展名。
  3. 一個較爲完善的.vimrc模板
  4. 個人部分插件配置:
    """"""""" Settings of taglist""""""""""""""
    " increase the width of the taglist window
    let Tlist_WinWidth=10
    " automatically open the taglist window 
    let Tlist_Auto_Open=0
    " exit wim when only the taglist window exist
    let Tlist_Exit_OnlyWindow=1
    " open tags with single click
    let Tlist_Use_SingleClick=1
    " close tag folds for inactive buffers
    let Tlist_File_Fold_Auto_Close=1
    " show the fold indicator column in the taglist window 
    let Tlist_Enable_Fold_Column=1
    " Automatically update the taglist to include newly edited files
    let Tlist_Auto_Update=1
    """""""""" NERDtree settings"""""""""""""""
    let NERDTreeWinPos='right'
    """""""""" mini buffer navigator"""""""""""
    let g:miniBUfExplMapWindowNavVim=1
    let g:miniBufExplMapWindowNavArrows=1
    let g:miniBufExplMapCTabSwitchBufs=1
    let g:miniBufExplModSelTarget=1 
    let g:miniBufExplUseSingleClick=1
    
    """"""""""""ctags settings"""""""""""""""""
    set tags+=~/.vim/cpptags
    set tags+=~/.vim/systags
    
    """""""""""color scheme""""""""""""""""""""
    let g:molokai_original=1
    
    """"""""""""vundle"""""""""""""""""""""""""
    set nocompatible
    
    set rtp+=~/.vim/bundle/vundle/
    call vundle#rc()
       
    " let Vundle manage Vundle
    " required! 
    Bundle 'gmarik/vundle'
    
    """"""""vim scripts""""""""""""""""""
    Bundle 'taglist.vim'
    Bundle 'c.vim'
    Bundle 'minibufexpl.vim'
    Bundle 'grep.vim'
    Bundle 'mru.vim'
    Bundle 'comments.vim'
    
    """"""""git repo"""""""""""""""
    Bundle 'scrooloose/nerdtree'
    Bundle 'Valloric/YouCompleteMe'
    Bundle 'vim-scripts/AutoClose'
    Bundle 'scrooloose/syntastic'
    Bundle 'Lokaltog/vim-powerline'
    
    """"""""""syntastic""""""""""""
    let g:syntastic_check_on_open = 1
    let g:syntastic_cpp_include_dirs = ['/usr/include/']
    let g:syntastic_cpp_remove_include_errors = 1
    let g:syntastic_cpp_check_header = 1
    let g:syntastic_cpp_compiler = 'clang++'
    let g:syntastic_cpp_compiler_options = '-std=c++11 -stdlib=libstdc++'
    "set error or warning signs
    let g:syntastic_error_symbol = ''
    let g:syntastic_warning_symbol = ''
    "whether to show balloons
    let g:syntastic_enable_balloons = 1
    
    """"""""""""YCM""""""""""""""""""""
    let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py'
    let g:ycm_collect_identifiers_from_tags_files = 1
    let g:ycm_seed_identifiers_with_syntax = 1
    let g:ycm_confirm_extra_conf = 0
  5. 推薦的較爲好用的插件包括:
    439 """"""""vim scripts""""""""""""""""""
    440 Bundle 'taglist.vim'
    441 Bundle 'c.vim'
    442 Bundle 'minibufexpl.vim'
    443 Bundle 'grep.vim'
    444 Bundle 'mru.vim'
    445 Bundle 'comments.vim'
    446 
    447 """"""""git repo"""""""""""""""
    448 Bundle 'scrooloose/nerdtree'
    449 Bundle 'Valloric/YouCompleteMe'
    450 Bundle 'vim-scripts/AutoClose'
    451 Bundle 'scrooloose/syntastic'
    452 Bundle 'Lokaltog/vim-powerline' 
    Bundle 'kien/ctrlp.vim'

(4)參考連接:

  1. cold's world
  2. http://stackoverflow.com/questions/18028071/vim-c-ycm-and-syntastic-include-path-problems
  3. http://stackoverflow.com/questions/9201521/g-4-6-issue-no-bits-cconfig-h-file-as-required-by-the-header-cstring
  4. http://www.cplusplus.com/forum/unices/114261/
  5. http://blog.csdn.net/ywh147/article/details/13625905(價值較高)
  6. http://williamherry.com/blog/2012/08/25/master-vim-04-ctrlp/
  7. http://www.bestofvim.com/plugin/ctrl-p/
相關文章
相關標籤/搜索