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

时间:2014-10-09 08:52:21

标签: regex vim editor

由于拒绝单独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,粘贴在新文件中。完成。
  5. 我怎么能在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寄存器中我的内容粘贴到新标签页。

2 个答案:

答案 0 :(得分:1)

要“注册”注册a中的所有块,你可以在vim中尝试这个:

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

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

在执行:g cmd之前,请执行qaq清除a注册。

答案 1 :(得分:1)

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

如果您始终需要msgid行上方和下方的行,则可以将其指定为范围 .-1,.+1.+2以包含空行分隔线也是。)

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

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

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

:new | put! a