2014-10-09 2 views
1

Поскольку предложение для отдельного VimOverflow было отклонено, вам следует продолжить публикацию здесь.Vim: Как собрать все соответствующие и близлежащие строки из файла?

Мне пришлось перемещать переводы из одного файла в другой только 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. Up, Up, Shift-Down-Down-Down-Down - все блоки перевода с пустыми линиями.
  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, содержимое которого я вставляю в новую вкладку.

ответ

1

к «дергать» все эти блоки в регистре a, вы могли бы попробовать это в Vim:

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

в выше :g ЦМД, то msgid "buttonhelp\. является регулярное выражение, чтобы соответствовать вашему MsgId.

перед исполнением :g cmd, пожалуйста, сделайте qaq, чтобы очистить регистр a.

+0

Спасибо , это работало еще лучше, при условии, что он выбрал весь абзац, поскольку перевод может охватывать несколько строк, что я полностью пропустил в Sublime, и теперь мне придется перепроверить все:/Однако последний перевод был полностью опущен, файл заканчивается на 'sggid' линии без соответствующего перевода. Угадайте, что можно изменить, добавив пустую строку в конец. – firedev

+0

Извините, не сделал себя чистым. В новом файле, который я получил после вставки буфера, последний перевод отсутствовал. Не уверен, как это возможно, есть пустая строка, поэтому ')' должно было работать. Я проверю его позже. – firedev

+0

Я думаю, что что-то вроде '' Ayap' в конце вместо '2kV2 '' будет делать это еще лучше, поэтому он копирует весь блок перевода из верхней пустой строки в нижнюю. – firedev

1

Вы можете найти (и выполнить команду yank) на всех соответствующих линиях через :global.

В случае, если вы всегда нужны линии выше и ниже msgid линии, вы можете задать их в качестве диапазона.-1,.+1 (.+2 включать пустую разделительную линию, тоже).

Чтобы аккумулировать все матчи в регистре, первый ясно, и использовать верхний регистр для (для добавления):

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

Чтобы поместить это в другой буфер, вы можете использовать

:new | put! a 
+0

Удивительно, что сработало. способ сначала выполнить поиск, а затем просто «глобальный» с повторным заданием регулярного выражения? – firedev

+0

Также есть способ скопировать до конца абзаца в этом случае, поскольку перевод может охватывать несколько строк, к чему я, к сожалению, не обращал внимания. – firedev

+0

Вы можете опустить regexp, если вы уже искали его: ': g //'. Вы также можете выполнить поиск (до конца абзаца) с помощью диапазона, см. ': H: range'. –

Смежные вопросы