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

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

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

    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 插件。
    后续文章会有更详细的介绍。
    lancelock
        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   ·   我们的愿景   ·   实用小工具   ·   1064 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:06 · PVG 03:06 · LAX 12:06 · JFK 15:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.