您的位置:首页 > 其它

Vim杀手级插件YouCompleteMe

2014-11-11 09:19 555 查看

Vim一定不能错过的一款插件:YouCompleteMe

一:准备

YouCompleteMe需要vim版本7.3.5以上,可以在vim下使用:vim --version查看版本以及支持的控件,Ycm需要python2支持,vim版本太旧可以先完全删除vim,然后自己编译vim源码来安装,Build
vim from source,按照github手册来,很简单。 ;)

Vundle:这是一个新生代vim插件管理器,使用git进行插件安装和更新。以前有一个pathogen。插件管理器的好处是:使用简单,自动化管理vim的插件。让你的.vim文件夹远离混乱不堪的窘境,妈妈再也不用担心我的.vimrc了。我们使用Vundle来安装所有的插件,包括YCM。

Clang+LLVM:YouCompleteMe精确的补全功能完全依赖于Clang的代码解析。我们需要安装好Clang 3.2+以便为YCM提供支持。

git : sudo apt-get install git / sudo yum install git

YouCompleteMe和Syntastic.这两个插件都是配合使用的。YCM不用再说,Syntastic用于源码的实时检查。具体效果如同Eclipse一样,在代码编写的过程中即可实时报告语法错误,非常的爽!

Cmake:编译过程中会使用到,安装命令:sudo apt-get install cmake 注意下我用的是ubuntu14.04,cmake原来的版本(cmake --version)好像是2.8,它识别的python只到3.3,cmake3.0以上的版本就能识别python3.4了,不过YCM只要用python2.7

小结下:

一定要安装好准备环境,ubuntu崩溃后,我重新装了centos7,吃了以前的亏,我先装vundle,再装YCM,然后把所有准备都做好,cmake(2.8),clang + llvm + libc++, 全部安装好之后,再开始编译YCM, cmak -G ... make ycm_core make ycm_support_libs 一气呵成,不再像上次ubuntu装的时候捣腾了半天的错误了。

二:配置

下载了Vundle之后,我们把 ~/.vimrc文件配置一下,刚开始可以 配置点简单的,写代码功能基本有就可以了,逐渐增加功能逐渐添加配置就好 : )

再推荐一套比较好用的vim插件:

a.vim : 在vim下输入 :A 跳转到同名的 .h 头文件之中
ctag.vim : ***tags文件标签,但是全局只能配置一个tags文件,在 .vimrc 里面指定。 ***tags文件时,到工程根目录,使用 ctags -R 即可,在代码中使用 ctrl + ] 跳转。
taglist :标签列表
vundle:vim插件管理 (vundle)
powerline:状态栏增强

nerdtree:文件浏览器

YouCompleteMe:代码补全(cool!!) 不过听说ycm在单个文件超过500 /1000行的时候开始变得卡顿,毕竟是基于python做的匹配。
syntastic:语法检查,配合ycm使用,注意配置好。

delimitMate:括号补全

indentLine:显示缩进对齐

winmanager :可以将taglist和winfileexplorer集成到一起来

感觉有这些足够了,多工作区可以多开代码文件,很方便。

set nu
set cindent
set autoindent
set tabstop=4
set softtabstop=4
set shiftwidth=4
set smartindent
set history=1000
set linebreak
set expandtab
set mouse=a
set nobackup
set hlsearch
set incsearch
set wrap linebreak
set showbreak=" "
set ruler
set ai
set bs=2
set showcmd
set number
set cursorline
set scrolloff=4
set sidescroll=1
set sidescrolloff=15
set showmatch
syntax enable
syntax on
set splitbelow
set splitright

set so=7
set backspace=eol,start,indent
set ignorecase
set smartcase
set incsearch
set magic
set noerrorbells
set novisualbell

set encoding=utf-8
set fileencoding=utf-8
set fileencodings=utf-8,gbk,gb2312,big5

autocmd FileType c,cpp,py,cc set shiftwidth=4 | set expandtab

