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

2018-07-09 11:33:30 +08:00
 chemzqm

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

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

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

已内置 source 列表

有待改进的地方

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

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

coc.nvim 安装方法

配置 vim 补全

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

12053 次点击
所在节点    Vim
27 条回复
skt041959
2018-07-09 16:57:34 +08:00
emmmm....又一个 LSP client for neovim。赞赏一下楼主造轮子的速度和行动力……

不知道测试过哪些 server ?
chemzqm
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
2018-07-09 20:31:06 +08:00
> 不知道测试过哪些 server ?

使用的 code 与 VSCode 基本一致(部分功能被阉割)理论上只要 VSCode 能支持的,coc 就肯定可以支持。
coc 实现了 VSCode 一部分接口,可以轻松的移植 VSCdoe 的 language server 插件。
后续文章会有更详细的介绍。
lancelock
2018-07-10 09:25:26 +08:00
vim 的补全我还是没怎么弄明白,一直想试试的,不过配置太麻烦了。我现在用的 deoplete,目前的补全就是 snippet 和文件内已经存在的单词可以补全,但是怎么实现分析代码结构的功能,就是比如我一个实例,怎样能够输入实例的名称后再输入点号,能够提示出属性和方法呢?
lancelock
2018-07-10 09:27:39 +08:00
@lancelock 还有调用方法,怎么能提示参数列表?
yuuko
2018-07-10 23:01:04 +08:00
支持,看着很棒,有时间试试
yuuko
2018-07-10 23:58:55 +08:00
试了一下,可以说很棒了,就是不知道参数不全后怎么跳转下个参数?
chemzqm
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
2018-07-11 13:08:27 +08:00
@chemzqm 我装好了,为什么没有效果啊?要设置什么吗?
chemzqm
2018-07-11 13:18:39 +08:00
@lancelock 补全功能不需要设置的,没效果就说明没装好 https://github.com/neoclide/coc.nvim/wiki/Install-coc.nvim
lancelock
2018-07-11 13:38:36 +08:00
我装好了,checkhealth 没问题。我又试了下 css、html 之类的可以,但是 js、py 之类的不支持吗?另外还需要装别的插件吗?好像不能 snippet
chemzqm
2018-07-11 17:21:50 +08:00
@lancelock 需要 <c-y> 确认(建议绑定到 <cr>) snippet 才会生效。
js 默认应该就可以的,自带的 tsserver,py 后续会加,现在可以通过配置文件添加,不过这块还没有文档。
lancelock
2018-07-13 07:02:27 +08:00
@chemzqm 我打开 js 文件都报这个 "Local tsserver not found, Falling back to global TypeScript version" 。另外支持 vim8 吗?
chemzqm
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
2018-07-14 01:33:13 +08:00
@chemzqm 一定要 ts ?我用 vscode 普通的 js 单文件都可以补全的啊。
chemzqm
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
2018-07-15 10:28:55 +08:00
在选择了一个提示或者没有提示之后,删除字符,一直删都不会有提示了,不知道是不是这么设计的
chemzqm
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
2018-07-16 12:51:43 +08:00
如果支持 vim 就好了。
leoatchina
2018-07-23 10:46:24 +08:00
如何支持 python 呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/469214

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX