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

32

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

// Comment1
// Comment2
// Comment3

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

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

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

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

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

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

Ответы:

36

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

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

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

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

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

actionshrimp
источник
1
Я считаю, что это решение в сочетании с :set ve=allочень универсальным. Я лично использую плагин UnconditionalPaste ( vim.org/scripts/script.php?script_id=3355 ), так как он немного лучше соответствует моим потребностям.
Питер Ринкер
1

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

TLP
источник
0

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

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

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

Джит
источник