正则表达式不在vim配置文件中工作

时间:2011-11-12 22:33:43

标签: vim

我的一个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。谢谢

1 个答案:

答案 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进入插入模式,覆盖早期的虚拟角色