比 deoplete 更快!比 YCM 更轻!支持 neovim/vim8 的自动补全框架! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pony279
V2EX    Vim

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

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

    一大波 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 天前发过 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:0 +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 原版有支持 pytho3
    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 以后继续弹出的问题。
    jsfant
        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     Solana     901 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 20:15 PVG 04:15 LAX 13:15 JFK 16:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86