一、前言
YouCompleteMe是VIM中進行C/C++ 開發的重要工具,可以極大提升linux下C/C++開發效率。
YCM需要高版本的gcc (8.0以上版本,支持C++17) 和 vim(8.0以上,支持python3.6以上)
二、編譯gcc_8.3
1. 獲取源碼
wget https://mirrors.ustc.edu.cn/gnu/gcc/gcc-8.3.0/gcc-8.3.0.tar.xz -P ~
tar xvf gcc-8.3.0.tar.xz -C ~
cd ~/gcc-8.3.0
2. 運行 download_prerequisites 腳本
./contrib/download_prerequisites
3. 創建編譯目錄
mkdir build-gcc-8.3.0
cd build-gcc-8.3.0
4. 配置
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib --prefix=/home/jello/gcc (注意替換一下紅色的用戶名噢)
5. 編譯
make -j4
6. 安裝
make install
三、編譯YCM
1.下載Vundle和YouCompleteMe插件
輸入以下指令,下載Vundle
git clone GitHub - VundleVim/Vundle.vim: Vundle, the plug-in manager for Vim ~/.vim/bundle/Vundle.vim
2.下載成功后,在用戶根目錄下面,修改.vimrc文件,追加下面語句以便后續安裝YouCompleteMe插件
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin ‘Valloric/YouCompleteMe’
call vundle#end()
filetype plugin indent on
3.編譯YouCompleteMe
在編譯之前下載編譯工具,準備編譯YouCompleteMe
yum install gcc gcc-c++ cmake python-devel
4.編譯YouCompleteMe使其支持C/C++ 自動補全
cd ~/.vim/bundle/YouCompleteMe
./install.py --clang-completer
四、編譯binutils_2.29
編譯vim時出現連接python庫失敗,原因是系統的binutils版本低了,因此需要編譯安裝binutils
1. 下載
wget http://ftp.gnu.org/gnu/binutils/binutils-2.29.tar.gz ./
2. 編譯安裝
unzip binutils-2.29.tar.gz
cd binutils-2.29
./configure --prefix=/data/jzying/opt
make -j && make install
五、編譯vim_8.2
1、下載
git clone GitHub - vim/vim: The official Vim repository
2、編譯:
注意vim只能安裝到/usr開頭的目錄內
rm -fr /usr/local/vim8
mkdir -p /usr/local/vim8
cd vim/src
./configure --with-features=huge \
--enable-multibyte \
--enable-rubyinterp=yes \
--enable-python3interp=yes \
--with-python3-config-dir=$(python3-config --configdir) \
--enable-perlinterp=yes \
--enable-luainterp=yes \
--enable-gui=gtk2 \
--enable-cscope \
--prefix=/usr/local'
其中:/usr/local/python3.6.8是python3的安裝路徑(python3要以--enable-shared參數安裝,如果是python3.6.5以上,還需要指定:--with-openssl參數,下面會有原因說明)
----暫時不需要的config參數
--enable-rubyinterp
--enable-luainterp
--enable-perlinterp
--with-python3-config-dir=/opt2/python-3.6.5/lib/python3.6/config-3.6m-x86_64-linux-gnu
--with-python3-config-dir=/usr/local/python3.7.2/lib/python3.7/config-3.7m-x86_64-linux-gnu \
make && make install
tips:(如果make的時候出錯,執行make distclean)
make distclean、
3、創建軟連接
mv /usr/bin/vim /usr/bin/vim_bak
ln -sf /usr/local/vim8/bin/vim /usr/bin/vim
4、查看當前vim版本是否支持python3
vim --verison | grep python3
5、測試:
python3 import subprocess;print(subprocess)
安裝jedi,jedi-vim和YouCompleteMe 都依賴這個模塊來完成自動提示
pip install jedi
六、配套插件安裝
1、CompleteParameter.vim
YCM使用中有個不方便的地方,是對于函數參數的提示不能持續的提示,再輸入完函數名稱后提示就會關閉,但可以通過該插件一定程度緩解這個問題
插件地址:GitHub - tenfyzhong/CompleteParameter.vim: Complete parameter after select the completion. Integration with YouCompleteMe(ycm), deoplete, neocomplete.
安裝方法:下載代碼后,拷貝到bundle目錄,并在vimrc里面配置插件
配置參數:
inoremap <silent><expr> ( complete_parameter#pre_complete("()")
smap <c-j> <Plug>(complete_parameter#goto_next_parameter)
imap <c-j> <Plug>(complete_parameter#goto_next_parameter)
smap <c-k> <Plug>(complete_parameter#goto_previous_parameter)
imap <c-k> <Plug>(complete_parameter#goto_previous_parameter)
七、問題解決
1. 如果出現 AttributeError: 'module' object has no attribute 'FlagsForFile' 錯誤
需要添加一個配置文件,在這里添加一個 C family 類型文件模板
import os import ycm_core flags = [
'-Wall',
'-Wextra',
'-Werror',
'-Wno-long-long',
'-Wno-variadic-macros',
'-fexceptions',
'-ferror-limit=10000',
'-DNDEBUG',
'-std=c99',
'-xc',
'-isystem/usr/include/',
]
SOURCE_EXTENSIONS = [
'.cpp',
'.cxx',
'.cc',
'.c',
]
def FlagsForFile( filename, **kwargs ):
return {
'flags': flags,
'do_cache': True
}
將以上代碼寫入到這個文件~/.ycm_c-c++_conf.py
打開 .vimrc 配置文件 加入如下語句:
let g:ycm_global_ycm_extra_conf = "~/.ycm_c-c++_conf.py"
2. 未定義的符號錯誤:youcompleteme unavailable undefined symbol pyunicode_fromformat
原因:編譯后,vim 需要用到:/usr/local/python3.6.8/lib/python3.6/lib-dynload/*.so動態庫,
而這些動態庫需要python主庫的一些symbol,在vim里找不到。
解決方法參考:Issues · vim/vim · GitHub LDFLAGS="-rdynamic",因為vim中把python的庫當做動態庫來使用,而實際鏈接的庫確實靜態庫,rdynamic可以將所有的第三方庫符號一次性加載到符號表,避免出現符號未定義的問題。