30

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

// Comment1
// Comment2
// Comment3

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

foo = 1;
bar = 2;
baz = 3;

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

foo = 1; // Comment1
bar = 2; // Comment2
baz = 3; // Comment3

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

3 ответа3

32

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

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

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

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

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

1

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

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .