[英]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中所做的:
msgid
模式做了一个正则表达式。 我如何在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.