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

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

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

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

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

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

Gif demo:

9557 次点击
所在节点    Vim
37 条回复
pony279
2018-08-02 12:53:14 +08:00
Yggdroot
2018-08-03 11:24:20 +08:00
试用了一下,感觉还不错,说说使用中遇到的问题。
1. 在 vim 中,还没使用成功。
一启动就有错
```
Error detected while processing function ncm2#insert_mode_only_key:
line 3:
E492: Not an editor command: tmap <Plug>(ncm2_skip_auto_trigger) <nop>
E492: Not an editor command: tmap <Plug>(ncm2_auto_trigger) <nop>
E492: Not an editor command: tmap <Plug>(ncm2_manual_trigger) <nop>
E492: Not an editor command: tmap <Plug>(ncm2_complete_popup) <nop>
E492: Not an editor command: tmap <Plug>(_ncm2_auto_trigger) <nop>
```
我 vimrc 中只是 https://github.com/ncm2/ncm2#install 里面的内容,后来又加上了 Plug 'roxma/vim-hug-neovim-rpc'。
tmap 是 neovim 中的命令,在启动 vim 时却报这个错。(怀疑楼主所说的支持 vim 只是理论上,实际上没测过)

2. 不够 `out of box`
我把 https://github.com/ncm2/ncm2#install 里的内容添加到 vimrc 里,启动 nvim,发现怎么操作都没有补全;后来猜测可能需要装一些 source,就装了 Plug 'ncm2/ncm2-bufword',敲了几个字母,发现还是没有补全;等敲到第 4 个字母时,才弹出了补全菜单,我一般习惯于 1 个字母就出现补全。我知道这可以设置,就找到了 g:ncm2#complete_length。
当然这都不是什么问题,我觉得如果 readme 里加一些必要的说明会更好,这样可以让像我这样第一次接触 ncm2 的人能够更容易的去体验这个插件。

3. fuzzy 算法有待提高
补全只能识别单词的边界字母,非边界字母就识别不了了。
例如:`encode`, 如果我输入`end`,`encode`就不会出现在补全列表中了。

总体来说还不错,不像一些插件补全菜单闪的厉害,会继续试用。
pony279
2018-08-03 12:00:56 +08:00
> tmap 是 neovim 中的命令,在启动 vim 时却报这个错。(怀疑楼主所说的支持 vim 只是理论上,实际上没测过)

tmap 在新版的 vim8 也有了,我测试的版本是 8.1.135 http://vimhelp.appspot.com/map.txt.html#%3Atmap


> 敲了几个字母,发现还是没有补全;等敲到第 4 个字母时,才弹出了补全菜单,我一般习惯于 1 个字母就出现补全。我知道这可以设置,就找到了 g:ncm2#complete_length。

这个还真是个人习惯,我喜欢稍微安静一些的 popup,每敲击一个字符就弹出会很烦


> 里的内容添加到 vimrc 里,启动 nvim,发现怎么操作都没有补全

source 在 README Optional tips 里面有。也许应该移到 Install 部分会比较显眼吧。


> 3. fuzzy 算法有待提高

这个是有意而为之

在旧版本的 ncm 里面有一个 fuzzy matcher 能符合你的描述: https://github.com/roxma/nvim-completion-manager/blob/master/pythonx/cm_matchers/fuzzy_matcher.py

可是它太过 fuzzy。后来我发现需要过滤的条数越多,得到的结果精准度就越差,到最后我自己又用回了 prefix match

基于之前的体验,我重新开发了两种 fuzzy,目前默认是 abbrfuzzy,换成最近新增的 substrfuzzy 可能会更加符合你的习惯

你可以在这里参与讨论 https://github.com/ncm2/ncm2/issues/30,主要是反馈太少,对算法的描述也比较困难,所以大多基于自己的喜好和体验去实现和优化
pony279
2018-08-03 12:01:09 +08:00
Yggdroot
2018-08-03 12:24:24 +08:00
@pony279 tmap 好像是 patch 8.0.1108 加上去的,我使用的是 8.0.771 ,所以最好能在文档中说明一下。
pony279
2018-08-03 13:19:38 +08:00
@Yggdroot

忽略掉了: https://github.com/ncm2/ncm2/commit/c78c47118bd99a27dcecfb7a1acb1afbf38ccb4b

8.0.771 有点旧了,snippet 特性需要这个重要的 patch: https://github.com/neovim/neovim/pull/8003

至少要 8.0.1493
ivechan
2018-08-04 17:33:14 +08:00
支持下,下载试用一下.
希望能替代掉 YCM。
ivechan
2018-08-04 19:35:50 +08:00
@pony279 一个很奇怪的问题,在补全 python 的第三方包 mxnet 的时候,会出现错误,其他包没有问题。
windows
neovim 0.3.2 dev
python 3.6.6
已经安装好插件(确认了其他包补全正常),

复现过程:
pip install mxnet
import mxnet
mxnet.sym.

这步开始出错,使用其他补全工具不会。
出错日志有点长,有需要我再贴上来。
pony279
2018-08-05 12:04:54 +08:00
nG29DOMuRYTWfcSr
2018-08-05 14:13:17 +08:00
对于 Vim 插件的开发者,我一至很佩服,前段时间在 reddit 上看到 ncm2 的帖子,跳到 ncm2 github 仓库留言了下,发现还是被作者 block 了,以前的事情过去这么久,这结一直解不开吗?

@pony279 希望,有机会可以聊聊。关于以前你的另外一个插件的一些言论,我先在这里和你道歉。
ivechan
2018-08-05 22:03:47 +08:00
@pony279 你给的链接,我无法重现这个错误。
不过今天我又重新试了一下,发现使用其他包的时候,居然也会出错。
然后我看错误日志,发现居然传递了之前测试 mxnet 包的补全信息,有点匪夷所思。(会不会有缓存机制?)
-----------------------------------------------------------------------------------------------------
我重装了 mxnet 包后,能过正常使用 ncm2 了。
(之前使用 jedi.vim 的时候能过补全 mxnet,就没有怀疑这个包本身的问题)
虽然很意外,不能确定哪里出了问题。不过最终还是顺利用上了 ncm2, 综合使用很不错,很感谢你!
keelii
2018-08-23 14:04:44 +08:00
JavaScript 的补全其实可以直接复用 TS 的,这个不知道应该怎么设置呢。单独再引入 tern.js 其实没必要。
chengmonkey
2018-09-15 22:49:49 +08:00
楼主这个 ncm2/ncm2-ultisnips 咋使用啊- -配置模版的地方在哪里- -
pony279
2018-09-19 17:25:07 +08:00
@chengmonkey

这个插件只暴露这三个接口,没别的了

- ncm2_ultisnips#expand_or
- ncm2_ultisnips#completed_is_snippet()
- <Plug>(ncm2_ultisnips_expand_completed)

补全的 snippet 是由 source 提供的
dangoron
2018-10-15 21:33:56 +08:00
从第一代就开始在用,现在和 LSP 结合非常舒服,拉了用 unite 的日本学长过来一起用。感谢作者
hujianxin
2018-12-08 14:31:12 +08:00
感谢楼主的插件,非常厉害!

另外,ncm2-tmux 这个插件的作用是?
pony279
2018-12-14 00:01:18 +08:00
@hujianxin

ncm2-tmux 会把其他 tmux 窗口的 keyword 抓下来用于补全

如果你经常用 tmux,可以试试

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

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

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

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

© 2021 V2EX