Vim中输入时自动为二元运算符两侧添加空格的方案咨询
我完全懂你的需求——就是要在Vim输入时智能给二元运算符两侧自动补空格,还不能把==、>=这类复合运算符拆成= =、> =这种奇怪的样子。你的临时方案思路对,但没处理复合运算符的优先级和输入时序问题,我给你一套更完善的配置:
核心解决方案
先把复合运算符的映射放在前面(让Vim优先识别),再用一个函数处理单个=的智能补空格逻辑:
" 先定义复合运算符的映射,避免被拆分开(优先触发) inoremap <silent> == == inoremap <silent> >= >= inoremap <silent> <= <= inoremap <silent> != != inoremap <silent> += += inoremap <silent> -= -= inoremap <silent> *= *= inoremap <silent> /= /= " 智能处理单个=的函数 function! MySmartEqual() abort let l:col = col('.') let l:line = getline('.') " 获取光标前一个字符(Vim的col是1-based,字符串是0-based,所以要减2) let l:prev_char = l:col > 1 ? l:line[l:col-2] : '' " 获取光标后一个字符 let l:next_char = l:col <= len(l:line) ? l:line[l:col-1] : '' " 情况1:前面是括号、引号、或复合运算符前缀(比如+、-),直接输入= if l:prev_char =~# '[()\[\]{}''"`<>!+-/*%]' return '=' endif " 情况2:后面已经有=(比如光标在=后输入=),直接输入= if l:next_char ==# '=' return '=' endif " 情况3:根据前面是否有空格,决定补空格的方式 if l:prev_char =~# '\s' return '= ' else return ' = ' endif endfunction " 把=映射到智能函数 inoremap <expr> = MySmartEqual()
工作原理
- 复合运算符优先:当你快速输入
==、>=这类组合时,Vim会触发提前定义的映射,直接输入完整运算符,不会拆分开; - 智能判断上下文:
- 如果
=前面是括号、引号或者其他运算符(比如(、"、+),直接输入=,避免错误补空格; - 如果
=前面没有空格(比如输入A=),自动变成A =;如果前面已经有空格(比如输入A =),自动补成A =;
- 如果
- 兼容输入时序:利用Vim的
timeoutlen(默认1000ms),如果输入第一个=后1秒内没输入第二个字符,就触发智能补空格;如果快速输入第二个=,就直接生成==。
测试场景验证
- 输入
x=y→ 自动变成x = y; - 快速输入
x==y→ 直接得到x==y; - 输入
x>=y→ 直接得到x>=y; - 输入
(x=5)→ 自动变成(x = 5); - 输入
x+=1→ 直接得到x+=1。
扩展到其他运算符
如果想给+、-、*、/也加同样的智能处理,可以用通用函数:
function! MySmartOperator(op) abort let l:col = col('.') let l:line = getline('.') let l:prev_char = l:col > 1 ? l:line[l:col-2] : '' let l:next_char = l:col <= len(l:line) ? l:line[l:col-1] : '' " 处理复合运算符(比如++、--)或前缀运算符情况 if l:prev_char ==# a:op || l:prev_char =~# '[<>!+-/*%]' return a:op endif if l:next_char ==# a:op return a:op endif " 补空格逻辑 if l:prev_char =~# '\s' return a:op . ' ' else return ' ' . a:op . ' ' endif endfunction " 映射其他运算符 inoremap <expr> + MySmartOperator('+') inoremap <expr> - MySmartOperator('-') inoremap <expr> * MySmartOperator('*') inoremap <expr> / MySmartOperator('/')
这个配置应该能完美解决你的需求,你可以把这些代码放到~/.vimrc(或~/.config/nvim/init.vim)里生效。
内容的提问来源于stack exchange,提问作者BaRud
相关产品推荐
相关产品推荐

