V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pony279
V2EX  ›  Vim

比 deoplete 更快!比 YCM 更轻!支持 neovim/vim8 的自动补全框架!

  •  2
     
  •   pony279 · 2017-03-04 14:19:02 +08:00 · 33580 次点击
    这是一个创建于 2826 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一大波 gif 在这里: https://github.com/roxma/nvim-completion-manager/issues/12

    关于为什么更快的问题,请移步 项目 README 文档。

    当然可以和 @autozimuLanguageClient-neovim 配合使用

    第 1 条附言  ·  2017-03-04 15:15:36 +08:00

    简单说明下

    有评论支持认为 nvim-completion-manager 比 deoplete 快,看这里

    除了评论里提到的 async 架构的区别,在贡献者的帮助下,还有其它优化让 NCM 更快,比如看这里

    当然 deoplete 的作者也有重构 deoplete 的改进计划,包括 vim8 的支持,看这里,和这里。vim8 支持可能会用上我发起的 vim-hug-neovim-rpc,有心的同学可以提供必要关注,我由于竞争关系就不会在 deoplete 上面花太多的时间了。

    关于比 YCM 更轻的说法,老实说 NCM 使用的多进程架构对内存来说视比较重的,但是根据我过去对 YCM 的体验,YCM 对 VIM 的启动时间影响非常明显,而 NCM 选择了延迟加载,在neovim窗口显示后才启动,在 neovim 退出后直接 detach NCM 管理进程,NCM 管理进程继续做必要的清理工作,所以对 neovim 的启动和退出都是影响非常小的。

    第 2 条附言  ·  2017-03-06 16:30:23 +08:00

    刚刚看到 Shougo 大神的 twitter,

    deopleteの最適化を進めている。 補完方法を変更する予定だ。 少しはマシになるだろう。 これは並列化のための布石にすぎない。 deopleteは最強の補完プラグインになる。それは今ではない。

    Google 翻译:

    Deoplete's rival is nvim-completion-manager. To be honest, I am better than my complementary plugin. That is why I can not lose.

    倍感荣幸,我也会加油的 (ง •̀_•́)ง

    第 3 条附言  ·  2017-03-06 16:35:02 +08:00

    刚刚的日文引用复制错了,我不懂日文,抱歉 (/ω\)

    deopleteのライバルはnvim-completion-managerである。正直言ってこれまでの補完プラグインより良くできている。 だからこそ私は負けられない。

    107 条回复    2018-11-24 02:13:49 +08:00
    1  2  
    yuuko
        1
    yuuko  
       2017-03-04 17:31:59 +08:00 via Android   ❤️ 1
    已经用上了,很不错
    pony279
        2
    pony279  
    OP
       2017-03-04 20:10:28 +08:00
    不知道是标题的原因,还是文案的原因,还是其他啥原因, 15 天前发过 https://www.v2ex.com/t/341176#reply2 ,到现在也有 400 多点击了,才 1 人收藏,今天发现由 vim 这个板块又发了一次,结果 400 多点击, 7 人收藏
    (´・ω・`)
    lll9p
        3
    lll9p  
       2017-03-04 20:12:30 +08:00
    好东西,不过标题起的不够好啊。
    pony279
        4
    pony279  
    OP
       2017-03-04 20:16:38 +08:00
    @lll9p 比如?
    lll9p
        5
    lll9p  
       2017-03-04 20:25:43 +08:00
    @pony279 我也不会。
    tracyone
        6
    tracyone  
       2017-03-04 21:14:29 +08:00
    补全的准确性呢?语言的支持呢
    pony279
        7
    pony279  
    OP
       2017-03-04 22:04:28 +08:00
    @tracyone
    目前支持 c/c++, php, go, python, javascript, css
    配合 autozimu 的 LanguageClient-neovim 的话是有非常强的扩充能力的,当然精力有限我只测试了 PHP , autozimu 应该由测试过 javascript 和其他语言
    具体怎么评价准确性我说的太主观,希望能亲自试一下,有疑问或者不好用的地方发 issue 即可
    simple26
        8
    simple26  
       2017-03-04 22:27:15 +08:00
    一点小建议:

    关于文档

    1. 英文 README 可能需要花费一些时间,所以建议先准备一份详实的中文 README 。这么做的主要目的是可以理清思路,毕竟母语比较容易组织语言。有了中文准备以后,再做一份英文的相信会轻松不少。

    2. 更快,更轻。既然已经有了比较,那么最好就好好排排版,放到一起两两对比,既然教给大家一些知识,也能让大家鲜明地感受到此间差异。如果觉得这么做不合适的话,也可以只简略地提两句更快更轻的主导因素。相信很多人不会去点开 *这里* 的链接....

    3. 偶尔可以当回标题党 :) 至于怎么当这个标题党,就看你的语言能力了, 我只能说注意拿捏...

    关于试用

    neovim 试用起来没啥问题,但是 vim 可能还是需要再调整...... 同样一份 vim 配置, neovim 下 python 正常补全,但是 vim 下无法自动补全。

    加油
    rashawn
        9
    rashawn  
       2017-03-05 00:12:48 +08:00 via iPhone
    楼主 楼上提建议的 问问他们能不能提 PR
    reus
        10
    reus  
       2017-03-05 00:20:08 +08:00
    没有 deoplete 那样的 fuzzy match? 就是打 pf / pt 等可以选中 Printf 的
    NoAnyLove
        11
    NoAnyLove  
       2017-03-05 01:59:46 +08:00
    有参数补全吗? YCM 官方分支一直没有支持参数补全,不过有一个 fork 的分支倒是支持了,但是一直没有合并回去。
    PythonAnswer
        12
    PythonAnswer  
       2017-03-05 08:46:33 +08:00 via Android
    目前的行情是用 vim8 还是 neovim ?哪种人多
    pony279
        13
    pony279  
    OP
       2017-03-05 09:07:38 +08:00
    @reus 支持 fuzzy match ,有点问题,光标容易闪,不过我估计 deoplete 也面临着同样的问题, https://github.com/roxma/nvim-completion-manager/issues/8

    @NoAnyLove 你是指类似 ultisnips 的参数补全?这个在我的 todo 里面,还没开始 https://github.com/roxma/nvim-completion-manager/issues/36

    @PythonAnswer
    哪种人多我不清楚
    如果你是 linux/mac 用户,个人强烈推荐 neovim 。 windows 下的 neovim 我没有用过,就不评价了。
    对我这样的插件开发者来说 RPC 是一个大 killer 。除此以外还有其他我关注的小的特性,都将会在 neovim 里面实现,比如 `<c-h>` 和 `<Backspace>` 按键的区分。又比如我之前写的小插件, https://github.com/roxma/vim-tmux-clipboard ,也依赖着 neovim 的 TextYankPost 。
    pony279
        14
    pony279  
    OP
       2017-03-05 09:10:00 +08:00
    @simple26 谢谢

    关于 vim8 的补全问题我想详细了解下具体是怎么重现?
    htfy96
        15
    htfy96  
       2017-03-05 09:18:49 +08:00 via Android
    lang-server 是个好东西,可惜对 cpp 的支持还没有 ycm 完善
    NoAnyLove
        16
    NoAnyLove  
       2017-03-05 09:22:04 +08:00   ❤️ 1
    @pony279 我是指向 vim-jedi 那种,输入函数名后,会提示对应位置的参数是什么。比如像这种悬浮窗口的提示方法:

    https://github.com/davidhalter/jedi/raw/master/docs/_screenshots/screenshot_function.png

    或者像这种,在输入完函数名后,将函数调用和形参一起补完,然后再依次移动到每个参数的地方,替换成真正的实参

    https://camo.githubusercontent.com/a823bf9ec55b5b31aaf5a28946f7a0a80f7fc560/687474703a2f2f692e696d6775722e636f6d2f6d7873713959792e676966

    比如输入 os.setgid ,补完会自动补全 os.setgid(gid),然后按下 Tab 键(或者其他的什么键),会自动移动到 gid ,填写真正的实参。

    你提到的 issue#36 好像有点像第二种,不过不知道有没有包含输入实参自动替换掉原来的内容,以及按下某个按钮,自动跳到下一个参数
    pony279
        17
    pony279  
    OP
       2017-03-05 09:27:52 +08:00
    @NoAnyLove
    vim-jedi 的悬浮窗有些 BUG 和不想要的特性,比如会改变文档的是否已修改的属性。 https://github.com/neovim/neovim/issues/5808

    NCM 有类似的特性,当你的光标停留在 `(` 或者 `,` 后面,会有一个 popup menu ,什么都不补全,只是显示函数参数。
    ```
    foo_bar(|)
    ```
    pony279
        18
    pony279  
    OP
       2017-03-05 09:29:46 +08:00
    @NoAnyLove
    你说的 Tab 按键跳转就是我计划跟 ultisnips 集成的特性。目前还没有实现。
    PythonAnswer
        19
    PythonAnswer  
       2017-03-05 09:31:03 +08:00
    @NoAnyLove 多谢!不过我是 win 用户啊。。
    reus
        20
    reus  
       2017-03-05 11:16:00 +08:00
    @pony279 闪这个问题不大, deoplete 我用很久了,从来没觉得是个问题…… 不过如果可以不闪当然好
    pony279
        21
    pony279  
    OP
       2017-03-05 11:52:46 +08:00
    @reus 我业余是 ssh 上远程机器写代码的,闪烁效果因为网络延迟会放大,对我来说简直是折磨
    NoAnyLove
        22
    NoAnyLove  
       2017-03-05 12:12:01 +08:00
    @PythonAnswer 亲,你 at 错认了。。。。。。。不过,话说为啥 Windows 下 Vim 和 NeoVim 都不太好用啊。。。。。。
    reus
        23
    reus  
       2017-03-05 12:13:56 +08:00
    @pony279 neovim 可以自己写前端,或者可以在本地跑前端,远程机器跑后端,一个想法……
    NoAnyLove
        24
    NoAnyLove  
       2017-03-05 12:25:59 +08:00
    @pony279 非常期待这个功能。有参数补完的用户体验会好很多,毕竟不是所有函数都能记得很熟练。。。
    simple26
        25
    simple26  
       2017-03-05 19:18:17 +08:00
    @pony279 按照你的 README 该下载的都下载了 但是 vim 打开 python 无法补全 neovim 正常 不太清楚是“我的”问题还是 “你的” 问题
    pony279
        26
    pony279  
    OP
       2017-03-05 19:46:49 +08:00
    @simple26
    有空的话希望能调试下,这是第一种方法,打日志,如果插件和 python 补全进程正常启动,会看到 cm_core 和 cm_jedi 的日志文件。如果从这里面可以看到异常,可以直接发 issue 给我,通常也比较好解决。

    ```
    NVIM_PYTHON_LOG_FILE=nvim.log NVIM_NCM_LOG_LEVEL=DEBUG vim test.py
    ```

    超详细的日志文件。
    ···
    NVIM_PYTHON_LOG_FILE=nvim.log NVIM_PYTHON_LOG_LEVEL=DEBUG vim test.py
    ```


    如果日志文件都看不到,任何错误提示都没有,可以按照这个步骤尝试打开插件主进程,看下有无错误提示:

    获取 vim-hug-neovim-rpc 的服务端口:

    ```
    :echo g:_cm_servername
    127.0.0.1:41579
    ```

    启动主进程,(前面的日志设定也可以在这里使用)

    ```
    python3 pythonx/cm_start.py core 127.0.0.1:41579
    ```
    simple26
        27
    simple26  
       2017-03-05 20:15:33 +08:00
    @pony279 问题可能是出在这里了 没有主进程 这是一些变量

    g:_cm_channel_id : -1
    g:_cm_servername: 空
    g:_cm_sources: {}
    autozimu
        28
    autozimu  
       2017-03-05 21:23:16 +08:00 via iPhone
    建议可以发到 reddit 相关社区去,效果要比这里好很多。

    再有,确实如上面建议,可以备一份中文 README ,方便中文用户。
    pony279
        29
    pony279  
    OP
       2017-03-05 21:45:38 +08:00
    @autozimu
    谢谢,平时看资料英文居多,所以一开始选择写英文会舒服一点,有些词汇经常想不起对应的中文,比如我发帖里面用的 detach

    中文文档会有计划出,优先级相对低一些,毕竟现在 neovim 项目本身英文较少,我估计 neovim 用户群对英文的阅读阻力也会小一些
    pony279
        30
    pony279  
    OP
       2017-03-05 21:47:19 +08:00
    @simple26
    vim8 支持需要安装 https://github.com/roxma/vim-hug-neovim-rpc
    neovim_rpc#serveraddr() 这个是调用的结果就是刚刚的 g:_cm_servername 的真身
    pony279
        31
    pony279  
    OP
       2017-03-05 21:54:56 +08:00
    我得先 fix 完这波 issue 再去别的社区发。
    (´・ω・`)
    simple26
        32
    simple26  
       2017-03-05 22:05:48 +08:00
    @pony279

    https://github.com/roxma/vim-hug-neovim-rpc 已经确认在 vim8 中安装完毕
    pony279
        33
    pony279  
    OP
       2017-03-05 22:08:20 +08:00
    @simple26
    `:echo neovim_rpc#serveraddr()` 这个的调用结果是?
    pony279
        34
    pony279  
    OP
       2017-03-05 22:14:16 +08:00
    @simple26
    刚更新了文档, vim8 需要安装 neovim 的 pip 模块, 也就是说 `:python3 import neovim` 或者 `:python import neovim` 需要有一个可以工作。
    congeec
        35
    congeec  
       2017-03-06 07:30:01 +08:00 via iPad
    在 markdown 里补全 python 、 go 。厉害了我的哥
    看你给的链接,估摸着最近一年内主流语言有成熟的 language server
    simple26
        36
    simple26  
       2017-03-06 07:44:07 +08:00
    @pony279

    >vim8 需要安装 neovim 的 pip 模块

    什么意思?不是 pip3 install neovim 就行了? vim8 的 Python 的确找不到 neovim module
    pony279
        37
    pony279  
    OP
       2017-03-06 08:14:20 +08:00 via iPhone
    @simple26 嗯, pip3 install neovim 就可以了
    simple26
        38
    simple26  
       2017-03-06 09:34:57 +08:00
    @pony279 那么我该做的应该都做了 但是 vim8 的 python3 的确是找不到 neovim module

    $ which python
    /Users/xlc/anaconda3/bin/python
    waruqi
        39
    waruqi  
       2017-03-06 10:59:01 +08:00
    supertab 已完全够用了。。
    pony279
        40
    pony279  
    OP
       2017-03-06 11:18:29 +08:00 via iPhone
    @waruqi 嗯,这个看个人需求。我也是根据自己的需求发起的项目。
    waruqi
        41
    waruqi  
       2017-03-06 13:10:56 +08:00
    @pony279 嗯嗯,确实每个人需求不一样,我习惯了敲代码的时候,默认不希望有自动补全来干扰我码字,能够让我安安静静写代码,只有在需要补全的时候,主动 tab 下就好。 你的项目很不错哦,赞一个。。!
    pony279
        42
    pony279  
    OP
       2017-03-06 15:57:25 +08:00
    @waruqi

    顺便安利一下, NCM 支持手动触发模式,

    https://github.com/roxma/nvim-completion-manager/blob/6a83d8d0fd8482183b2723a6f1e8da3c4dba1e42/doc/nvim-completion-manager.txt#L446

    设置 `g:cm_auto_popup=0`
    然后把需要的按键映射到 `<Plug>(cm_force_refresh)` 这个就可以了
    pony279
        43
    pony279  
    OP
       2017-03-06 15:59:08 +08:00
    @simple26
    这个问题比较奇怪,我也不知到怎么排查了,这个属于在 vim 里面无法使用安装好的 pip 模块的问题
    pony279
        44
    pony279  
    OP
       2017-03-06 16:02:09 +08:00
    @waruqi

    我还有打算尝试有点类似 mulcomplete 的模式,因为 <Plug>(cm_force_refresh) 可能会强制弹出多个 source 的一大堆补全,我想通过重复某个按键,从优先级高到低来尝试不同的 source 。
    pony279
        45
    pony279  
    OP
       2017-03-06 16:03:04 +08:00
    waruqi
        47
    waruqi  
       2017-03-06 17:56:34 +08:00
    @pony279 赞一个。。!
    waruqi
        48
    waruqi  
       2017-03-06 17:58:52 +08:00
    @pony279 能支持附近文本自动补全吗?尝试优先补全 最近频繁输入的文本。。
    ipconfiger
        49
    ipconfiger  
       2017-03-06 18:01:33 +08:00
    我的内心毫无波动, 默默的打开了 PyCharm
    pony279
        50
    pony279  
    OP
       2017-03-06 22:27:09 +08:00
    @waruqi
    目前有当前 buffer 的 keyword 补全
    pony279
        51
    pony279  
    OP
       2017-03-06 22:34:38 +08:00
    @waruqi 优先补全最频繁的目前还没有
    simple26
        52
    simple26  
       2017-03-07 10:04:57 +08:00
    @pony279 最近比较忙 有空了会研究一下
    pony279
        53
    pony279  
    OP
       2017-03-07 20:23:06 +08:00
    @simple26
    好的,谢谢!

    @NoAnyLove
    参数展开利用 neosnippet 实现了,就是不知道为啥感觉有点粗糙,我在这里加了段 demo : https://github.com/roxma/nvim-completion-manager/issues/36#issuecomment-284701703
    kepbod
        54
    kepbod  
       2017-03-08 02:44:03 +08:00
    支持一下。既然也支持 vim8 ,叫 nvim-completion-manager 就好像只支持 neovim ,如果换个更霸气的名字就更好了。
    NoAnyLove
        55
    NoAnyLove  
       2017-03-08 04:03:01 +08:00
    @pony279 这种函数之后的 Place holder 看起来确实有点奇怪。而且需要安装 neosnippet 作为依赖,感觉加上了额外的限制(我的意思是,如果有用户本来不用 neosnippet ,或者本身是用 Ultisnips 的用户,为了使用这个功能就必须要切换到 neosnippet ,感觉这种限制比较大)
    NoAnyLove
        56
    NoAnyLove  
       2017-03-08 04:04:53 +08:00
    @kepbod 赞同。看 nvim-completion-manager 这个名字我一直以为是 neovim 专属的插件
    pony279
        57
    pony279  
    OP
       2017-03-08 07:28:09 +08:00 via iPhone
    @NoAnyLove ultisnips 我以后也会支持到


    @kepbod 这个项目一开始确实是给 neovim 写的,后来顺便支持了 vim8 ,总体来讲插件在 vim8 上的表现差一些,保留这个名字也是希望用户能使用 neovim
    river1007
        58
    river1007  
       2017-03-08 10:48:07 +08:00
    支持支持,加油, deoplete 看起来好重。
    pony279
        59
    pony279  
    OP
       2017-03-08 13:08:38 +08:00   ❤️ 1
    river1007
        60
    river1007  
       2017-03-08 14:06:15 +08:00
    @pony279 有没有 qq 讨论群?
    pony279
        61
    pony279  
    OP
       2017-03-08 15:27:54 +08:00 via iPhone
    @river1007 不喜欢用 qq 讨论,容易灌水, github 本身也可以用来讨论
    kenzi
        62
    kenzi  
       2017-03-10 20:40:10 +08:00
    关注点不同。。。。字体用的啥? timinus?
    pony279
        63
    pony279  
    OP
       2017-03-10 21:21:51 +08:00 via iPhone
    ttystudio 生成 gif 的时候重新渲染的默认字体,不是我使用的字体
    pony279
        64
    pony279  
    OP
       2017-03-10 21:22:58 +08:00 via iPhone
    @kenzi

    ttystudio 生成 gif 的时候重新渲染的默认字体,不是我使用的字体
    river1007
        65
    river1007  
       2017-03-11 10:51:24 +08:00
    @pony279 在自动补全的时候,大概率报这种错误,知道怎么解决不?:-)

    error caught while executing async callback:
    NvimError(b'Vim(sign):E474: Invalid argument',)
    Traceback (most recent call last):
    File "/Users/test/.config/nvim/plugged/LanguageClient-neovim/rplugin/python3/LanguageClient/LanguageClient.py", line 799, in addHighlightAndSign
    self.signid, startline + 1, signname, buf.number))
    File "/usr/local/lib/python3.4/site-packages/neovim/api/nvim.py", line 218, in command
    return self.request('nvim_command', string, **kwargs)
    File "/usr/local/lib/python3.4/site-packages/neovim/api/nvim.py", line 131, in request
    res = self._session.request(name, *args, **kwargs)
    File "/usr/local/lib/python3.4/site-packages/neovim/msgpack_rpc/session.py", line 98, in request
    raise self.error_wrapper(err)
    neovim.api.nvim.NvimError: b'Vim(sign):E474: Invalid argument'

    the call was requested at
    File "/Users/test/.config/nvim/plugged/LanguageClient-neovim/rplugin/python3/LanguageClient/RPC.py", line 91, in serve
    self.handle(msg)
    File "/Users/test/.config/nvim/plugged/LanguageClient-neovim/rplugin/python3/LanguageClient/RPC.py", line 122, in handle
    self.onNotification(message)
    File "/Users/test/.config/nvim/plugged/LanguageClient-neovim/rplugin/python3/LanguageClient/LanguageClient.py", line 928, in handleRequestOrNotification
    getattr(self, method)(message['params'])
    File "/Users/test/.config/nvim/plugged/LanguageClient-neovim/rplugin/python3/LanguageClient/LanguageClient.py", line 769, in textDocument_publishDiagnostics
    self.nvim.async_call(self.addHighlightAndSign, params)
    pony279
        66
    pony279  
    OP
       2017-03-11 11:39:14 +08:00
    @river1007 addHighlightAndSign 感觉跟 LanguageClient 的关系比较大,能把复现的方法整理一下发到 github 吗? https://github.com/autozimu/LanguageClient-neovim/issues
    jsfaint
        67
    jsfaint  
       2017-03-14 14:51:23 +08:00
    看 github 上 ncm 的 clang 支持是 @pony279 fork 了一个版本,这个其实 ok
    可是为啥是 python2 ……
    目前 ncm 的 source 比起 deoplete 有点少
    pony279
        68
    pony279  
    OP
       2017-03-14 15:16:15 +08:00   ❤️ 1
    @jsfaint
    clang 官方库里面把 python3 支持去掉了,我还不清楚是什么原因

    据 clang_complete 的维护者说,旧版本的 clang 库 python3 还是可以用的

    我还没测试过 python3 ,要求 python2 也是保守起见。
    jsfaint
        70
    jsfaint  
       2017-03-14 15:33:16 +08:00
    @pony279 #68 clang_complete 原版有支持 python3
    archlinux 默认是 python3 ,然后我 windows , mac 装的都是 python3
    如果只能 python2 就有点蛋疼了……
    pony279
        71
    pony279  
    OP
       2017-03-14 15:36:25 +08:00
    NCM 是直接使用 python2 命令,一般视不会和 python3 冲突的。
    pony279
        72
    pony279  
    OP
       2017-03-14 15:42:39 +08:00   ❤️ 1
    @jsfaint

    let g:cm_sources_override = {
    \ 'clang_complete': {'channel': {'module': 'cm_sources.clang_complete', 'type': 'python3'}}
    \ }

    把这个加到 vimrc 里面,可以强制 python3
    jsfaint
        73
    jsfaint  
       2017-03-14 15:47:35 +08:00
    @pony279 另外 ncm 该怎么配才能达到 deoplete 按 enter 的效果?
    就是在没有选中时,按 enter 选中第一项,并关闭补全菜单
    在有选中时直接关闭补全菜单?
    谢谢~~
    pony279
        74
    pony279  
    OP
       2017-03-14 16:07:31 +08:00
    @jsfaint

    这个比较麻烦, 跟 completeopt 的 noselect 选项有关,现在是被 NCM 写死的,暂时不支持改动

    此外 NCM 和 deoplete 的实现机制也有些区别,在 NCM 里面直接改 completeopt 还不行,关了 menu 以后可能会重新弹出来

    所以,暂时不支持这种配置。

    推荐配置是这个
    inoremap <expr> <CR> (pumvisible() ? "\<c-y>\<cr>" : "\<CR>")

    enter 直接关闭 popup 并换行。
    jsfaint
        75
    jsfaint  
       2017-03-14 16:10:54 +08:00
    @pony279 #74 其实我有看到你 github 里面的这个配置……但是我就特不习惯换行的这个动作……
    我写成
    ```
    inoremap <expr> <CR> (pumvisible() ? "\<c-n>\<c-y>" : "\<CR>")
    ```
    第一个需求倒是满足了,可是如果有选中时候就傻逼了 orz
    pony279
        76
    pony279  
    OP
       2017-03-14 16:25:17 +08:00   ❤️ 1
    @jsfaint

    empty(v:completed_item) 可以用来检测有 popupmenu 的情况下是否有选中 item

    不过解决不了关闭 popup menu 以后继续弹出的问题。
    jsfaint
        77
    jsfaint  
       2017-03-14 16:32:05 +08:00
    @pony279 #76 哈哈~我也刚搞定这个

    inoremap <expr> <CR> (pumvisible() ? (empty(v:completed_item) ? "\<C-n>\<C-y>" : "\<C-y>") : "\<CR>")

    popup menu 没关系啦~这个可以接受
    jsfaint
        78
    jsfaint  
       2017-03-14 16:59:42 +08:00
    @pony279 #76
    Linux 下工作一切正常, windows(vim/neovim)下只有 python 的补全正常,其他的补全( c, js, go )不知道什么原因都没工作


    换回 neocomplete ( vim )和 deoplete ( neovim )都可以正常工作
    pony279
        79
    pony279  
    OP
       2017-03-14 20:14:11 +08:00
    @jsfaint

    用这种方式打日志复现下试试


    ```
    NVIM_PYTHON_LOG_FILE=nvim.log NVIM_NCM_LOG_LEVEL=DEBUG vim test.js
    ```

    windows 的话是
    set NVIM_PYTHON_LOG_FILE=nvim.log
    set NVIM_NCM_LOG_LEVEL=DEBUG
    nvim test.js

    然后看下相关的日志文件, js 的话是 nvim.log_xxx_cm_tern
    还有 nvim.log_cm_core
    jsfaint
        80
    jsfaint  
       2017-03-15 09:42:32 +08:00
    @pony279 #79 按照这个方法打开了日志
    打开 index.js
    出现了一堆 log ,但是没有 nvim.log_xxx.cm_tern


    cm_core 中有如下内容。看起来是 cm_tern 注册失败了

    ```
    2017-03-15 09:18:43,110 [ERROR @ cm_core.py:__init__:115] 10164 - register_source for cm_sources.cm_tern failed
    Traceback (most recent call last):
    File "C:\Users\jia.sui\vimfiles\plugged\nvim-completion-manager\pythonx\cm_core.py", line 110, in __init__
    m = importlib.import_module(modulename)
    File "C:\Users\jia.sui\AppData\Local\Programs\Python\Python35\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
    File "<frozen importlib._bootstrap>", line 986, in _gcd_import
    File "<frozen importlib._bootstrap>", line 969, in _find_and_load
    File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
    File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
    File "<frozen importlib._bootstrap_external>", line 673, in exec_module
    File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
    File "C:\Users\jia.sui\vimfiles\plugged\nvim-cm-tern\pythonx\cm_sources\cm_tern.py", line 6, in <module>
    ```

    打开 main.go ,有 cm_gocode 生成,但是在执行 cm_refresh 时候报错了

    ```
    2017-03-15 09:18:44,009 [ERROR @ cm_start.py:on_notification:168] 5028 - Failed processing method: cm_refresh, args: [{'early_cache': 1, 'enable': 1, 'priority': 9, 'sort': 1, 'scopes': ['go'], 'channel': {'events': [], 'type': 'python3', 'id': 6, 'module': 'cm_sources.cm_gocode'}, 'scoping': 1, 'cm_refresh_patterns': ['\\.(\\w*)$'], 'abbreviation': 'Go', 'cm_refresh_min_word_len': 3, 'name': 'cm-gocode'}, {'scope_match': 'go', 'base': 'f', 'changedtick': 8, 'curpos': [0, 8, 6, 0, 6], 'bufnr': 1, 'col': 6, 'lnum': 8, 'startcol': 5, 'early_cache': 1, 'typed': ' f', 'scope': 'go', 'filetype': 'go', 'force': 0, 'filepath': 'D:\\Downloads\\js_test\\main.go'}]
    Traceback (most recent call last):
    File "C:\Users\jia.sui\vimfiles\plugged\nvim-completion-manager\pythonx\cm_start.py", line 165, in on_notification
    func(*args)
    File "C:\Users\jia.sui\vimfiles\plugged\nvim-completion-manager\pythonx\cm_sources\cm_gocode.py", line 56, in cm_refresh
    stderr=subprocess.DEVNULL)
    File "C:\Users\jia.sui\AppData\Local\Programs\Python\Python35\lib\subprocess.py", line 676, in __init__
    restore_signals, start_new_session)
    File "C:\Users\jia.sui\AppData\Local\Programs\Python\Python35\lib\subprocess.py", line 955, in _execute_child
    startupinfo)
    FileNotFoundError: [WinError 2] 系统找不到指定的文件。
    ```
    jsfaint
        81
    jsfaint  
       2017-03-15 10:55:17 +08:00
    @pony279 #79 升级到 master 的最新提交,突然工作正常了……只不过在 windows 下反应很慢
    pony279
        82
    pony279  
    OP
       2017-03-15 11:31:01 +08:00
    @jsfaint 反应很慢指的视所有补全都很慢?还是 js 补全很慢?

    > FileNotFoundError: [WinError 2] 系统找不到指定的文件。

    这个估计是指运行 `gocode` 命令失败,需要检查下环境变量。
    pony279
        83
    pony279  
    OP
       2017-03-15 11:32:39 +08:00
    @jsfaint

    js 补全慢的问题已经有解决方案, https://github.com/roxma/nvim-cm-tern/pull/4
    jsfaint
        84
    jsfaint  
       2017-03-15 11:49:06 +08:00
    @pony279 #82 gocode 的问题已经搞定了,是之前重装系统 PATH 没设好

    python 补全速度很快, js, go, c 都比较慢
    jsfaint
        85
    jsfaint  
       2017-03-15 11:56:35 +08:00
    @pony279 #82 deoplete 有三个 clang 的扩展
    clang_complete
    deoplete_clang
    deoplete_clang2

    前两个用的都是 libclang ,第三个调用 clang -cc1 ,速度比前两个快不少

    completor.vim 的 clang source 也是通过调用 clang binary 实现的。不过 completor.vim 的 clang source 在 windows 工作有问题。提了 issue 很久没人回应……
    pony279
        86
    pony279  
    OP
       2017-03-15 12:38:25 +08:00 via iPhone
    @jsfaint 谢谢,我会试下切换不用 python 库
    fantiq
        87
    fantiq  
       2017-04-02 13:01:31 +08:00
    @river1007 quickfix 窗口开着就会出现你的情况

    准备提 ISSUE 了
    NoAnyLove
        88
    NoAnyLove  
       2017-08-25 23:42:47 +08:00
    从 YouCompleteMe 切换到了 NCM,感觉速度和响应快了不少。不过有一点小小的问题,切换到 NCM 之后,语法检查可以用 syntastic 代替,不知道查看文档、跳转到定义这些功能有没有什么好用的插件可以推荐一下。
    pony279
        89
    pony279  
    OP
       2017-08-28 10:54:11 +08:00   ❤️ 1
    @NoAnyLove

    流行的语言一般都有对应的 vim 插件。例如 python 可以用 jedi-vim,golang 有 vim-go,NCM 目前只做补全。

    https://github.com/autozimu/LanguageClient-neovim 如果能找到对应的 Language Server 也可以用这个,功能齐全。
    NoAnyLove
        90
    NoAnyLove  
       2017-08-28 11:41:23 +08:00
    @pony279 jedi-vim 的补全和文档、跳转功能都不错,不过 rename 功能有点太不靠谱了,还不如自己手动搜索替换靠谱。第一次知道 Language Server 这个东西,看起来很厉害的样子,抽空试试。感谢推荐。
    ashfinal
        91
    ashfinal  
       2017-08-29 19:43:54 +08:00
    不错,目前用的就是这个补全插件。个人感觉比 deoplete 要好,除了名字长了点…… 😂

    之前还给另一个插件 vimtex 提 issue,让作者在文档里加了 ncm 的相关说明。
    pony279
        92
    pony279  
    OP
       2017-09-05 11:14:48 +08:00
    @ashfinal

    这个名字比方便合被 google 搜索出来,其次是表明项目的野心 。

    看了下项目的 traffic 也确实如此。现在每天会有少量用户通过 google 搜索进去观光,偶尔贡献点 issue,方便我控制开发的节奏。推广的时候一下来一波 issue,有点受不了。
    ashfinal
        93
    ashfinal  
       2017-09-05 14:31:06 +08:00
    @pony279 有个好点的名字固然好,不过相对功能而言,反而没那么重要了

    我个人目前是 vim8 用的 neocomplete,neovim 用的 ncm。(配置文件里判断一下就好),体验基本一致。

    ncm 比较爽的一点是 scope 功能,markdown 文档里能直接补全 python 代码了。
    jsfaint
        94
    jsfaint  
       2017-09-27 13:41:55 +08:00
    @pony279 看到你 github 新增了 ncm-clang 这个插件~
    看了下代码,似乎目前只支持 cpp,还有就是只有在->还有::的时候才触发补全?
    ncm-clang 你有计划下一步要加哪些特性吗?我看看有没有什么我可以做的贡献 :)

    另外,ncm 目前有一个问题或者说是少一个特性
    在用 neocomplete 的时候如果有一条 abc_def 这样的内容
    当你输入 def 之后要往前边插入 abc,时候会弹出 abc_def 的补全,当选择了这个补全的时候,最终的结果是 abc_def
    而 ncm 目前的行为是 adc_defdef
    这个有办法设置或者有修改的计划吗?

    谢谢~
    pony279
        95
    pony279  
    OP
       2017-09-27 14:26:58 +08:00
    @jsfaint


    > 看了下代码,似乎目前只支持 cpp,还有就是只有在->还有::的时候才触发补全?

    因为我做 cpp 开发,其他语言没测试过。c 应该也可以。

    除了 -> 和 ::,输入足够多的字符(默认 3 个)也会触发补全。`:help NCM-source-examples` 后面有解释补全的触发过程。



    > ncm-clang 你有计划下一步要加哪些特性吗?我看看有没有什么我可以做的贡献 :)

    snippet 支持,需要解析 clang 的输出

    识别 .clang_complete 和 compile_commands.json。这个插件只做补全,但是实现了这个功能可以尝试配合其他 vim clang 插件,实现跳转定义。比如 https://github.com/justmao945/vim-clang。vim-clang 本身有 compile_commands.json 的识别,还没测试过,如果 OK 的话也可以考虑直接用 vim-clang 的。

    目的是想替换掉 clang_complete 这个插件,不想继续维护它了。



    > 在用 neocomplete 的时候如果有一条 abc_def 这样的内容
    当你输入 def 之后要往前边插入 abc,时候会弹出 abc_def 的补全,当选择了这个补全的时候,最终的结果是 abc_def
    而 ncm 目前的行为是 adc_defdef
    这个有办法设置或者有修改的计划吗?

    并没有打算实现这个功能。我比较倾向于使用 ce 清除掉再重新输入
    jsfaint
        96
    jsfaint  
       2017-09-27 14:42:52 +08:00
    @pony279 明白~
    现在的实现只有支持 cpp,而我用 c 比较多,所以之后如果你没有计划的话,我会来帮忙增加 c 的支持。
    如果为 c 补全加一个单独的 source,会不会被你打?看到现有的实现是直接去 call clang++的

    另外.clang_complete 的支持应该不难做到,不过 compile_commands.json 的支持我没什么概念了,不知道是不是 clang 会直接识别它

    跳转之类的支持可能等 language server 实现比较好,ncm 专心做补全就够
    vim-clang 的代码有点不清晰,所有东西都塞在一个文件里。。

    第二个问题可能和 fuzzy 也有关,目前的 fuzzy matcher 行为有时候怪怪的
    pony279
        97
    pony279  
    OP
       2017-09-27 15:23:35 +08:00
    @jsfaint

    为 c 语言支持 fork 出一份应该没什么关系。如果区别比较小最终还是有办法合并的。
    pony279
        98
    pony279  
    OP
       2017-09-30 11:05:06 +08:00   ❤️ 1
    @jsfaint

    简单改了下, 现在可以做 C 语言的补全了
    NoAnyLove
        99
    NoAnyLove  
       2017-10-01 11:51:15 +08:00
    看到了 ncm-clang 的更新,不过如果想要使用 goto 特性还需要安装 clang_complete 并且添加一大段配置代码,感觉有点重复和麻烦。个人还是比较喜欢能安装一个插件就搞定的解决方案。好奇问问,为什么不直接增强对 Rip-Rip/clang_complete 的集成呢?
    pony279
        100
    pony279  
    OP
       2017-10-02 18:37:14 +08:00   ❤️ 1
    @NoAnyLove

    clang_complete 采用的是 python 调用 libclang.so 。用系统的 python 还好,我在一些机器装了 conda,有可能无法使用,因为他们编译使用的 libstdc++ 版本不一致。

    clang_complete 使用时间久了内存占用会越来越高

    不想维护 clang_complete 的代码,比较困难

    ---

    目前体验到的 goto 特性有几个选择,但是 clang_complete 的表现最好,所以还是在文档里面做了说明

    一旦出现更好的方案,我会更新文档,把 clang_complete 那段去掉。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1041 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 20:53 · PVG 04:53 · LAX 12:53 · JFK 15:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.