"""""vundle""""""""""""""""""
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

"let Vundle manage Vundle
Plugin 'gmarik/Vundle.vim'

"my Bundle here:

"vim scripts
Bundle 'taglist.vim'
Bundle 'a.vim'

"original repos on github
Plugin 'Valloric/YouCompleteMe'
Plugin 'scrooloose/syntastic'
Plugin 'scrooloose/nerdtree'
Plugin 'edsono/vim-matchit'
Plugin 'Valloric/ListToggle'
Plugin 'Lokaltog/vim-powerline'
Plugin 'Yggdroot/indentLine'

call vundle#end()
filetype plugin indent on

"""""""""""YouCompleteMe""""""""""""""""
"nnoremap <leader>jd:YcmCompleter GoToDefinitionElseDeclaration<CR>

let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
let g:ycm_confirm_extra_conf=0

set completeopt=longest,menu
autocmd InsertLeave * if pumvisible() == 0|pclose|endif
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>"
inoremap <expr> <Down> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <Up> pumvisible() ? "\<C-p>" : "\<Up>"
inoremap <expr> <PageDown> pumvisible() ? "\<PageDown>\<C-p>\<C-n>" : "\<PageDown>"
inoremap <expr> <PageUp> pumvisible() ? "\<PageUp>\<C-p>\<C-n>" : "\<PageUP>"
let g:ycm_key_list_previous_completion=['<Down>']
let g:ycm_key_list_previous_completion=['<Up>']
let g:ycm_collect_identifiers_from_tags_files=1 
let g:ycm_min_num_of_chars_for_completion=2
let g:ycm_seed_identifiers_with_syntax=1
"nnoremap <F5>:YcmForceCompileAndDiagnostics<CR>
inoremap <leader><leader> <C-x><C-o>
let g:ycm_complete_in_comments=1
let g:ycm_complete_in_strings=1
let g:ycm_collect_identifiers_from_comments_and_strings=0

"""""""""""syntastic""""""""""""""""""""
"let g:syntastic_mode_map = {'mode':'active','active_filetypes':[],'passive_filetypes':[]}
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='g++'
let g:syntastic_cpp_compiler_options='-std=c++11 -Wall -stdlib=libc++ -Wextra -Wpendantic' 
"let g:syntastic_error_symbol='✗'
let g:syntastic_error_symbol='>>'
let g:syntastic_warning_symbol='!'
let g:syntastic_enable_balloons=1
let g:syntastic_enable_highlighting=1
let g:syntastic_enable_signs=1
let g:syntastic_python_python_exec='/bin/python2'

""""""""""""""""color"""""""""""""""
"""""""source: /usr/share/vim/vim74/colors
"colorscheme distinguished
"colorscheme jellybeans
colorscheme vividchalk

"colorscheme koehler 
"colorscheme morning
"colorscheme desert
"colorscheme peachpuff
"colorscheme slate

let NERDTreeWinPos = 'left' 

""""""""""""ctags and Taglist""""""""""""""""""
let Tlist_WinWidth=32
let Tlist_Auto_Open=0
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
let Tlist_Use_SingleClick=1
"let Tlist_Use_Right_Window=1
let Tlist_File_Fold_Auto_Close=1
let Tlist_Auto_Update=1

"" make tags file
" cd $project
" ctags -R *

