VIM插件: YouCompleteMe[代碼自動補全]

自從轉入終端編程,最令我頭疼的就是代碼補全的問題,vc6.0中有assist X插件,簡單安裝就可以完美代碼補全;vs中自帶代碼補全功能。到了後臺server + 模擬終端編程的模式,完全找不到了方法。代碼寫的很是痛苦。

痛點:前面定義了一個變量,後面用的時候忽然忘記這個變量的名字了,於是不得不翻回去查這個變量。更有時候這個變量的名字很長,記不住啊,逼得我把名字寫在紙上,費了老勁了。

後來使用了ctags,不管怎麼樣,還是幫了很大忙。但是這種基於文本的匹配很不好,速度慢,準確度低。於是一直嚮往傳說中的YouCompleteMe。於是乎動手配置,結果從下午搞到了凌晨四點半,經歷了無數的坑,沒有結果。

我沒有放棄,繼續搞。不斷的google,終於找到了幾篇感覺靠譜的文章,但是由於公司的權限的限制,我不能用最新版的linux系統,不得不升級gcc、cmake,同時系統預裝的python2.6.6我不敢升級,virtualenv又不能用,無奈只好用docker。但是docker又踩了好多的坑,比如docker磁盤空間no left等問題都出現了。

這裏寫圖片描述

被逼無奈諮詢我的leader,他瞭解到我用的安裝系統是centos6.6,他說你可以用最新版的Ubuntu系統試試,不要用centos,更不能用6.6版本,不然要升級的東西太多,太費勁。

所以最後的方法是:在16.04的Ubuntu系統上安裝YCM,安裝到docker中,然後放到生產環境的機器中編寫代碼。

爲了避開docker給我帶來的麻煩,我決定先用VMware + Ubuntu16.04試試,於是下載、安裝。安裝之後我發現,Ubuntu16.04就是好,cmake、gcc、python等軟件包的版本都符合YCM的要求,直接安裝YCM就可以了。

Ubuntu16.04的一些軟件可能沒有安裝,但是通過apt-get可以直接安裝很高版本的軟件包,直接符合YCM的要求


下面直接開幹:

1. 安裝用到的軟件包

通過apt-get直接獲得高版本的軟件包,不用再次升級(yum的軟件包基本都是很低的版本的軟件包,坑爹)。

sudo apt-get install vim
sudo apt-get install git
sudo apt-get install subversion
sudo apt-get install python-dev libxml2-dev libxslt-dev
sudo apt-get install gcc
sudo apt-get install cmake

apt-get 安裝軟件簡直不能再爽了,yum 安裝然後在升級,真是太費勁,特別是升級gcc真的不簡單啊,各種libstdc++ 找不到。

大概就是這些安裝包,具體缺什麼在apt-get安裝,反正基本都滿足要求,不用升級。

2. 安裝Vundle

通過下面的命令clone一個Vundle:

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

順便把下面的代碼放到~/.vimrc 中:

set nocompatible              " be iMproved, required
filetype off                  " required

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'

Plugin 'Valloric/YouCompleteMe'

call vundle#end()            " required
filetype plugin indent on    " required

3. 安裝YouCompleteMe

第一步:

首先確定YCM的安裝方式,分爲兩種:使用Vundle和使用源代碼安裝,注意此步僅僅相當於安裝了一個空殼,並不能使用YCM,還需要後續步驟。

(1)使用Vundle安裝

  Vundle是Vim的一款管理插件的插件,安裝詳細請參照Vundle官方網站。注意把官網下方的配置文件放入你自己的.vimrc裏,可以把不需要的插件去除。 在你的vimrc中添加Plugin ‘Valloric/YouCompleteMe’,然後執行:PluginInstall。 注:使用Vundle更新YCM的時候可能需要重新編譯,引用來自官方的提示:
  

YCM is a plugin with a compiled component. If you update YCM using Vundle and the ycm_support_libs library APIs have changed (happens rarely), YCM will notify you to recompile it. You should then rerun the install process.

