起因
输入模式下,成对符号的自动补全一直是比较常用的功能。使用了很多年 delimitMate ,
基本功能正常,但是偶尔会出现卡屏现象,等一段时间或者按下 ctrl-c
可以结束卡屏,但是会输入很多个 <Plug>delimitMate(
。
但是这一现象并无法百分百重现。
想着这么多年过去了,会不会有新的更好用的插件,于是搜了下,目前已知的括号补全插件有:
- delimitMate
- neopairs.vim:需要
exists('#CompleteDone') == 1
- nvim-autopairs:需要 Neovim 0.7.0+
- mini.pairs
- auto-pairs
- autoclose.nvim
- ultimate-autopair.nvim
实现逻辑及功能比较
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.nvim、mini.pairs。 因为 mini.nvim 仓库实际上是由几十个独立插件组合而成,其 Issues 跟 pull requests 列表应对到 mini.pairs 上到底有多少,无法评估。
auto-pairs 有一个较活跃的 fork 版本LunarWatcher/auto-pairs,目前维护状态正常: