coc.nvim 插件体系 - 介绍

2019-05-13 02:45:48 +08:00
 chemzqm

coc.nvim 不仅提供了完整了 LSP 功能支持,甚至提供了加载插件的能力。

做为一个可以加载插件的 vim 插件,很多人不是太理解,本文来做一些简单的介绍。

起因

最主要的原因是仅有 LSP 支持无法实现像 VSCode 插件那样完整的功能。举一些例子:

coc 插件的开发优势

总体来讲,如果你的需求相对比较简单,还是使用 viml 开发最为有效,如果你想弄一些复杂点的功能同时又对 javascript/typescript 比较了解,可以考虑基于 coc 开发。相比传统的 viml 以及 python 插件,coc 插件有自己的优势。

现有的非 LSP 插件

如果你不清楚 coc 插件是否可以取代某个插件,我个人建议看一下插件文档, 如果没有你特别想用的功能或者你要用的功能它没有那就没必要换(也可以提 feature request )。

一个简单的例子

例如我们想请求 lbdbq 里面的 email 列表用来做 email 补全。

首先找到配置的根目录,使用命令 :echo coc#util#get_config_home(), 通常结果是 ~/.vim, 在该目录下执行 mkdir coc-extensions && touch address.js 创建 coc-extensions 文件夹以及 address.js 文件。

在 address.js 文件内加入:

const {sources} = require('coc.nvim')
const {spawn} = require('child_process')
const readline = require('readline')

exports.activate = async context => {
  context.subscriptions.push(
    sources.createSource({
      // 唯一 id
      name: 'notmuch',
      // 用于 menu
      shortcut: 'address',
      // 指定 filetype
      filetypes: ['mail'],
      // 仅在触发条件满足时触发
      triggerOnly: true,
      priority: 99,
      triggerPatterns: [
        /^(Bcc|Cc|From|Reply-To|To):\s*/,
        /^(Bcc|Cc|From|Reply-To|To):.*,\s*/
      ],
      doComplete: async function(opt) {
        let matches = await getAddresses(opt.input)
        return {
          items: matches.map(m => {
            return {
              word: `${m[1]} <${m[0]}>`,
              abbr: `${m[0]} ${m[1]}`,
              filterText: `${m[0]} ${m[1]}`,
              menu: this.menu
            }
          })
        }
      }
    })
  )
}

async function getAddresses(input) {
  let result = []
  return new Promise((resolve, reject) => {
    const p = spawn('lbdbq', [input])
    const rl = readline.createInterface(p.stdout)
    p.on('error', reject)
    rl.on('line', line => {
      if (line.startsWith('lbdbq:')) return
      let [email, name] = line.split('\t')
      result.push([email, name])
    })
    rl.on('close', () => {
      resolve(result)
    })
  })
}

coc-extensions 目录下的所有 js 文件都会被 coc 当作插件加载,暂时无法支持 package.json 配置。


下一篇介绍 CocList, 一个和 fzf 一样快同时像 denite.nvim 一样强大的列表功能。

支持 coc.nvim 请扫描项目主页最下方二维码,同时获取更多支持者福利。

转发 CSDN 按侵权追究法律责任,其它情况随意。

6805 次点击
所在节点    Vim
8 条回复
BBCCBB
2019-05-13 08:17:54 +08:00
楼主厉害了
Yggdroot
2019-05-13 08:52:14 +08:00
最后一句话 why ?
yujincheng08
2019-05-13 09:32:09 +08:00
滋磁作者。我现在长期实用的就是 coc+clangd 了😁
wweir
2019-05-13 09:58:04 +08:00
@BBCCBB 头像右上角的黑点,搞得我还以为屏幕脏了呢🥴
yuuko
2019-05-13 12:03:16 +08:00
滋瓷
chemzqm
2019-05-13 20:23:51 +08:00
BBCCBB
2019-05-19 10:43:39 +08:00
楼主,请问 go 的话怎样在补全后为方法自动加括号呢?
chemzqm
2019-05-20 22:09:59 +08:00
@BBCCBB 需要 languageserver 提供这个支持

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

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

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

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

© 2021 V2EX