不推薦這種安裝方式,看不到進度,不知道啥時候在哪裏出錯了。

(2)使用源碼安裝

#下載YouCompleteMe源碼
git clone https://github.com/Valloric/YouCompleteMe.git ~/.vim/bundle/YouCompleteMe
cd YouCompleteMe/ 
#獲取YCM的依賴包  
git submodule update --init --recursive
#然後在在vimrc文件中加入
Plugin 'Valloric/YouCompleteMe'  

第二步:

(1)快速安裝

此處給出支持C-family的命令,其他的選項見參考文檔。

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

官方文檔上說這種方式可能會出錯,但是應該先嚐試一下。因爲Ubuntu16.04通過apt-get安裝的軟件的版本都很高,所以有很大的可能性成功。中間出了什麼錯,再google就可以了。反正我親測,這種方法是可以的。

在fast installation中遇到一個錯誤,就是提示python與C語言的連接的頭文件,google了一下發現少安裝了一個python-dev,通過apt-get搞定,繼續編輯,最後就成功了。

(2)完整安裝

如果你真的沒辦法只能用centos,下面的方法試試,我沒測試。
這裏不寫了,給一個官方連接的文檔:

4. YouCompleteMe配置:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => YouCompleteMe  代碼自動補全
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Bundle 'Valloric/YouCompleteMe'
" youcompleteme  默認tab  s-tab 和自動補全衝突
" let g:ycm_key_list_select_completion=['<c-n>']
" let g:ycm_key_list_select_completion = ['<Down>']
" let g:ycm_key_list_previous_completion=['<c-p>']
" let g:ycm_key_list_previous_completion = ['<Up>']
set completeopt=longest,menu
let g:ycm_confirm_extra_conf=0      " 關閉加載.ycm_extra_conf.py提示
let g:ycm_complete_in_comments = 1  "在註釋輸入中也能補全
let g:ycm_complete_in_strings = 1   "在字符串輸入中也能補全
let g:ycm_collect_identifiers_from_tags_files=1                 " 開啓 YCM 基於標籤引擎
let g:ycm_collect_identifiers_from_comments_and_strings = 1   "註釋和字符串中的文字也會被收入補全
let g:ycm_seed_identifiers_with_syntax=1   "語言關鍵字補全, 不過python關鍵字都很短,所以,需要的自己打開
let g:ycm_collect_identifiers_from_tags_files = 1
let g:ycm_min_num_of_chars_for_completion=2                     " 從第2個鍵入字符就開始羅列匹配項
let g:ycm_path_to_python_interpreter='/usr/bin/python'
" 引入,可以補全系統,以及python的第三方包 針對新老版本YCM做了兼容
" old version
if !empty(glob("~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py"))
    let g:ycm_global_ycm_extra_conf = "~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py"
endif
" new version
if !empty(glob("~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py"))
    let g:ycm_global_ycm_extra_conf = "~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py"
endif

"mapping
nmap <leader>gd :YcmDiags<CR>
nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR>           " 跳轉到申明處
nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>            " 跳轉到定義處
nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>

" 直接觸發自動補全
let g:ycm_key_invoke_completion = '<C-Space>'
" 黑名單,不啓用
let g:ycm_filetype_blacklist = {
      \ 'tagbar' : 1,
      \ 'gitcommit' : 1,
      \}  

5. 參考鏈接:

  1. http://davisvigneault.com/2016/02/youcompleteme-rocks/
  2. http://wsmmsh.github.io/2016/02/02/Centos%E5%AE%89%E8%A3%85YouCompleteMe/
  3. http://www.cnblogs.com/xiehongfeng100/p/4651972.html
  4. http://btorpey.github.io/blog/2015/01/02/building-clang/
  5. http://clang.llvm.org/get_started.html
  6. http://llvm.org/docs/GettingStarted.html#getting-started-quickly-a-summary
發佈了65 篇原創文章 · 獲贊 10 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章