""" single file generate tags, Press F12
set tags=/home/codingeveryday/pra_programming/unix_apue_src/chapter5_standard_io/tags;
set autochdir

function!UpdateTagsFile()
silent!ctags -R --c++-kinds=+p --fields=+ianS --extra=+q
endfunction
nmap <F12> :call UpdateTagsFile()<CR>

"nmap <F5> :WMToggle<CR>
nmap <F6> :Tlist<CR>
nmap <F4> zA
nmap <F3> zR
nmap <F7> :A<CR>
nmap <F8> :NERDTreeToggle<CR>


记录下常用快捷键:

F3 F4 展开缩小
F5 打开winmanager
F6打开taglist
F7使用 a.vim 进行跳转
F8打开 NERDTree
F12 更新tags文件

注意配置里面的 set tags = "tag file path"; 是设置tags文件的,而且单次只能设置一个!

:NREDTreeToggle打开Nerd Tree
:Tlist
打开Taglist
ctrl + w
在不同的活动窗口之间切换(vim NerdTree minibuf quickfix Tlist)

:YcmDebugInfo查看ycm的debug信息
tab进行补全选择



Vundle的使用:

打开一个vim窗口
:source ~/.vimrc
:PluginInstall (BundleInstall 也可以,和配置对应就好) vundle会自动下载.vim插件
:BundleUpdate更新插件
:BundleClean删除插件(需要先把.vimrc中的配置删掉再执行这里)

编译LLVM+Clang的源代码:

(需要检查下系统的clang版本,Valloric的github上说了要求,好像是至少要3.4的clang和llvm)
在http://clang.llvm.org上面Clang 3.3并没有Ubuntu13.04 32bit的预编译的二进制程序,如果是这个版本,需要手动编译下clang llvm:

直接按照官方文档结合后面的来吧,我就是这么做的:

Get the required tools.
See Getting Started with the LLVM System - Requirements.
Note also that Python is needed for running the test suite. Get it at: http://www.python.org/download Checkout LLVM:

Change directory to where you want the llvm directory placed.

svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm

Checkout Clang:
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../..

Checkout extra Clang Tools: (optional)
cd llvm/tools/clang/tools
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
cd ../../../..

Checkout Compiler-RT:
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
cd ../..

Build LLVM and Clang:
mkdir build (for building without polluting the source dir)
cd build
../llvm/configure --enable-optimized  --enable-targets=target-option  
make

This builds both LLVM and Clang for debug mode.
Note: For subsequent Clang development, you can just do make at the clang directory level.
It is also possible to use CMake instead of the makefiles. With CMake it is possible to generate project files for several IDEs: Xcode, Eclipse CDT4, CodeBlocks, Qt-Creator (use the CodeBlocks generator), KDevelop3.
If you intend to use Clang's C++ support, you may need to tell it how to find your C++ standard library headers. In general, Clang will detect the best version of libstdc++ headers available and use them - it will look both for system installations of libstdc++ as well as installations adjacent to Clang itself. If your configuration fits neither of these scenarios, you can use the --with-gcc-toolchain configure option to tell Clang where the gcc containing the desired libstdc++ is installed.
Try it out (assuming you add llvm/Debug+Asserts/bin to your path):
clang --help
clang file.c -fsyntax-only (check for correctness)
clang file.c -S -emit-llvm -o - (print out unoptimized llvm code)
clang file.c -S -emit-llvm -o - -O3
clang file.c -S -O3 -o - (output native machine code)


以上步骤中唯一需要注意的是configure的时候,需要指定--enable-optimized参数。否则默认configure的将是Debug版本,问题多多。最后,我们使用make命令进行编译。这一步主要是为了下面编译YouCompleteMe插件做准备。

生成makefile之后,就开始make了。make可以指定多线程同时工作,例如make -j2,其它的make clean, make dist-clean也可以使用。(j2 j4多核优化并行)

最后一步,就是make install了。默认情况下会安装到/usr/local/下面。

这样,clang应该是安装好了

接下来要做的事情的,安装libc++

这个是为C++11实现的标准库,既然是为了C++11才安装的LLVM,那么这个肯定也是要安装的了。

http://www.cnblogs.com/ralphjzhang/archive/2011/12/02/2272671.html

http://clang.llvm.org/cxx_status.html上面有一句话,Clang可以以两种方式使用C++11,一种是使用libc++,另一种是是使用libstdc++,这个是GCC使用的标准库,但是在libstdc++4.4,4.6,4.7上,需要打补丁,Clang才能使用。既然这样的话,肯定是直接使用libc++了。

在上面提到的临时目录下,仍然是使用svn下载源代码

svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx

然后

cd libcxx/lib
./buildit

那么在lib下面就生成了需要的动态库文件, libc++.so.1.0。到这里,那篇博文里面的都还对,不过建立链接的时候有些问题。

sudo cp ./libc++.so.1.0 /usr/lib
cd /usr/lib
sudo ln -sf /usr/lib/libc++.so.1.0 libc++.so
sudo ln -sf /usr/lib/libc++.so.1.0 libc++.so.1


区别在于,ln -sf 源文件 目标链接,而且使用的是绝对路径,这样,在/usr/lib/下面会有三个文件。

为什么要有这三个文件呢?在编译链接的时候,-lc++或者stdlib=libc++,都会去链接libc++.so这个,而在运行的时候,会需要libc++.so.1这个。不知道为什么会这样,但是如果不是这样的话,编译和运行的时候就会出错。借用博文里面的例子,测试通过。

(1)编译YouCompleteMe

YCM是需要我们编译的,vallorc的github中有详细说明,官方的full
installation使用的是预编译的clang包,按照他的执行了几次,修复了中间几个错误后,最后在vim下提示 YCM server shut down,然后用:YcmDebugInfo查找err和out的log文件,发现是libclang.so文件的问题,没办法,硬着头皮搞。

cd ~
mkdir ycm_build
cd ycm_build/


添加c/c++补全支持,生成makefile文件:
按照官方文档如下:(只需要指定llvm的根目录就好,它包含了llvm的根路径)

Ubuntu:

cmake -G "Unix Makefiles" .  -DPATH_TO_LLVM_ROOT=~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/llvm ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp</span>


CentOS:

cmake -G "Unix Makefiles" . -DPATH_TO_LLVM_ROOT=~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/llvm  -EXTERNAL_LIBCLANG_PATH=/usr/local/lib/libclang.so  ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp


我实际操作的时候碰到了问题:

最后make之后,vim下总是提示需要重启ycm服务器,YcmRestartServer,重启也不行,报错shut down,找了下:YcmDebugInfo下面的err日志,发现提示libclang.so的版本至少需要2.6以上什么的,google了一下,看来是需要指定下libclang.so的路径才行了,尝试了下:
这里要注意的是-DEXTERNAL_LIBCLANG_PATH这个参数,用于指定libclang.so的位置。如果不指定的话,YCM将无法正常工作,而这个libclang.so就是我们在编译Clang的时候生成的,或者你可以使用系统的libclang.so,检查下版本就可以了。

具体配置的时候,你需要把自己的llvm路径和libclang.so的路径找到,然后替换我的配置~!

可以用这里的方式进行cmake :

cmake -G "Unix Makefiles" .  -DPATH_TO_LLVM_ROOT=~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/llvm  -DEXTERNAL_LIBCLANG_PATH=/usr/lib/llvm-3.4/lib/libclang.so   ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp


如果这里提示could not find pythonlibs:

查找下/usr/lib下面的libpython*文件:

<strong>find /usr/lib -name 'libpython*'</strong>


缺少一些必要的.so的话,可以尝试重新下载下pythonlibs环境:

<strong>Ubuntu:sudo apt-get install python-dev python3-dev
CentOS:sudo yum search python-libs / python-dev
我找到了几个:
sudo yum install python-libs.x86_64
sudo yum install python-devel.x86_64</strong>


安装好了之后,相信cmake就能成功了,继续:

这里一定要注意下:

llvm(3.3) 和 libclang.so 的路径一定要替换成自己的,并且最好是自己编译过的符合版本要求的最好!使用系统默认的可能会出各种问题!
用find去 /usr ~/ 里面找,然后确认下就在这里替换掉!

查找文件可以用find指令,比如: find ~/.vim/ -name 'libclang.so' | find ~/.vim/ -name 'libclang*'

OK,现在我们可以来make了,如果你使用官方的make方法,成功了就不用看下面的了

我配置的时候遇到了下面的问题,直接执行 make ycm_support_libs 之后屡屡失败或者使用不了
google了一下,发现有人给了个比较好的方法:

make ycm_core这样将在~/.vim/bundle/YouCompleteMe/third_party/ycmd/目录下自动生成文件(ycm_core.so)

make ycm_support_libs

这条命令才会生成第三个文件ycm_client_support.so。因为,YouCompleteMe是C/S架构的,所以存在服务器和服务端的说 法。另外,在/tmp/ycm_temp/目录下还可以看到服务和请求日志,更加可以验证这一点。

最后,还可以去配置下: ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/下的 .ycm_extra_conf.py文件,在最后添加上c c++ 的语义支持

<strong> '-isystem',
  '/usr/include',
  '-isystem',
  '/usr/include/c++',
  '-isystem',
  '/usr/include/x86_64-linux-gnu/c++' </strong>


至此,配置尚未结束。

.ycm_extra_conf.py文件可以是针对工程而言,也可以设置全局的。对工程而言,放在工程的根目录即可。不过每次打开文件都会询问是否加载,这时可以在~/.vimrc中设置:let
g:ycm_confirm_extra_conf=0
来关闭提示。如果是针对全局的,那么可以在 ~/.vimrc 添加:

<span style="font-size:18px;color:#ff0000;">let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'</span>


(2)Syntastic和Vundle

安装很简单,主要在于配置,所以就不花时间讲解安装,看看配置就可以了。而重点和难点在于YouCompleteMe和Clang的编译工作,这两个编译步骤都比较复杂,编译耗时较长。

三:其他

语义语法补齐:



文件也能补齐:



最后看看ycm和syntastic的错误提示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: