我的一个ftplugin文件中有以下正则表达式,其目的是在按下回车键后用空格分隔赋值运算符:
inoremap <CR> <Esc>:s/\s*\([=+!-]\?=\)\s*/ \1 /ge<CR>:noh<CR>o
适用于=,==,!=,+ =, - =。到目前为止,这部分似乎完美无瑕。当我按如下方式修改此正则表达式以分隔比较运算符时,会出现问题:
inoremap <CR> <Esc>:s/\s*\([=+!-]\?=\|[><]=\?\)\s*/ \1 /ge<CR>:noh<CR>o
在此更改之后,分配和比较运算符都不再匹配(没有错误,没有任何反应)。但是,在vim中搜索这个新模式会直接突出显示所有这些模式。我不确定问题是否是由于&lt;和&gt;作为.vim文件中的特殊字符(用于&lt; CR&gt;等),我尝试用\来转义它们,但这似乎没有帮助。此外,当我将它们放在与其他操作符相同的块中时,它们工作正常:
inoremap <CR> <Esc>:s/\s*\([=+!-><]\?=\)\s*/ \1 /ge<CR>:noh<CR>o
然而,在这种情况下唯一的问题是,如果我输入类似x&lt; y的东西,它就不会在那里插入空格,因为没有等号(并且如果我使等号可选,它将强制所有+ / - /!运算符,我真的不想要,因为我有时想用它们来使分组更明显(.ie x = (a+b+c+d+e+f) - (g+h+i)
而不是x = (a + b + c + d + e + f) - (g + h + i)
)。同样,我不是希望我的否定看起来像if( ! (statement) ...
。我做错了什么?另外,我正在使用vim 7.2.245。谢谢
答案 0 :(得分:1)
尝试在正则表达式中专门指定magic
的数量:
inoremap <CR> <CR>a<Esc>mz:-1s/\v\s*([=+!-<>]?\=\|[<>])\s*/ \1 /ge<CR>:nohls<CR>`zcl
另请注意,我使用 C-o 从插入模式发出替换
击穿
<CR>a
正常执行 Enter ,插入一个虚拟角色('a'
)<Esc>
离开插入模式mz
将光标位置保存在寄存器z
:-1s/\v.../.../g
-1
)使用 上的very-magic
执行全局替换
:nohls<CR>
隐藏搜索突出显示`z
恢复已保存的光标位置cl
进入插入模式,覆盖早期的虚拟角色