号称最难装的ycm,试了几天,终于搞定,其实没有传说中的那么复杂,只是资料比较少是真的,而且大多也比较老,毕竟之前ycm用的rls+racer来完成代码补全,现在改成了rust-analyzer。现在把中间需要注意的地方做个记录:
1. debian自带vim版本够用,需要装vim-nox依赖以支持python3,不需要从源代码编译vim,也不建议debian系源代码编译,自带的稳定性还是相对不错的。其它依赖按官方要求装就行。
2. debian自带vim-youcompleteme包,需要配合vim-addons-manager,用vam install youcompleteme来安装,装好就可以直接支持cfamily,要想支持rust,还需要其它设置修改rust_completer.py,由于没学过python,没折腾明白,没折腾出来。(在后来折腾成功之后按原理应该也能成功,只是没再花时间。)
3. youcomplete包官网要求用vundle安装,这里我没用,之前第一次装vim插件rust.vim时,完全不懂,才装了个vim-plug,现在明白vim8以上不需要装插件管理器,只需要在.vim目录下建一个pack文件夹,vim启动时会自动扫描这个文件夹下的插件并加载,具体可以参考vim官方说明。我这里就直接和rust.vim放在了一个文件夹下,按rust.vim官方要求的文件夹组织。
4. 用git clone,不能下载zip压缩包。在用git clone之前,最好在github.com后面加上cnpmjs.org,这是个镜像站,下载速度很快,免梯子。
5. clone下来以后别急着安装,先打开YouCompleteMe文件夹下的.gitmodules,把里面url里面的github.com按上面的方式改成镜像站,其它不变。后面还有子模块,嫌clone的慢的话可以中止,按上面的步骤改了再继续按下面的步骤进行。只有https://bitbucket.org/mrabarnett/mrab-regex.git这个子模块镜像站没有,可以在gitee网站找到clone链接改过来即可。
6. 运行:git submodule sync 更新子模块的url。
7. 运行:git submodule update --init --recursive
8. 上面的步骤都顺利完成以后,就可以进行安装了。按官方的方式加--rust-completer其实也是可以的,只是慢了些,还要装1.49版的nightly,个人不喜欢。不加--rust-completer参数装即可。
9. 如果没有加--rust-completer,或者带参数运行出意外了,可按下面的步骤完成:在目录YouCompleteMe/third_party/ycmd/third_party下新建文件夹:rust-analyzer,把toolchains/nightly-x86_64-unknown-linux-gnu文件夹(默认在$HOME/.rustup/)下的所有内容(bin,lib等)copy到rust-analyzer下。最后把rust-analyzer复制到rust-analyzer文件夹下(没装的话先安装,只有stable版本才有,nightly版本里是没有的,装完默认在$HOME/.local/bin目录下)。
10. 把目录YouCompleteMe/third_party/ycmd下的文件.ycm_extra_conf.py复制到.vim目录下改名ycm_extra_conf.py在.vimrc里加一行:let g:ycm_global_ycm_extra_conf='~/.vim/ycm_extra_conf.py'。
11. 在.vimrc里加(这部分工作做的比较早,但是没下面这几行,上面的工作全做了也不行。按说加了下面的几行,就不用复制rust-analyzer目录下的东西了,没再试):
let g:ycm_language_server =
\ [
\ {
\ 'name': 'rust',
\ 'cmdline': [ 'rust_analyzer' ],
\ 'filetypes': [ 'rust' ],
\ 'project_root_files': [ 'Cargo.toml' ]
\ }
\ ]
12. 打开ycm_extra_conf.py文件,用文件编辑器修改几个地方:flag=后面的c++用rust替换。`return extension in [ '.h', '.hxx', '.hpp', '.hh' ]`方括号里改成'.rs',`language = kwargs[ 'language' ]`下面加几行:
if language == 'rust':
return {
'ls': {
'rust':{
'all_features':True,
}
}
}
最好if和上面的language对齐。
其它的配置可以网上搜,主要需要注意的地方就在上面了。如果用debian源的vim-youcompleteme,配置最好不要用网上搜到的,有些配置被debian改了,最好参考说明文档,在vim里:help youcompleteme 即可打开。
到目前为止,ycm应该可以正常工作了,测试时需要特别注意:必须用cargo创建的项目里,ycm才能正常工作,单独一个rs文件是无法工作的。我是参考了https://github.com/ycm-core/YouCompleteMe/issues/3478,装了rls,analysis,rust-src这些不必要的东西之后,看到下面,才发现,原来单文件里原本就不工作的。。。
补充两个问题:关于依赖代码补全问题和最新测试可以不用复制文件直接调用系统装好的rust-analyzer方法。
- 依赖补全我用的方法是在项目的根目录下建立一个文件".ycm_extra_conf.py",里面只需要加入以下几行:
def PythonSysPath( **kwargs ):
sys_path = kwargs[ 'sys_path' ]
sys_path.insert( 1, '/path/to/your/src' )
return sys_path
这个文件会在vim打开项目文件时自动识别并询问是否加载,vim下方会弹出提示,按"o"即可加载。这样,就可以补全依赖的代码了。
2. 不必创建rust_analyzer文件夹,也不必复制那些文件过去,只需要修改YouCompleteMe/third_party/ycmd/ycmd/completers/rust目录下的rust_completer.py,即可实现调用系统里装好的rust-analyzer:
RUST_ROOT = os.path.join( os.getenv( 'HOME' ), '.cargo' )
RA_EXECUTABLE = utils.FindExecutable( os.path.join(
os.getenv( 'HOME' ), '.local', 'bin', 'rust-analyzer' ) )
以上代码替换掉文件里相应的行就可以了。这里的代码是debian系统里安装rust的默认位置,如果有自定义位置,按这个方式改就可以了。这样就可以完全不带参数快速编译并正常使用了。
debian自带的vim-youcompleteme应该也可以用这种方式进行配置。
评论区
写评论网络通畅什么都好办,网络不好怎么都搞不定。 YCM 的那几个 py 常见依赖非要从 github 下载,曾经弄了一晚上,把云服务器走代理学了一遍,同时顺便试了 coc-rust-analyzer,就懒得去弄 YCM 了。