今天看了一下 coc.nvim 的配置和使用,挺不错的 VIM 插件,记录一下.

我之前也使用到了这个插件,主要是用来做补全的。今天想使用 git blame 功能的时候,又看到了它。想搞搞明白,COC 到底是个什么东西.

什么是 COC

COC 就是一个 VIM 的插件啦。但它是一个管理插件的插件.

和 Plug 不同的是,它只能管理 COC 系列的插件。严格来说,应该算是 COC 的插件吧,应该不能算是 VIM 插件, 我的感觉是这样。因为只能用 COC 来安装,而且是安装在 COC 自己的目录下面的.

COC 系列的插件有不少,除了自动补全外,还有比如 coc-go ,coc-python,coc-git 啥的,可能可以取代 vimgo ,python-mode,vim-fugitive 等插件。作者也说了,用不用 COC 系列插件,还是要看你的需求是什么,看 COC 的插件是不是能满足你的需求,如果不行的话,还可以给作者提需求~~ 反正我是全部使用 COC 插件了,替换掉了 vim-go python-mode 等。使用 coc 插件好处多多,下面有提到。

2021-09-05 补充:

我现在 Python 和 Go 已经都使用 COC 支持下的能力了。不再使用 python-mode,vim-go 这两个插件。不过觉得好怀念,感谢他们。

为什么要换成 COC 的支持呢?对我来说有两点,一个是快捷键的统一,比如说 rename,go to definition,go to implementation 等。另外一个是 LSP 的功能的确更强大一些吧。 这两者配合起来,在 VIM 里面的编程更方便了。

为什么需要它

作者的说法是: 快,稳定,功能全,而且和 VSCode 插件一样好用易用(这一点让我有点诧异,因为我觉得 VIM 插件挺好用啊)

这里需要提一个”功能全”这点,之所以这么说,因为它实现了完全的对LSP的支持。那什么是 LSP 呢?

LSP 是 language-server-protocol

我简单说一下吧(其实我还没有搞懂其中一些细节,比如每种语言的协议是不是一样的,在哪里有具体的定义),在没有 LSP 之前呢,如果我们写 Python 程序,需要编辑器提供各种功能,像补全啊,格式化啊,纠错啊等等。每种编辑器可能都有自己的实现方式.

LSP 呢,提供了一套协议和标准。对补全啊等等功能放在 Server(不是 HTTP Server 啊) 这里,client 通过标准统一的接口去 server 取得结果。这样一个 server 实现之后,所有的工作,不管是 Vscode,还是 Vim,或者其他工具,都可以方便的使用这个 Server 来接口.

而且 LSP 发展很快,我看 Python 已经有三个实现了.

安装使用

Coc 安装使用挺简单,Readme 里面都有说,我这里就略过吧.

使用 COC 来做编程语言的支持,有两种方式,一种是安装相应的插件,比如 Python 里面的 coc-pyright

另外一种是配置一下 languageserver,比如:

{
  "languageserver": {
    "go": {
      "command": "gopls",
      "rootPatterns": ["go.mod"],
      "trace.server": "verbose",
      "filetypes": ["go"]
    }
  }
}

COC-List

最后需要提一下COC-List,coc 主页上面专门提到了它,看来作者应该也觉得这是一个挺好,而且重要的功能.

很多时候呢,我们需要对一个列表进行操作,比如 buffers 列表,我们可能需要选中,删除等操作。但是 VIM 自带的 buffers 列表功能太单一了,就是展示出来,也不能过滤搜索。还有其他一些列表(比如marks) 也是如此,还有一些没有列表,像 searchhistory

COC-List 就是增强了列表的功能,可以方便的搜索了了。

而且还提供了丰富的列表,见https://github.com/neoclide/coc-lists

你可以像下面这样定义自己的 Mapping,nnoremap <silent> <space>w :exe 'CocList -I --normal --input='.expand('<cword>').' words'<CR>
而且一些其他的插件,像 coc-git,利用 CocList 提供了一些它自己的列表功能,可以使用 Coc-List 来做展示。