使用Vim编写程序少不了使用自动补全插件,在Linux下有没有类似VS中的Visual Assist X这么方便快捷的补全插件呢?以前用的是neocomplcache+code_complete+omnicppcomplete,但效果还是不是很好。看到有YCM后前面的插件可以说拜拜了。YouCompleteMe:一个随键而全的、支持模糊搜索的、高速补全的插件。YCM 由 google 公司搜索项目组的软件工程师 Strahinja Val Markovic 所开发,YCM 后端调用 libclang(以获取AST,当然还有其他语言的语义分析库)、前端由 C++ 开发(以提升补全效 率)、外层由 python 封装(以成为 vim 插件),它可能是我见过安装最复杂的 vim 插件了。
推荐阅读:Vim学习指南 http://www.linuxidc.com/Linux/2013-08/89096.htm快速学会 Vi编辑器 http://www.linuxidc.com/Linux/2013-08/88586.htm强大的Vim 编辑器 http://www.linuxidc.com/Linux/2013-07/87544.htm在CentOS 6.2上搭建Vim开发环境 http://www.linuxidc.com/Linux/2013-07/87363.htmVim 7.4a 发布,全新更快的正则表达式引擎 http://www.linuxidc.com/Linux/2013-07/87035.htmCentOS 5.4 安装高亮Vim编辑工具 http://www.linuxidc.com/Linux/2013-06/86508.htmVim技巧分享:C语言设置 http://www.linuxidc.com/Linux/2012-12/77124.htmUbuntu中设置Vim的行号 http://www.linuxidc.com/Linux/2012-12/75485.htmVim编辑器使用基础教程 http://www.linuxidc.com/Linux/2013-05/84031.htm先看个补全效果图还可以进行路径自动补全YouCompleteMe要求Vim版本7.3.584+,前面已经介绍了编译安装Vim7.4方法。 同时YouCompleteMe要求clang版本为3.3以上。如果想获取最新的clang可以使用SVN,按照其官网上介绍的方法编译安装。我们这里介绍源码编译安装clang3.3。目录
- Vim自动补全插件----YouCompleteMe安装与配置
- 编译安装IIvm-clang3.3
- 安装clang标准库
- 安装配置YouCompleteMe
编译安装llvm-clang3.3
先下载如下4个源码: llvm-3.3源码 clang-3.3源码 clang-tools-extra-3.3源码 compiler-rt-3.3源码 建立目录:
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /2014年资料/4月/8日/Vim自动补全插件----YouCompleteMe安装与配置下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm
mkdir ~/llvm-clang分别解压上面下载的4个文件到上述目录
tar -xvzf llvm-3.3.src.tar.gztar -xvzf compiler-rt-3.3.src.tar.gztar -xvzf clang-tools-extra-3.3.src.tar.gztar -xvzf cfe-3.3.src.tar.gz再将工具移动到llvm的相应目录下,使得clang,clang-tools-extra和compiler-rt就可以和llvm一起编译了:
mv cfe-3.3.src/ llvm-3.3.src/tools/clang/mv clang-tools-extra-3.3.src/ llvm-3.3.src/tools/clang/extra/mv compiler-rt-3.3.src/ llvm-3.3.src/projects/compiler-rt/下载最新的LLVM、clang 及辅助库源码可用:cd ~/llvm-clangsvn co http://llvm.org/svn/llvm-project/llvm/trunk llvmcd llvm/toolssvn co http://llvm.org/svn/llvm-project/cfe/trunk clangcd ../..cd llvm/tools/clang/toolssvn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extracd ../../../..cd llvm/projectssvn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rtcd ..返回~/llvm-clang目录,并新建一个目录llvm-build专门用于编译llvm-clang,使得不污染源码。
mkdir llvm-buildcd llvm-build/../llvm-3.3.src/configure --enable-optimized建立编译环境此种配置后,llv-clang默认安装到目录 /usr/local/ 下, 如果想改变安装目录,则加上配置: --prefix=Path 来制定 输入
make -j4(本人机器为双核)开始编译
sudo make install进行安装如要卸载则在该目录下输入
sudo make uninstall安装好后,输入
clang -v查看版本信息:
安装clang标准库
clang 的标准库————libc++(接口层)和 libc++abi(实现层)需要安装头文件和动态链接库(*.so)。
- 安装libc++cd ~/llvm-clangsvn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxxcd libcxx/lib./buildit
头文件已经生成到
~/llvm-clang/libcxx/include/,要让 clang 找到必须复制到
/usr/include/c++/v1/cp -r ~/llvm-clang/libcxx/include/ /usr/include/c++/v1/*.so 文件已生成 ~/llvm-clang/libcxx/lib/libc++.so.1.0,要让 clang 访问必须复 制到 /usr/lib/,并创建软链接ln -s ~/llvm-clang/libcxx/lib/libc++.so.1.0 ~/llvm-clang/libcxx/lib/libc++.so.1ln -s ~/llvm-clang/libcxx/lib/libc++.so.1.0 ~/llvm-clang/libcxx/lib/libc++.socp ~/dllvm-clang/libcxx/lib/libc++.so* /usr/lib/
类似,源码安装 libc++abi 的头文件和动态链接库:
cd~/llvm-clang/svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabicd libcxxabi/lib./buildit头文件已经生成到
~/llvm-clang/libcxxabi/include/,要让 clang 找到必须复制到
/usr/include/c++/v1/cp -r ~/llvm-clang/libcxxabi/include/ /usr/include/c++/v1/*.so 文件已生成
~/llvm-clang/libcxx/lib/libc++abi.so.1.0,要让 clang 访问必 须复制到
/usr/lib/,并创建软链接
ln -s ~/llvm-clang/libcxxabi/lib/libc++abi.so.1.0 ~/llvm-clang/libcxxabi/lib/libc++abi.so.1ln -s ~/llvm-clang/libcxxabi/lib/libc++abi.so.1.0 ~/llvm-clang/libcxxabi/lib/libc++abi.socp ~/llvm-clang/libcxxabi/lib/libc++abi.so* /usr/lib/后续可以通过如下选项进行代码编译:
clang++ -std=c++11 -stdlib=libc++ -Werror -Weverything -Wno-disabled-macro- expansion -Wno-float-equal -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno- global-constructors -Wno-exit-time-destructors -Wno-missing-prototypes -Wno-padded -lc++ -lc++abi main.cpp参数说明:
- -std=c++11: 使用 C++11 新特性;
- -stdlib=libc++: 指定使用 clang 的标准库头文件 /usr/include/c++/v1/;
- -Werror: 将所有编译警告视为编译错误;
- -Weverything: 打开所有编译警告选项。在 GCC 中,无法通过单个选项打开所有 编译警告,必须繁琐的同时指定 -Wall、-Wextra、以及大量分散的其他选项,为此clang 新增了 -Weverything。当然,有些警告意义不大,完全可忽略,如下;
- -Wno-disabled-macro-expansion:禁止使用宏表达式,忽略此警告;
- -Wno-float-equal:浮点类型不应使用 != 和 == 运算符,忽略此警告;
- -Wno-c++98-compat、-Wno-c++98-compat-pedantic:采用 C++11 新特性的代 码无法兼容 C++98,忽略此警告;
- -Wno-global-constructors:在 main() 之前存在执行的代码,忽略此警告;
- -Wno-exit-time-destructors:在 main() 之后存在执行的代码,忽略此警告;
- -Wno-missing-prototypes:虽有函数定义但缺失函数原型,忽略此警告;
- -Wno-padded:结构体大小应为 4 字节整数倍,忽略此警告(编译器自动调整对齐 边界);
- -lc++:指定链接 /usr/lib/libc++.so 标准库;
- -lc++abi:指定链接 /usr/lib/libc++abi.so 标准库。注意:这两个选项非常重 要,缺失将导致链接失败!
这些参数在YouCompleteMe的配置文件.ycm_extra_conf.py的flags中设置
安装配置YouCompleteMe
- 下载源码。使用vundle搞定,在vimrc文件中加入
Bundle "Valloric/YouCompleteMe" - 执行命令:$ cd ~$ mkdir ~/ycm_build$ cd ~/ycm_build$ cmake -G "Unix Makefiles" -DUSE_SYSTEM_LIBclang=ON -DEXTERNAL_LIBCLANG_PATH=CLANG_INSTALL_PATH/libclang.so . ~/.vim/bundle/YouCompleteMe/cpp
- 在YouCompleteMe中生成libclang.so和ycm_core.so文件
执行 make ycm_core,这样将在~/.vim/bundle/YouCompleteMe/python/目录下自动生成两个文件(libclang.so和ycm_core.so) - 这还是不够的,还必须执行命令:
make ycm_support_libs。 这条命令才会生成第三个文件ycm_client_support.so。因为,YouCompleteMe是C/S架构的,所以存在服务器和服务端的说法。 - 最后设置
.ycm_extra_conf.py文件。 - 在.vimrc中添加配置:" 自动补全配置set completeopt=longest,menu"让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)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>""youcompleteme默认tabs-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>"]let g:ycm_confirm_extra_conf=0 "关闭加载.ycm_extra_conf.py提示let g:ycm_collect_identifiers_from_tags_files=1" 开启 YCM 基于标签引擎let g:ycm_min_num_of_chars_for_completion=2" 从第2个键入字符就开始罗列匹配项let g:ycm_cache_omnifunc=0" 禁止缓存匹配项,每次都重新生成匹配项let g:ycm_seed_identifiers_with_syntax=1" 语法关键字补全nnoremap <F5> :YcmForceCompileAndDiagnostics<CR>"force recomile with syntastic"nnoremap <leader>lo :lopen<CR>"open locationlist"nnoremap <leader>lc :lclose<CR>"close locationlistinoremap <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 = 0nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳转到定义处
Linux查看硬件信息(北桥芯片组、南桥、PCI接口、CPU等)设置Ubuntu的FQDN相关资讯 Vim
- 交叉编译Vim并移植到ARM嵌入式 (今 21:40)
- 把Vim打造成优秀的C++ IDE (06月13日)
- Linux Vi/Vim 的使用及实例 (06月04日)
| - Vim 和 Emacs 到底哪个更适合你? (07月25日)
- 简明 Vim 练级攻略 (06月05日)
- Vim 8.0 即将发布 (04月14日)
|
本文评论 查看全部评论 (0)