繁体   English   中英

Vim:如何从文件中收集所有匹配的和周围的行?

[英]Vim: How to gather all matching and surrounding lines from file?

由于关于单独的VimOverflow的建议被拒绝,因此必须继续在此处发布。

我不得不将翻译从一个文件移到另一个文件,只有msgid匹配某些特定的RegExp。

翻译在块中重复,而且它们可以跨越多行:

# English.po

#: ...
msgid "..."
msgstr "..."

#: templates/common/commonTranslation.phtml:10 | These parts can be
#: any/number/of/lines/can/precede/the/data:0  | of any length.
msgid "buttonhelp.edit"                       <- Matching string
msgstr "Edit your details"                     | 
"the long line continues"                      | Translation
"and can be even longer"                       |

#: ...
msgid "..."
msgstr "..."

这是我在Sublime中所做的:

  1. 为我需要的msgid模式做了一个正则表达式。
  2. Sublime在文件周围放置多个光标。
  3. 上,上,上移,下移,下移,下移,下移–选中所有带有空白行的翻译块。
  4. Cmd-C,粘贴到新文件中。 完成。

我如何在Vim中做到这一点?

重申一下,我需要多个选择,可以根据msgid值将其提取到单独的文件中。 这是单个选择块的外观,包括尾随的空白行和前导的空白行:

     
#: templates/common/commonTranslation.phtml:10
msgid "buttonhelp.edit" # <- value for regexp
msgstr "Edit your details"
 

更新对不起,起初我没有意识到我的自我,但是翻译可以跨越不确定的行数,这是Sublime不足的地方,因为我选择了固定大小的块。 但是翻译总是用空行分隔,除了文件末尾,但是我们可以忽略它。 这是可能的最短数据量:

     
#~ msgid "hotline.title"  | POEdit stores obsolete
#~ msgstr "HOTLINE"       | strings as well
 

解决了感谢评论者,它终于浮现在我身上,这就是我最后所做的事情:

:let @a=''
:g/\v"\w+\.\w+"/norm! "Ayap
:tabe
:put A

它首先清除a寄存器,找到引号( "\\w+\\.\\w+" )中单词之间所有带点的行,然后将周围的段落插入a寄存器中,将其内容粘贴到新选项卡中。

要在寄存器a “拉”所有这些块,可以在vim中尝试:

:g/msgid "buttonhelp\./norm! 2kV2)"Ay

在上面的:g cmd中, msgid "buttonhelp\\.是与您的msgid匹配的正则表达式。

EXEC前:g CMD,请做一个qaq清除a寄存器。

您可以通过:global在所有匹配的行上找到(并执行yank命令)。

在情况下,你总是需要的线的上方和下方msgid线,可以指定那些为范围 .-1,.+1.+2以包括空分隔线,太)。

要在寄存器中累积所有匹配项,请先将其清除,然后将大写字母用于(用于追加):

:let @a = '' | global/^msgid "\.\.\."/.-1,.+1yank A

要将其放入另一个缓冲区,您可以使用

:new | put! a

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM