谈几个 LSP 补全的小问题,不确认 ncm2 解决了没有。
* 支持 language server 返回的 trigger charactors 触发补全
* 支持 LSP 中定义的 completion resolve,切换补全项时请求详情,不支持的话某些 language server 看不到文档也支持不了 snippet 等功能。
* 支持 language server 返回的 snippet,LanguageClient-neovim 这插件根本不支持 lsp 定义的 snippet
https://microsoft.github.io/language-server-protocol/specification#snippet-syntax,server 返回的 snippet 会被它截一段关键字插入。
ncm 的代码:
au InsertEnter,InsertCharPre,TextChangedI <buffer> call ncm2#auto_trigger()
func! ncm2#_do_auto_trigger()
let tick = s:context_tick()
if tick == s:auto_trigger_tick
return ''
endif
let s:auto_trigger_tick = tick
" refresh the popup menu to reduce popup flickering
call s:feedkeys("\<Plug>(ncm2_complete_popup)")
if g:ncm2#complete_delay == 0
call s:feedkeys("\<Plug>(_ncm2_auto_trigger)")
else
if s:complete_timer
call timer_stop(s:complete_timer)
endif
let s:complete_timer = timer_start(
\ g:ncm2#complete_delay,
\ {_ -> s:complete_timer_handler() })
endif
return ''
endfunc
用户在 fuzzy 补全时也会触发 TextChangedI, 此时 ncm2 会发起新的请求,其实这种请求完全可以避免,因为补全插件在第一次请求后就获取了所有的补全项,除非用户输入的是 trigger charactor,否者只需要过滤第一次获取的结果即可。另外这个 g:ncm2#complete_delay 设的小了可能 language server 还没收到当前的 buffer,导致无法正确补全,设置的大了影响补全的体验。