Копирование между матчами, а не между строками, а между вещами - PullRequest
1 голос
/ 29 сентября 2010
:/From book:/,/$/ cmd_copy chapters_from_match_@From_book@_until_end_of_line.txt

Я старался не использовать слова «писать», «ставить» или «читать», поскольку VIM имеет для них особое значение. Я пытаюсь скопировать (извините, не ссылаясь на команду копирования VIM) вещь между совпадениями в файл. Как ты это делаешь, не копируя целые строки?

Пустой пример

ТЕКСТ:

не копируй меня, дурачок1, здравствуй, мир пожалуйста, скопируйте меня dummy2 не копируйте меня

некоторые входы, должны работать также с входами, кстати, матчпоинты dummy1 еще нет!

еще нет!

копия скоро закончится! dummy2

КОПИРОВАНИЕ:

Привет, мир! Скопируйте меня

или

dummy1 привет мир, пожалуйста, скопируйте меня dummy2

Ответы [ 2 ]

3 голосов
/ 14 октября 2011

Чтобы скопировать текст между start и end, используйте следующую последовательность Normal Команды режима.

/start/e+1 Введите y/end/ Введите

Первая команда ищет следующее совпадение с шаблоном начало фрагмента текста для копирования и позиционирование курсора на первый персонаж после матча. Второй дергает все до следующего совпадение конечного паттерна.

В зависимости от контекста, в котором будут использоваться команды, они могут быть переписывается как команда Ex, отображение или макрос.

  • Команда Ex

    :norm!/start/e+1^My/end/
    

    (введите ^M как Ctrl + V , Введите .)

  • Отображение

    :nnoremap <leader>y /start/e+1<cr>y/end/<cr>
    
  • Macro

    :let @y = "/start/e+1\ry/end/\r"
    

    (Или запишите макрос обычным способом: введите q, зарегистрируйтесь, чтобы сохранить макрос, скажем, y, затем команды, как показано в верхней части ответа с последующим окончанием q.)

0 голосов
/ 29 сентября 2010

так почему бы не использовать

:1s/^\_.\{-}dummy1//    "first line: delete everything until first occurrence of dummy1
:%s/dummy2\zs\_.\{-}\zedummy1/\n/
:1s/\_.*dummy2\zs\_.*// "delete from last occurrence of dummy2 till EOF
...