写在前面
都累死了,写个屁前言。。。
如果您只关心可复现、成功的靠谱解决方案,请跳转方案: 3. Vim + YCM + RLS
前提条件:您已经通过 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
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 3 4 5 6 7 8 |
" ========== YCM For Rust ========== " rustup component add rust-src ( Dir: <code>rustc --print sysroot</code>/lib/rustlib/src/rust/src) " cargo install --git https://github.com/kings-way/racerd " Automatically invoke the syntax completion when 2 letters typed let g:ycm_semantic_triggers={'c,cpp,python,rust,java,go,erlang,perl,cs,lua,javascript':['re!\w{2}']} let g:ycm_rust_src_path = '/home/king/.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
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
(同上文 YCM + racerd 的配置,略)
5)修改 ycmd/rust-completer, 使其支持用户自己安装的 RLS
1 2 3 |
cd ~/.vim/bundle/YouCompleteMe sed -i "s/^RUSTC_EXECUTABLE.*/RUSTC_EXECUTABLE = utils.PathToFirstExistingExecutable([os.path.join(RLS_BIN_DIR, 'rustc'), 'rustc'])/g" ./third_party/ycmd/ycmd/completers/rust/rust_completer.py sed -i "s/^RLS_EXECUTABLE.*/RLS_EXECUTABLE = utils.PathToFirstExistingExecutable([os.path.join(RLS_BIN_DIR, 'rls'), 'rls'])/g" ./third_party/ycmd/ycmd/completers/rust/rust_completer.py |
4. Vim + LanguageClient-neovim + RLS
未测试该方案是否可行,略
参考:autozimu/LanguageClient-neovim
5. 其他:
最后贴一下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/remove 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; (Source Dir: <code>rustc --print sysroot</code>/lib/rustlib/src/rust/src) " cargo install --git https://github.com/kings-way/racerd 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_global_ycm_extra_conf='~/.vim/ycm_extra_conf.py' set completeopt=menu,menuone " disable the function definition preview window 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_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, let g:ycm_rust_src_path = '/home/king/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src' map <F5> :YcmCompleter GoToDefinitionElseDeclaration<CR> " ========================================= |