Vim
首发于Vim

CocList 入坑指南

CocList 是 coc.nvim 插件自带的列表管理模块。

coc.nvim 插件自带了 location,diagnostics, extensions 等 coc.nvim 使用的列表。可以安装其它 coc 插件,例如 coc-list 来提供更多的列表, 包括 files, mru, grep 等等。

使用命令 :h coc-list 查看详细文档。

为什么自带列表功能?

起初 coc.nvim 的列表是由 denite.nvim 插件来提供的, 使用上并没有什么问题,只是 denite.nvim 有 python 等依赖, 另外性能上时常也不太理想,很多用户并不想安装它。

fzf.vim 也能提供自定义列表支持,但是 fzf 功能有些太弱,例如不支持多模式,无法支持 interactive 模式等等,而且 fzf 列表难免使用一些 shell 命令,可能在 windows 或其他系统上无法工作。

基本操作

至少有三种方式打开 CocList。

  • 执行命令 :CocList, 然后使用 <cr> 打开选中列表。
  • 执行命令 :CocList, 输入 <space>, 输入 <tab> 补全列表名称和列表选项。
  • 绑定快捷键方式执行 :CocList 命令,例如:
nnoremap <silent> <space>g :<C-u>CocList --normal gstatus<CR>

使用 <C-o> 从插入模式切换到正常模式, 使用 io 从正常模式切换到插入模式。

插入模式下默认使用 <C-j><C-k> 上下移动光标,默认支持 emacs 按键 方式操作来快速编辑提示, 详情查看 :h coc-list-mappings.

使用 <tab> 来调出可操作菜单,常用操作建议使用配置文件进行按键绑定,查看 :h coc-list-mappings-custom.

任何模式下使用 <esc> 都将取消列表。

特色功能

CocList 不仅借鉴了 denite.nvim 灵活的多模式编辑功能,同时提供了一些增强功能:

实时预览

光标移动后自动刷新预览窗口,支持指定区间以及高亮。

模糊排序算法改进,fzy + mru

默认使用 fzy 进行模糊排序,fzy 评分相同时使用内置 mru 列表排序,更快找到你想要的匹配项。

Interactive 模式

所谓 interactive 模式就是输入改变时重新请求列表,过滤由后端任务完成,而不是用户的输入。

例如 symbols 列表在 LSP 标准里是由 language server 实现的过滤:

使用 interactive grep:

Ansi code 解析,动态高亮

CocList 支持使用 vim 的 syntax 实现高亮,但是该方式列表数量过大会造成严重卡顿, 此时可使用 ansi code 添加高亮,ansi code 高亮将被解析为 vim 的高亮, 同时仅在需要时发送给 vim 进行高亮,通过该方式高亮,即便列表有几万行都不会卡。

轻松查看 neovim 项目将近 2w 次的提交:

解析 ansi code 的额外好处:

  • 相比 vim 的正则容易写
  • 更为精准

自由的正常模式

相比 denite 的正常模式,CocList 不需要任何额外设置,同时支持 visual 模式。

多选

正常模式使用 <space> 可以切换当前行的选中状态,执行命令时将使用所有选中行。 也可以使用 visual 模式多选,然后使用 <tab> 执行选定操作。

数字选择

通过启用 --number-select 选项,可在插入模式在直接输入 1 ~ 9 快速跳转到对应行并执行默认操作。

推荐添加到默认选项,例如:

"list.source.files.defaultOptions": ["--number-select"],

多过滤模式

CocList 支持 fuzzy strict 以及 regex 三种过滤模式。默认是 fuzzy, 可以通过选项指定为 strict 或者 regex

插入模式使用 <c-s> 可切换为不同模式。

过滤对于 interactive 模式无效,因为此时过滤是由后台任务完成的。

快速跳转

对于包含地址的列表,会有跳到上/下一个地址这样的需要,CocList 提供了 :CocNext 以及 :CocPrev 来快速执行上/下一项的默认操作, 也可通过 :CocListResume 命令重新打开上一次列表。

通常这些命令绑定快捷键会更好用一些,例如:

nnoremap <silent> <space>j  :<C-u>CocNext<CR>
nnoremap <silent> <space>k  :<C-u>CocPrev<CR>
nnoremap <silent> <space>p  :<C-u>CocListResume<CR>

历史记录支持

就像 shell 一样,coc.nvim 记录了历史使用过的输入列表,默认使用 <C-n><C-p> 来切换,可以省去重复输入的麻烦。

鼠标支持

  • 使用鼠标拖拽可以实现多选操作。
  • 鼠标单击让光标移动到指定行。
  • 鼠标双击执行指定行默认操作。

建议还是避免使用鼠标。

已知问题

  • vim 上启动会有较高延迟
  • gvim 上部分操作例如上下移动无法工作

如果你有其它需求欢迎留言,如果有 coc.nvim 相关问题,请到 gitter 咨询。

编辑于 2019-07-02

文章被以下专栏收录

    最前沿的Vim资讯,实用的Vim配置技巧,操作技巧,插件推荐.