ncm2 - 更加专注 & 可拓展的 vim/neovim 代码补全框架

2018-08-01 16:36:07 +08:00
 pony279

ncm2/ncm2 的前身是 roxma/nvim-completion-manager (ncm)

为了更加可拓展,更加专注于代码补全,清理历史遗留代码,我重写了 ncm。部分变化列 举如下:

以上主要是实现上的变化,作为插件使用者应该感受不太清晰,以下列举一些更容易看得 见的变化:

相关资源可以在 READMEwiki 页面 查找

Gif demo:

9382 次点击
所在节点    Vim
37 条回复
BBCCBB
2018-08-01 16:48:47 +08:00
支持! 看楼主是一个 self-driver developer?
pony279
2018-08-01 17:14:07 +08:00
@BBCCBB

self-driven 😁
BBCCBB
2018-08-01 17:45:46 +08:00
尴尬 ==


github 上面说没时间开发这些玩意儿了, 咋又开始开发了啊?
pony279
2018-08-01 17:51:23 +08:00
@BBCCBB

- 工作项目忙
- 我想写个编辑器,发现工作量太大,又滚回来了
jsfaint
2018-08-01 17:52:44 +08:00
原来 ncm2-pyclang 已经支持头文件补全了啊……
那看来就不需要 neoinclude 了
jsfaint
2018-08-01 18:37:31 +08:00
@pony279 ncm2-match-highlight 需要什么特殊设置吗?我用 neovim 在 windows/linux/mac 下都会乱码
在 windows 下用 gvim 是正常的
xiaotianhu
2018-08-01 19:06:50 +08:00
一直用 vim 没有换到 neo 去 是不是太 old fashion 了
借问一下 lz, 这种补全插件 对于网络映射到本地的磁盘,补全的效率是不是都不怎么样?比较依赖 IO
补全一开就卡的要死,网络瓶颈
pony279
2018-08-01 20:15:05 +08:00
@jsfaint

不需要设置的

特殊 unicode 字符的展示在有些终端确实可能会乱码

我在 windows 上用 putty 连 linux,或者在 debian 上用 kfce-terminal 都是正常的

用不了的话只能等 neovim 实现了 https://github.com/neovim/neovim/issues/8780
pony279
2018-08-01 20:19:53 +08:00
@xiaotianhu

网络映射做什么事情都很麻烦吧

可以分情况看,如果对应的 Source 需要读大量文件才能得到补全结果的,很可能会出现拥堵,导致补全响应速度慢

不过 vim 自己是有维护 buffer 的,所以应该不会卡在文本编辑上

最好还是花时间尝试下看看效果
pony279
2018-08-01 20:23:01 +08:00
@jsfaint

kfce-terminal -> xfce-terminal

KFC 吃多了一时搞混了
jsfaint
2018-08-02 00:26:30 +08:00
@pony279 #10 我用的 deepin terminal,看来确实和终端有关系
chemzqm
2018-08-02 07:03:44 +08:00
谈几个 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,导致无法正确补全,设置的大了影响补全的体验。
pony279
2018-08-02 08:54:15 +08:00
@chemzqm

前三点都是已解决的问题

> 用户在 fuzzy 补全时也会触发 TextChangedI, 此时 ncm2 会发起新的请求,其实这种请求完全可以避免,

ncm2 core 的 on_complete 不代表 source 也能收到 on_complete 请求,内部会有缓存策略。

> 另外这个 g:ncm2#complete_delay 设的小了可能 language server 还没收到当前的 buffer,导致无法正确补全,设置的大了影响补全的体验。

这个配置现在是 0。我不认为这会影响 language server 收到的 buffer

source 收到 on_complete 是在 ncm2 的异步进程处理之后的结果,这个时候 vim/neovim 早已经在它自己的同步的 event loop 里面处理完 autocmd 了。
chemzqm
2018-08-02 09:51:33 +08:00
@pony279
1. ncm2 如何获取当前用户选择了哪一个 complete item ?还是就是补全完成的时候请求一下 https://github.com/ncm2/ncm2_lsp_snippet/blob/master/utils.py#L13
2. Language client 不可能使用同步方式在 TextChange 触发时发送 document 给 server,因为那样体验肯定会比较差,https://github.com/autozimu/LanguageClient-neovim/blob/next/autoload/LanguageClient.vim#L707
pony279
2018-08-02 10:07:41 +08:00
@chemzqm

> 1. ncm2 如何获取当前用户选择了哪一个 complete item ?还是就是补全完成的时候请求一下 https://github.com/ncm2/ncm2_lsp_snippet/blob/master/utils.py#L13

http://github.com/ncm2/ncm2-ultisnips

用这个插件配置按键映射,确认了就知道选择了哪一个

> 2. 2. Language client 不可能使用同步方式在 TextChange 触发时发送 document 给 server,因为那样体验肯定会比较差,https://github.com/autozimu/LanguageClient-neovim/blob/next/autoload/LanguageClient.vim#L707

这个我没有仔细看。如果 LCN 的 rust 程序是单线程而且没有协程的模型,那么这个做仍然是可靠的,它总是先处理完 did change 再处理 on_complete。
Yggdroot
2018-08-02 10:25:29 +08:00
支持 vim 吗,我主要用 vim,所以你之前的 nvim-completion-manager 我都没试用过。
pony279
2018-08-02 10:30:20 +08:00
@Yggdroot


能在 vim8 上跑,需要依赖 https://github.com/roxma/vim-hug-neovim-rpc

我花在 vim8 上的测试时间比较少,所以如果不可用最好提个 issue
Yggdroot
2018-08-02 10:38:13 +08:00
@pony279 好,有空试一下。
chemzqm
2018-08-02 11:55:32 +08:00
@pony279
> 用这个插件配置按键映射,确认了就知道选择了哪一个

不是用户确认的哪一个,complete resolve 应该是用户使用 <C-n> 或者 <C-p> 选中时进行调用然后显示文档等信息使用的。
pony279
2018-08-02 12:53:04 +08:00
> complete resolve 应该是用户使用 <C-n> 或者 <C-p> 选中时进行调用然后显示文档等信息使用的。

resolve 显示文档还是算了。

终端代码补全的 preview 出来一次闪一下,体验太差

不如等有人实现了这个 feature 再考虑: https://github.com/neovim/neovim/issues/396#issuecomment-163760889

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/475990

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX