将普通模式命令应用于正则表达式匹配项


10

我正在使用以下正则表达式来匹配Clojure函数定义下的文档字符串:

\vdefn.*\n\s*\zs"([^"]|\n)*"

有没有办法gq在给定文件中此模式的所有匹配项上运行正常模式(格式行)命令?

Answers:


10

的力量g

:g/\vdefn.*\n\s*\zs"([^"]|\n)*"/normal gngq

/s 之间的部分是不言自明的,因为它是您原始问题中的正则表达式。

normal gngq最后有点有趣。gn会选择正则表达式的下一个匹配项,并且gq当然会格式化此选择项(如您在问题中提到的)。

:g是最重要的部分。在我看来,这是Vim最有用的功能之一。该gex命令需要一个正则表达式和Ex命令,并在每一行执行命令正则表达式匹配。如果您还没有了解:g,我强烈建议您这样做,因为它将大大提高您的生产率。Vim拥有一些资源:help :g或Vim Wiki上的g的力量


gn片段是从V触发的行中选择到下一个(不是同一行中的)模式出现。Vim的文档指出,如果可视模式处于活动状态,则选择将从当前行扩展到下一个模式。这会导致不良行为。

@merb糟糕,没有意识到这一点。编辑。
Doorknob

选择仍然是从匹配行到下一个匹配。手动单步执行正常模式命令会显示,这//s<cr>使我离开了当前行的比赛开始,但是//e<cr>却使我离开了下一场比赛的结束,而不是当前比赛的结束。

1
问题似乎出在//s<cr>V。运行时:normal V,按预期方式进入视线模式。如我所料,当我运行:normal //s<cr>光标时,光标会落在"比赛的第一场。我跑步时:normal //s<cr>V没有视觉选择。

1
解决了。该命令必须为normal gngq。建议修改。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.