0

我正在尝试定义一个运算符挂起的映射(使用)来匹配上一个和下一个onoremap之间的所有文本。这是在 css 文件中使用的,因此我可以轻松地删除、更改或复制规则。{}ir

我使用了“Learn vimscript the hard way”中使用的语法,它是execute和的组合normal。我一直无法做的是在我上次搜索后清除突出显示搜索。使用映射后,}文件中的所有内容都会突出显示。

到目前为止,这就是我得到的:

au Filetype css noremap <buffer> ir :<C-U>execute "normal! ?{\rjV/}\rk"<CR>

我知道我需要打电话:nohlsearch,但我不知道如何将其放入映射中。映射导致文本被视觉选择,因此当 :nohlsearch被调用时,它将应用于选择,这不起作用。

我需要一种清除'<,'>标记的方法,但我找不到如何 <C-U>normal命令中编写以使其正确执行。另一种方法可能是离开可视模式,执行:nohlsearch然后重新选择最后选择的文本gv,但即使这样我也找不到如何<Esc>在我的normal语句中编写。

4

1 回答 1

3

在这种特殊情况下,使用类似的东西可能更容易:

au Filetype css noremap <buffer> ir :<C-U>call search('{', 'Wb')\|call search('}', 'Ws')\|normal! v''<CR>

请注意,这是您的示例所做的,而不是正确的事情。例如,嵌套大括号将无法正确处理。

调用不带 's' 标志的搜索函数不会设置任何标记或更改搜索寄存器,因此您无需重置任何内容。

请注意,这并不是真正实现您想要的最佳方式 - 您可能需要iBor i{(它们是相同的)文本对象。

于 2012-04-13T08:52:04.283 回答