目录

YouCompleteMe 实现 Vim 下 Rust/Golang 代码补全

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

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

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

在 macOS 上安装使用

使用 Homebrew 安装 cmake, python3, macvim

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

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

Golang

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

Rust

1
let 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 相关配置

 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
28
29
30
31
32
set completeopt=menu,menuone
if has('patch-8.0.1000')
	set completeopt+=noselect
endif

if exists('+completepopup')
	set completepopup=align:menu,border:on,highlight:QuickPreview
	set completeopt+=popup
endif

" Plugin: YouCompleteMe & Snippets {{{2
let g:ycm_global_ycm_extra_conf='~/.ycm_extra_conf.py'
let g:ycm_confirm_extra_conf=0
let g:ycm_use_clangd = 0
let g:ycm_add_preview_to_completeopt=0
let g:ycm_max_num_candidates=50
let g:ycm_gopls_binary_path = "gopls"
let g:ycm_gopls_args = ['-remote=auto']
let g:ycm_rust_toolchain_root = $HOME.'/.rustup/toolchains/stable-x86_64-apple-darwin'
let g:UltiSnipsExpandTrigger="<C-j>"
let g:UltiSnipsJumpForwardTrigger="<c-b>"
let g:UltiSnipsJumpBackwardTrigger="<c-z>"
let g:ycm_key_invoke_completion = '<C-Space>'
let g:ycm_key_list_stop_completion = ['<C-y>']
let g:UltiSnipsSnippetDirectories=["UltiSnips", $HOME.'/.vim/MySnippets']
let g:ycm_show_diagnostics_ui = 1

nnoremap <silent>gd :YcmCompleter GoToDeclaration<CR>
nnoremap <silent>gr :YcmCompleter GoToReferences<CR>
nnoremap <silent>gi :YcmCompleter GoToImplementation<CR>

nmap <leader>D <plug>(YCMHover)

效果图

https://cdn.jsdelivr.net/gh/roninro/blog@main/img/ycm-screenshot.jpg