无需插件实现Vim匹配括号自动删除的方法咨询
无需插件实现Vim匹配括号自动删除的方法咨询
嘿,你手动配置自动补全括号的思路挺棒的,不用插件确实更轻量!针对你想自动删除匹配括号的需求,我这儿有个纯Vimscript的方案,完全不用装插件就能实现,刚好适配你现有的自动补全设置。
首先,你已经配置了插入模式下的自动补全括号映射:
inoremap { {}<Esc>ha inoremap ( ()<Esc>ha inoremap [ []<Esc>ha inoremap " ""<Esc>ha inoremap ' ''<Esc>ha inoremap ` ``<Esc>ha
接下来要实现的是:当你在插入模式下按退格键时,如果当前光标位于空的匹配括号/引号中间,就同时删除左右两个符号;如果括号中间已经有内容了,就只删除当前光标前的字符。
实现步骤:
- 先定义一个Vim函数,用来判断当前场景是否需要删除匹配符号:
function! DeleteMatchingBrace() let current_line = getline('.') let cursor_col = col('.') " 逐一检查各类配对符号的空场景 if cursor_col > 1 && cursor_col <= len(current_line) let left_char = current_line[cursor_col - 2] let right_char = current_line[cursor_col - 1] if (left_char == '{' && right_char == '}') || \ (left_char == '(' && right_char == ')') || \ (left_char == '[' && right_char == ']') || \ (left_char == '"' && right_char == '"') || \ (left_char == "'" && right_char == "'") || \ (left_char == '`' && right_char == '`') return "\<BS>\<Del>" " 同时删除左符号(退格)和右符号(删除) endif endif " 不是空配对场景,只执行普通退格 return "\<BS>" endfunction
- 把退格键映射到这个函数上,替换原来的默认退格行为:
inoremap <BS> <C-r>=DeleteMatchingBrace()<CR>
把这些内容添加到你的~/.vimrc(或者Neovim的~/.config/nvim/init.vim)里,重启Vim就生效了。
效果说明:
- 当你输入
{自动补全成{}并光标在中间时,按退格键会直接删掉整个{}; - 如果已经在括号里输入了内容(比如
{hello}),光标在hello后面按退格,只会删掉最后一个字符,不会动右括号; - 引号、反引号的逻辑和括号完全一致,完美适配你原来的配置。
备注:内容来源于stack exchange,提问作者astrocat
相关产品推荐
相关产品推荐

