Coc.nvim: 为了更好的补全体验 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chemzqm
V2EX    Vim

Coc.nvim: 为了更好的补全体验

  •  1
     
  •   chemzqm 2018-07-09 11:33:30 +08:00 12706 次点击
    这是一个创建于 2720 天前的主题,其中的信息可能已经有所发展或是发生改变。

    coc.nvim 是一款针对 neovim 所开发的智能感知插件,设计目标是基于微软的 language server protocol 协议,为用户提供全面、可靠的智能感知体验。

    鉴于智能补全算是智能感知当中最重要的部分,本文就先来介绍一下 coc 里面的补全功能。

    • 多种触发方式同时支持手工触发。默认使用 always 自动模式表示输入单词首字母以及 trigger character 时触发补全,可配置为 trigger 模式,表示仅在输入 trigger character 时触发,或者配置为 none,表示禁用自动触发。任何触发模式下都可使用绑定的快捷键进行手工触发。
    • **模糊匹配,智能大小写。**同 YCM 等知名插件。
    • 多 source 异步**并发获取。**同时异步获取不同 source 结果,效率更高。
    • **支持用户自定义 source。**可通过编写 viml 插件实现自定义 source, 自定义补全 source 文档
    • Source 管理功能。 使用命令 :Denite source 查看当前 buffer 使用 source 列表,默认回车操作切换 source 可用状态。
    • 支持通过删除字符纠正错误输入。 为了提高过滤的效率,除非清空当前过滤字符,否则删除过多的字符不会导致补全停止,而是触发一次针对已有补全缓存的重新过滤。
    • 尊重用户 completeopt 配置。 coc 会在补全开始后将 completeopt 设置为 menuone,noselect,noinsert 补全完成后重置初始设置,原因是使用 vim 自带的补全时,很多用户更青睐使用 menu,preview 来做为 completeopt (因为 vim 本身的补全过滤并不支持模糊匹配)。
    • 支持 language server 返回的 triggerCharacters 作为触发字符。
    • 支持 completion resolve 请求。用户选中 complete item 后向 server 请求详细数据,通常用做请求文档以及 textEdit 等字段。
    • 支持 LSP 补全项中的 sortText,filterText 以及 insertText 字段
    • 支持 LSP 补全项完成后续操作,包含 textEdit,additinalTextEdit 以及 command。
    • 支持 snippet 类型补全。coc 实现了 LSP 中定义的 snippet (包含 choice 功能),无需额外安装插件,且在确认补全时自动触发。

    snippet 参数补全同时通过 additinalTextEdit 插入 import

    已内置 source 列表

    • around - 当前 buffer 单词列表
    • buffer - 所有正常 buffer 单词列表
    • dictionary - ‘ dictionary ’ 选项文件内单词列表
    • tag - tag 文件单词列表
    • file - 文件路径补全
    • omni - 调用 ’ omnifunc ‘ 函数提供补全
    • word - google 10000 单词列表
    • emoji - emoji 字符表情
    • include - 文件引用路径补全
    • ultisnips - 代码块 ultisnips 补全
    • neco - 使用 neco-vim 进行 viml 补全

    有待改进的地方

    neovim 的 remote 插件确实不那么容易安装,对此我暂时也没想到好的办法,或许将来 deno 可以解决。

    项目使用微软设计并开源的 typescript 进行开发并且借鉴了微软 VSCode 部分设计,同时使用了相当数量的微软代码以及微软提供的 node 模块,在此要特别感谢微软对于开源的大力支持。

    coc.nvim 安装方法

    配置 vim 补全

    coc.nvim 的基本功能已经就绪,文档部分还有所欠缺,欢迎体验~

    第 1 条附言    2018-07-27 19:25:38 +08:00
    支持 vim 了
    27 条回复    2019-01-11 20:47:01 +08:00
    skt041959
        1
    skt041959  
       2018-07-09 16:57:34 +08:00
    emmmm....又一个 LSP client for neovim。赞赏一下楼主造轮子的速度和行动力……

    不知道测试过哪些 server ?
    chemzqm
        2
    chemzqm  
    OP
       2018-07-09 20:28:17 +08:00
    @skt041959 我对 coc 定位不是轮子,它是为追求极致开发体验的开发者创造的产品。

    coc 已经内置的 language 服务包含:tsserver,css(可支持 css less scss wxss),html,json,stylelint,tslint,wxml,solargraph。内置服务无需额外安装配置即可使用,另外使用 node-ipc 通讯方式通讯效率更高,也很容易使用 Chrome devtools 等工具调试。
    chemzqm
        3
    chemzqm  
    OP
       2018-07-09 20:31:06 +08:00
    > 不知道测试过哪些 server ?

    使用的 code 与 VSCode 基本一致(部分功能被阉割)理论上只要 VSCode 能支持的,coc 就肯定可以支持。
    coc 实现了 VSCode 一部分接口,可以轻松的移植 VSCdoe 的 language server 插件。
    后续文章会有更详细的介绍。
        4
    lancelock  
       2018-07-10 09:25:26 +08:00
    vim 的补全我还是没怎么弄明白,一直想试试的,不过配置太麻烦了。我现在用的 deoplete,目前的补全就是 snippet 和文件内已经存在的单词可以补全,但是怎么实现分析代码结构的功能,就是比如我一个实例,怎样能够输入实例的名称后再输入点号,能够提示出属性和方法呢?
    lancelock
        5
    lancelock  
       2018-07-10 09:27:39 +08:00
    @lancelock 还有调用方法,怎么能提示参数列表?
    yuuko
        6
    yuuko  
       2018-07-10 23:01:04 +08:00 via Android
    支持,看着很棒,有时间试试
    yuuko
        7
    yuuko  
       2018-07-10 23:58:55 +08:00
    试了一下,可以说很棒了,就是不知道参数不全后怎么跳转下个参数?
    chemzqm
        8
    chemzqm  
    OP
       2018-07-11 08:54:34 +08:00
    @lancelock coc 里面没有也不需要 deoplete 搞的那些麻烦配置,无需配置就可以良好工作的。

    > 但是怎么实现分析代码结构的功能,就是比如我一个实例,怎样能够输入实例的名称后再输入点号,能够提示出属性和方法呢?

    这个是 language server 实现的事情,用户和客户端不用操心。


    @yuuko https://github.com/neoclide/coc.nvim/blob/788df1eb26bca4b81628f44f375b0610499acc09/doc/coc.txt#L162 文档里有的,默认 <c-j> 和 <c-k>
    lancelock
        9
    lancelock  
       2018-07-11 13:08:27 +08:00
    @chemzqm 我装好了,为什么没有效果啊?要设置什么吗?
    chemzqm
        10
    chemzqm  
    OP
       2018-07-11 13:18:39 +08:00
    @lancelock 补全功能不需要设置的,没效果就说明没装好 https://github.com/neoclide/coc.nvim/wiki/Install-coc.nvim
    lancelock
        11
    lancelock  
       2018-07-11 13:38:36 +08:00
    我装好了,checkhealth 没问题。我又试了下 css、html 之类的可以,但是 js、py 之类的不支持吗?另外还需要装别的插件吗?好像不能 snippet
    chemzqm
        12
    chemzqm  
    OP
       2018-07-11 17:21:50 +08:00
    @lancelock 需要 <c-y> 确认(建议绑定到 <cr>) snippet 才会生效。
    js 默认应该就可以的,自带的 tsserver,py 后续会加,现在可以通过配置文件添加,不过这块还没有文档。
    lancelock
        13
    lancelock  
       2018-07-13 07:02:27 +08:00
    @chemzqm 我打开 js 文件都报这个 "Local tsserver not found, Falling back to global TypeScript version" 。另外支持 vim8 吗?
    chemzqm
        14
    chemzqm  
    OP
       2018-07-13 12:41:06 +08:00
    @lancelock "Local tsserver not found, Falling back to global TypeScript version" 这个是正常的,你在项目下 `npm i typescript` 就不会有这个问题了,如果你希望 tsserver 不报错,可能还需要设置 jsconfig.json https://code.visualstudio.com/docs/languages/jsconfig

    vim8 没有 node-client 也没有 buffer-notification,没办法支持。
    lancelock
        15
    lancelock  
       2018-07-14 01:33:13 +08:00
    @chemzqm 一定要 ts ?我用 vscode 普通的 js 单文件都可以补全的啊。
    chemzqm
        16
    chemzqm  
    OP
       2018-07-14 05:24:54 +08:00
    @lancelock 不是啊, "Local tsserver not found, Falling back to global TypeScript version" 只是个提示,功能应该都是正常的。只要有这行 [coc.nvim] service tsserver started 就说明 tsserver 服务可用了
    yuuko
        17
    yuuko  
       2018-07-15 10:28:55 +08:00 via Android
    在选择了一个提示或者没有提示之后,删除字符,一直删都不会有提示了,不知道是不是这么设计的
    chemzqm
        18
    chemzqm  
    OP
       2018-07-15 13:38:16 +08:00
    @yuuko 嗯,vim 是这样的,因为你选择一个提示的时候进入了第二阶段,再输入会在 TextChange 触发之前触发 CompleteDone,这里做判定就非常麻烦了。没有提示会触发 CompleteDone,补全就算结束了,所以删除也没有提示。
    不必过度依赖自动触发,此时可以使用绑定的快捷键:
    ```

    inoremap <silent><expr> <TAB>
    \ pumvisible() ? "\<C-n>" :
    \ <SID>check_back_space() ? "\<TAB>" :
    \ coc#refresh()
    inoremap <silent><expr> <c-space> coc#refresh()

    ```
    Yggdroot
        19
    Yggdroot  
       2018-07-16 12:51:43 +08:00
    如果支持 vim 就好了。
    leoatchina
        20
    leoatchina  
       2018-07-23 10:46:24 +08:00
    如何支持 python 呢?
    chemzqm
        21
    chemzqm  
    OP
       2018-07-23 14:03:08 +08:00
    chemzqm
        22
    chemzqm  
    OP
       2018-07-27 20:11:11 +08:00
    @yuuko 调整了,现在选择完补全项继续输入会触发补全
    yuuko
        23
    yuuko  
       2018-07-28 13:57:23 +08:00
    @chemzqm 已更新,很好用
    leoatchina
        24
    leoatchina  
       2018-08-22 11:11:01 +08:00 via Android
    同事用来写 js 很爽
    lancelock
        25
    lancelock  
       2018-09-01 17:32:27 +08:00
    更新之后我又试了一下,感觉很不错,不过有两个问题很影响体验。
    1. 如果有语法错误左边栏会显示错误标记,导致左边栏忽宽忽窄,整个界面一直在闪烁
    2. 查看补全项的文档会在上方打开一个窗口,很不舒服,可以调成放在下面或者在浮动窗口里显示吗?
    chemzqm
        26
    chemzqm  
    OP
       2018-09-03 08:19:16 +08:00
    @lancelock
    1. 设置 set signcolumn=yes 总是显示 sign 那一列即可
    2. 把 completeopt 里面的 preview 去掉就可以不显示了,这个是 vim 原生的功能,后续会用 Floating window 显示,还在开发
    Marblue
        27
    Marblue  
       2019-01-11 20:47:01 +08:00
    @chemzqm 有中文的文档么 qwq。主要是 go 啊 目前 deoplete。想试试你这个。lsp 的没怎么研究过需要如何配置?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2618 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 13:25 PVG 21:25 LAX 05:25 JFK 08:25
    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