[Vim] 使用 YouCompleteMe 对 Rust/Golang 代码补全

Posted by RoninRo on Fri, Jan 22, 2021

YouCompleteMe 是 Vim 下的自动补全插件。自从 Vim8YouCompleteMe 支持异步 IO 后,在 Vim 下的使用体验也是直线上升。

使用 YouCompleteMe 有几个先决条件,不然可能会不能正常使用:

  1. Ycm 依赖于 Python3, 所以需要安装支持 Python3 的 Vim.
  2. 最好在 Vim 8+ 版本上使用
  3. 编译需要 cmake

在 macOS 上安装使用

使用 Homebrew 安装 cmake, python3, macvim

1cd ~/.vim/bundle/YouCompleteMe
2python3 install.py

当添加如 --rust-completer--go-completer 支持时,Ycm 会将相关工具下载编译到独立空间中去,如果想要使用系统的相关语法补全工具,则可以通过相关参数单独配置。

Golang

1let g:ycm_gopls_binary_path = "gopls"
2let g:ycm_gopls_args = ['-remote=auto']

Rust

1let g:ycm_rust_toolchain_root = $HOME.'/.rustup/toolchains/stable-x86_64-apple-darwin'

说明:对于 Rust,要将 rust-analyzer 安装到 toolchain 目录中去。

ycm 需要在 g:ycm_rust_toolchain_root/bin 目录下找到 rust-analyzer

Ycm 相关配置

 1set completeopt=menu,menuone
 2if has('patch-8.0.1000')
 3	set completeopt+=noselect
 4endif
 5
 6if exists('+completepopup')
 7	set completepopup=align:menu,border:on,highlight:QuickPreview
 8	set completeopt+=popup
 9endif
10
11" Plugin: YouCompleteMe & Snippets {{{2
12let g:ycm_global_ycm_extra_conf='~/.ycm_extra_conf.py'
13let g:ycm_confirm_extra_conf=0
14let g:ycm_use_clangd = 0
15let g:ycm_add_preview_to_completeopt=0
16let g:ycm_max_num_candidates=50
17let g:ycm_gopls_binary_path = "gopls"
18let g:ycm_gopls_args = ['-remote=auto']
19let g:ycm_rust_toolchain_root = $HOME.'/.rustup/toolchains/stable-x86_64-apple-darwin'
20let g:UltiSnipsExpandTrigger="<C-j>"
21let g:UltiSnipsJumpForwardTrigger="<c-b>"
22let g:UltiSnipsJumpBackwardTrigger="<c-z>"
23let g:ycm_key_invoke_completion = '<C-Space>'
24let g:ycm_key_list_stop_completion = ['<C-y>']
25let g:UltiSnipsSnippetDirectories=["UltiSnips", $HOME.'/.vim/MySnippets']
26let g:ycm_show_diagnostics_ui = 1
27
28nnoremap <silent>gd :YcmCompleter GoToDeclaration<CR>
29nnoremap <silent>gr :YcmCompleter GoToReferences<CR>
30nnoremap <silent>gi :YcmCompleter GoToImplementation<CR>
31
32nmap <leader>D <plug>(YCMHover)

效果图

How to use YCM with wasm

在项目根目录下创建 .ycm_extra_conf.py 文件。添加下面的配置:

1def Settings(**kwargs):
2    return {
3        'ls': {
4            'env': {
5                'GOOS': 'js',
6                'GOARCH': 'wasm',
7            },
8        }
9    }