写在前面
都累死了,写个屁前言。。。
如果您只关心可复现、成功的靠谱解决方案,请跳转方案: 4. Vim + YCM + rust-analyzer
前提条件:您已经通过 rustup 安装了 nightly 版本的 toolchain
1 2 |
rustup install nightly rustup default nightly |
方案搭配
1. Vim + vim-racer + racer (不推荐
1)安装 vim-racer 插件
请使用您喜欢的任何 Vim 插件管理工具(Vundle、NeoBundle、vim-plug、Pathogen)进行安装;
2)通过 cargo 安装 racer
1 |
cargo install racer |
3)配置 .vimrc
(默认快捷键:先按 Ctrl-x 然后按 Ctrl-o)
1 2 3 4 |
" ============= vim-racer ============ let g:racer_experimental_completer = 1 let g:racer_insert_paren = 1 " ==================================== |
存在的问题:
- 代码补全基本能用,但是似乎不能像 YCM 那样自动触发补全,以及一些函数跳转功能依赖 rust.vim;
- autoload/racer.vim: system(cmd),每次补全都会执行一次 racer 命令,存在优化的空间,比如使用 racer daemon;
2. Vim + YCM + racerd (deprecated)
racerd 实际上是 racer 功能的封装,并通过 HTTP API 为 YCM 提供服务,基本已经停止维护;
YCM 起初对 Rust 的支持是通过 racerd 实现的,但是在2019年6月已经正式换用 RLS 作为后端;而当前 debian 源里的 ycmd 还是2018年的版本,因此不支持 RLS,仅支持 racerd (显然,debian 打包的 ycm 早晚会更新 :-)
参见:
Migrate Rust completer to Rust Language Server #1105
[READY] Migrate Rust completer to Rust Language Server #1224
1) 使用 APT 安装 ycmd 并安装 vim 插件
1 2 |
sudo apt install vim-youcompleteme vim-addon-manager vam install youcompleteme |
2)安装 rust-src 以及 racerd
1 2 |
rustup component add rust-src cargo install --git https://github.com/kings-way/racerd |
2)配置 .vimrc
1 2 |
" Path: <code>rustc --print sysroot</code>/lib/rustlib/src/rust/src let g:ycm_rust_src_path = '/path/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src' |
存在的问题:
- YCM 应该直接调用 racer 二进制,而不是通过 TCP 和 racerd 通讯;
- YCM 每次 TCP 通讯都是完整的三次握手,可以使用 TCP 长链接;
- YCM 每次都会发送 vim 所有标签页的代码全文,对于 racer/racerd 是没有意义的;
3. Vim + YCM + RLS (deprecated)
Update@2021-05-28: 该来的还是来了,实际上 YCM 于2020年7~9月份即弃用了 RLS,转而使用 rust-analyzer
1)安装一些依赖以及工具
1 2 |
sudo apt install build-essential cmake python3-dev libclang1 rustup component add rls, rust-src |
2)安装 ycm-core/YouCompleteMe 插件,请使用您喜欢的任何 Vim 插件管理工具安装
3)进入插件目录编译 ycmd
1 2 3 4 |
cd ~/.vim/bundle/YouCompleteMe git submodule update --init --recursive ./install.py --clang-completer --system-libclang ## 这两个参数主要是为了方便C语言的补全 # 请注意不需要 --rust-completer,因为该参数会使得 install.py/build.py 自动下载特定版本的rustup toolchain,然后编译生成 RLS 组件,费时费力 |
4)配置 .vimrc,自定义 toolchain 目录
1 2 3 |
let g:ycm_rust_src_path = '/path/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src' let g:ycm_rls_binary_path = '/path/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin' let g:ycm_rustc_binary_path = '/path/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin' |
4.1 Vim + YCM + rust-analyzer(debian 10)
Update@2021-05-28: 该方案于近期新添加,此时的 YCM 对于 cmake、vim 版本均有较新的要求,debian10 甚至无法满足,hack 如下
- 手动修改 YCM 项目内的各个 CMakeLists.txt 绕过 cmake 版本检查, debian10 构建成功;
- 构建(install.py)完成后,在 ycm 插件目录
切换至历史分支,这样可兼容 Vim < 8.1.2269;git checkout legacy-vim
(如果在构建之前就切换至 legacy-vim 分支,此时的 Rust 支持还是 RLS,这就是开倒车了,唉,心累 :(
1)安装一些依赖以及工具
1 2 |
sudo apt install build-essential cmake python3-dev libclang1 rustup +nightly component add rust-src rust-analyzer-preview |
2)安装 ycm-core/YouCompleteMe 插件,请使用您喜欢的任何 Vim 插件管理工具安装
3)进入插件目录构建 ycmd
1 2 3 4 |
cd ~/.vim/bundle/YouCompleteMe git submodule update --init --recursive ./install.py --clang-completer --system-libclang ## 这两个参数主要是为了方便C语言的补全 # 请注意不需要 --rust-completer,因为该参数会使得 install.py/build.py 自动下载特定版本的 rustup toolchain |
4) 配置 .vimrc
1 2 |
let g:ycm_rust_toolchain_root = '/path/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu' let g:ycm_rust_src_path = '/path/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src' |
4.2 Vim + YCM + rust-analyzer(debian 12)
Update@2023-09-06: 在 debian 12 系统中,默认的 vim、ycmd、vim-youcompleteme 等软件包可开箱即用,使用 vam 配置 vim-youcompleteme 插件即可,无需手动源码安装。
1)安装一些依赖以及工具
1 |
rustup +nightly component add rust-src rust-analyzer |
2)安装 ycm-core/YouCompleteMe 插件,这里使用 debian apt 源中的版本
1 2 |
sudo apt install vim-youcompleteme vim-addon-manager vim-scripts vam install youcompleteme |
3) 配置 .vimrc
1 2 |
let g:ycm_rust_toolchain_root = '/path/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu' let g:ycm_rust_src_path = '/path/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src' |
5. Vim + LanguageClient-neovim + RLS
未测试该方案是否可行,略
参考:autozimu/LanguageClient-neovim
6. 其他:
最后贴一下YCM相关的 vimrc 配置, 主要是 C、Python、Rust 支持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
" ============ YouCompleteMe ============ " if we install vim-youcompleteme from APT " sudo apt install vim-youcompleteme " vam install vim-youcompleteme " cp /usr/lib/ycmd/ycm_extra_conf.py ~/.vim/ """" # Add C/C++ headers dirs with -isystem or -I for each dir """" <code>gcc -print-prog-name=cc1</code> -v # get C header search path """" <code>gcc -print-prog-name=cc1plus</code> -v # get C++ header search path " ============= YCM For Rust ============ " rustup install nightly; rustup default nightly; " rustup component add rust-src rustfmt rust-analysis rust-analyzer-preview; let g:ycm_semantic_triggers={'c,cpp,python,rust,java,go,erlang,perl,cs,lua,javascript':['re!\w{2}']} " Automatically invoke the syntax completion when 2 letters typed set completeopt=menu,menuone " disable the function definition preview window let g:ycm_complete_in_comments=1 let g:ycm_seed_identifiers_with_syntax=1 let g:ycm_collect_identifiers_from_tags_files=1 let g:ycm_goto_buffer_command='horizontal-split' " horizontal split the window when 'goto' another location let g:ycm_add_preview_to_completeopt=0 " (need to work with above let g:ycm_key_invoke_completion='<C-x>' " Set the key binding which invoke syntax completion let g:ycm_global_ycm_extra_conf='~/.vim/ycm_extra_conf.py' let g:ycm_rust_toolchain_root = '/path/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu' let g:ycm_rust_src_path = '/path/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src' map <F5> :YcmCompleter GoToDefinitionElseDeclaration<CR> " ========================================= |