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

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

// Comment1
// Comment2
// Comment3

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

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

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

Если у вас есть эти два блока в одном файле, используйте Ctrl+ vдля выбора комментариев --> Ctrl+v 2j$y, затем перейдите к первой строке другого блока, нажмите A+ Space, затем нажмите p.

Если ваши комментарии находятся в буфере обмена, выполните:

      :call setreg('+',getreg('+'),'b')

затем нажмите A+ Spaceи, наконец p, .

Обратите вниманиеsetreg()Команда, которую мы используем, поворачивает буфер обмена по часовой стрелке, позволяя вам вставить ее сбоку от любого блока текста.

Вы можете просмотреть гифку, где парень использует первый подход немного по-другому: https://codegrepr.com/question/how-do-i-paste-a-column-of-text-after-a- Different-column-of -текст-в-vim/

Другие вопросы по тегам