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

LanguageClient-neovim 补全实现的若干问题

  •  
  •   chemzqm · 2018-04-30 23:45:27 +08:00 · 6757 次点击
    这是一个创建于 2428 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为了体验 LSP 的效果,最近试用了下 LanguageClient-neovim 这个插件(以下简称 LCN )。

    总的来说 LSP 的基本功都已实现,但是细节体验上还跟 vscode 存在很大差距,尤其是在补全功能的实现上面。

    我给作者提了几次 issue, 但是似乎作者不愿意讨论相关问题,所以记录在此,以供诸位 vim 用户参考、讨论。

    LCN 补全中存在的问题

    如何解决?

    问题根源在与 neovim/vim 提供的 complete 功能无法支持 LSP 中的 TextEdit 以及 snippet 等定义,所以我提了一个需求 https://github.com/neovim/neovim/issues/8334

    第 1 条附言  ·  2018-05-03 21:10:09 +08:00
    2018-5-3 额外再补充两个补全方面的实现错误:

    LanguageClient#complete 方法绑定 vim 原生 omnifunc 选项使用时会发现压根没法用,因为 LCN 为了照顾 deoplete 使用了错误了起始位置(单词开始),并且自己没有实现任何结果筛选。
    LCN 的 deoplete 插件实现中使用了全局变量保存异步返回的补全项而不是异步回调,这会导致连续请求时有时会得到之前请求的结果,而不是现在需要的。这个不能全怪 LCN,主要还是由于 deoplete 不支持 vim 扩展。
    15 条回复    2018-07-09 12:57:21 +08:00
    congeec
        1
    congeec  
       2018-05-01 02:17:11 +08:00 via iPhone
    所以要作为 source 陪 deoplete 之类的用
    不过 deoplete 体验不如 ycm 前端
    autozimu
        2
    autozimu  
       2018-05-01 05:53:58 +08:00   ❤️ 3
    并不是我不想讨论这些问题. 而是在你了解具体问题的复杂性之前讨论并不能解决问题. 再者, talk is cheap. 我的时间很有限, 不想把它浪费在无谓的争论上.

    1. 这么做是有原因的. 因为的确部分用户(包括我)通过一些个设置是能够利用 snippet 的功能的. https://github.com/autozimu/LanguageClient-neovim/pull/327 而且我也加入了最新的 configuration override 这个检测.

    2. 推荐你去尝试了解下 deoplete 整个的 workflow, 重点 deoplete 什么情况下触发 completion. 在用到这个 regex 的时候, 根本还没有 LSP server 的 response, 何谈根据 LSP response 判断起点. `\ w` 只是目前的一个权宜之计.

    3. 同 2

    4. 这个是因为 deoplete 并不理解 LSP 的 TextEdit 概念. deoplete 期望收到的是 word, 而某些 LSP server 返回的是 TextEdit, 所以需要这一步的装换. comment 里面我也写到了, extremely hacky. 如果你发现了某些情况下这个 hack 会有问题, 当然欢迎你的 PR, 但不是这种会造成 regression 的 https://github.com/autozimu/LanguageClient-neovim/issues/409

    我再重复一遍, 我的时间有限, 不想浪费在讨论和争论上. Show me your code.
    yuuko
        3
    yuuko  
       2018-05-01 06:32:18 +08:00 via Android
    目前的 vim/neovim 上 lsp 体验不好,还是等 neovim 官方支持,不过貌似还要很长时间
    muziki
        4
    muziki  
       2018-05-01 06:50:06 +08:00 via iPhone
    ale
    试过 lcn 这个插件 用了 ale 之后就回不去了
    hanxiV2EX
        5
    hanxiV2EX  
       2018-05-01 09:14:30 +08:00 via Android
    NCM 怎么样?
    congeec
        6
    congeec  
       2018-05-01 09:14:43 +08:00 via iPhone   ❤️ 1
    开源嘛,能动手就不逼逼
    skywind3000
        7
    skywind3000  
       2018-05-01 12:56:11 +08:00
    @autozimu 快支持一下引用结果添加到 quickfix 窗口,我正在帮你的 LanguageClient-neovim 写评测呢。
    congeec
        8
    congeec  
       2018-05-01 13:00:51 +08:00 via iPhone
    @hanxiV2EX 作者没精力维护 @roxma。基本凉了
    7jmS8834H50s975y
        9
    7jmS8834H50s975y  
       2018-05-01 13:12:42 +08:00
    关于 lsp 的支持,我个人觉得还是等 neovim 的官方 PR 比较合适,我已经本地测试过这个 PR,基本能完成正常补全。

    https://github.com/neovim/neovim/pull/6856
    glues
        10
    glues  
       2018-05-01 16:06:23 +08:00 via iPhone
    这不正是自己造轮子的好机会吗
    omph
        11
    omph  
       2018-05-01 18:09:09 +08:00
    作为一个旁观者,我想说,neovim 有时中文乱码
    chemzqm
        12
    chemzqm  
    OP
       2018-05-02 00:31:56 +08:00
    @autozimu 我只是想让更多感兴趣的人能了解这里存在的问题,已避免浪费过多时间。
    解决办法已经有了,我正在实现

    @glues 说的很对,是时候出现一个支持 text edit 和 snippet 的补全插件了
    chemzqm
        13
    chemzqm  
    OP
       2018-05-02 00:41:33 +08:00
    @wsdjeg 就是不知道啥时候能 merge,而且也是不支持 text edit 和 snippet 这些 LSP 2.0 的东西,LCN 除了补全有些问题,其它功能例如 hover,signature,diagnostic 还是比较好用的。
    chemzqm
        14
    chemzqm  
    OP
       2018-05-02 00:51:07 +08:00
    @autozimu
    > 1. 这么做是有原因的. 因为的确部分用户(包括我)通过一些个设置是能够利用 snippet 的功能的. https://github.com/autozimu/LanguageClient-neovim/pull/327 而且我也加入了最新的 configuration override 这个检测.
    你说的能利用是让 complete item 里面的 word 对应到自己创建 snippet 然后再通过特定快捷键触发补全吧?这种无视后端返回数据然后嫁接到自己实现的东西都不出 bug ?
    pony279
        15
    pony279  
       2018-07-09 12:57:21 +08:00   ❤️ 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1339 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:11 · PVG 01:11 · LAX 09:11 · JFK 12:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.