Eric's Blog 时光荏苒,岁月如梭

(Neo)Vim 括号补全插件比较

2024-06-27
Eric Wong

起因

输入模式下,成对符号的自动补全一直是比较常用的功能。使用了很多年 delimitMate , 基本功能正常,但是偶尔会出现卡屏现象,等一段时间或者按下 ctrl-c 可以结束卡屏,但是会输入很多个 <Plug>delimitMate( 。 但是这一现象并无法百分百重现。

想着这么多年过去了,会不会有新的更好用的插件,于是搜了下,目前已知的括号补全插件有:

实现逻辑及功能比较

auto-pairs

仓库中 Vim 脚本只有 plugin/auto-pairs.vim (673 行)。 监听 BufEnter 事件,映射 g:AutoPairs 所设定的成对符号。

neopairs.vim

通过监听 CompleteDone 事件,判断补全 item 的结尾是否匹配设定的成对符号。

nvim-autopairs

是使用 Lua 实现的 Neovim 插件。在 nvim-autopairs.setup 函数里使用以下三组事件监听来实现补全。

local group = api.nvim_create_augroup('autopairs_buf', { clear = true })
api.nvim_create_autocmd({ 'BufEnter', 'BufWinEnter' }, {
  --- M.on_attach
})
api.nvim_create_autocmd('BufDelete', {
  ---
})
api.nvim_create_autocmd('FileType', {
  ---
})

M.on_attach 函数里,主要有一个 expr 映射及一个 InsertCharPre 事件监听:

local enable_insert_auto = false -- 初始化是否插入的 flag
local expr_map = function(key)
    api.nvim_buf_set_keymap(bufnr, 'i', key, '', {
      expr = true
      --- 设定 expr 映射
    })
end
for _, rule in pairs(rules) do
   -- 根据每个规则映射快捷键,并计算是 enable_insert_auto 值
end
if enable_insert_auto then
    api.nvim_create_autocmd('InsertCharPre', {
      --- 如果 enable_insert_auto 为 true, 则监听 InsertCharPre 事件
    })
end

维护状态

repo Github stars Issues pull requests last commit
auto-pairs 4.1k 138 Open / 155 Closed 27 Open / 53 Closed Feb 27, 2019
delimitMate 2k 47 Open / 219 Closed 5 Open / 36 Closed Dec 14, 2020
nvim-autopairs 3k 12 Open / 287 Closed 1 Open / 157 Closed May 20 2024
neopairs.vim 31 0 Open / 4 Closed 0 Open / 0 Closed Mar 16, 2016

mini.pairs 仓库有2个:mini.nvimmini.pairs。 因为 mini.nvim 仓库实际上是由几十个独立插件组合而成,其 Issues 跟 pull requests 列表应对到 mini.pairs 上到底有多少,无法评估。

auto-pairs 有一个较活跃的 fork 版本LunarWatcher/auto-pairs,目前维护状态正常:


延生阅读

分享到:

评论

目前只支持使用邮件参与评论。