LanguageClient-neovim 补全实现的若干问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chemzqm
V2EX    Vim

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

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

    为了体验 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     Solana     989 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 23:35 PVG 07:35 LAX 15:35 JFK 18:35
    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