Vim: как вставить блок текста в конце нескольких строк?

16979
Tim

Скажем, у меня есть такой блок текста:

// Comment1 // Comment2 // Comment3 

И я хочу добавить каждую из этих строк в конец 3 соответствующих строк кода:

foo = 1; бар = 2; баз = 3; 

Так что конечный результат

foo = 1; // Comment1 бар = 2; // Comment2 баз = 3; // Comment3 

Есть ли простой способ сделать это в Vim?

26
@Flimzy, к сожалению, нет. Время от времени комментарии, подобные вашим, появляются в вопросах Vim, но проверьте это: http://meta.stackexchange.com/q/25925/160504 sidyll 12 лет назад 0
Лучшее сообщество для этого вопроса - https://vi.stackexchange.com/ thinwybk 5 лет назад 0

3 ответа на вопрос

30
actionshrimp

Используйте режим визуального блока ( Ctrl+ v), чтобы выбрать один набор линий, затем либо одну, yлибо dих.

Затем, если вы выбрали строки foo, bar, baz, снова используйте режим визуального блока, чтобы выбрать первый столбец строк комментария, а затем Shift+ pих на место (или, если вы выбрали строки комментариев, выберите последний столбец базы foo bar линии и pих на место.

Чтобы освоить позиционирование, может потребоваться немного практики, но когда у вас есть ловкость, вы будете летать. Когда вы выбрали блок, вы также можете использовать Shift+ Aдля добавления, например, пробелов к блоку (при добавлении новый текст будет отображаться только в верхней строке, но когда вы нажмете клавишу esc, он волшебным образом появится во всех выделенных строках), Точно так же Shift+ iбудет делать то же самое в начале выбранного блока в каждой строке.

Вы должны будете очистить пустые строки потом.

Также есть отличный эпизод vimcasts, в котором эти техники описаны более подробно.

Я считаю, что это решение в сочетании с `: set ve = all` очень универсально. Я лично использую плагин UnconditionalPaste (http://www.vim.org/scripts/script.php?script_id=3355), так как он немного лучше соответствует моим потребностям. Peter Rincker 12 лет назад 1
1
TLP

Ну, если это легко или нет, скажи мне. Перейдите к // Comment 1, нажмите, ddчтобы удалить. Перейдите к строке foo = 1;и нажмите p, чтобы вставить ниже линии. Поднимитесь fooснова и нажмите, Jчтобы присоединиться к ряду. Тад.

0
Jeet

Следующее будет делать именно то, что вы описываете:

:%s@\(\w\s\+=\s\+\(\d\+\)\)@\=submatch(1) . " // Comment" . submatch(2)@ 

В зависимости от того, что вам действительно нужно сделать (в отличие от примера), на практике может быть проще выбрать блок // «Comment1» и т. Д. Block ( Ctrlv), yank ( y), перейти к концу кода блок и вставить.