Vim映射中花括号去空格双替换命令仅执行第一个的问题
问题原因与解决方法
错误原因
你在映射里使用的|没有转义,Vim会把它当作当前命令的结束标记,只执行第一个替换命令:%s/{ {/{{/g,剩下的%s/} }/}}/g不会被触发执行。
在Vim命令行中直接输入时,|可以正常作为命令分隔符,但在映射、缩写或者:execute这类场景下,|需要转义为\|才能生效。
修正后的映射
把映射里的|替换为\|即可:
noremap <leader>cb :%s/{ {/{{/g \| %s/} }/}}/g <CR>
更高效的优化方案
你可以用单个正则替换命令同时处理左右花括号的空格问题,减少命令执行次数:
noremap <leader>cb :%s/\v\{ \{\| \} \}/\=submatch(0) =~# '\{' ? '{{' : '}}'/g <CR>
或者用更直观的简化写法(借助Vim的very magic模式简化正则):
noremap <leader>cb :%s/\v(\{)\s+(\{)|\s+(\})\s+(\})/\1\2\3\4/g <CR>
内容的提问来源于stack exchange,提问作者greg hor
相关产品推荐
相关产品推荐

