vim копирование и вставка символов разной длины в несколько строк - PullRequest
0 голосов
/ 09 января 2019

У меня есть следующий сценарий оболочки:

STORAGE_PORT='7000'
API_PORT='10000'
CLIENT_PORT='9042'

и я бы хотел, чтобы оно стало:

STORAGE_PORT='7000'
API_PORT='10000'
CLIENT_PORT='9042'

STORAGE_PORT:STORAGE_PORT
API_PORT:API_PORT
CLIENT_PORT:CLIENT_PORT

Есть ли в vim элегантный способ сделать это? (без необходимости копировать вставлять отдельно каждую переменную)

Ответы [ 4 ]

0 голосов
/ 10 января 2019

я бы поместил курсор на первую строку

gg0

затем начните запись макроса

qq

затем сделайте первую строку вручную

ywjjo<ESC>pa:<ESC>p0kk

и прекратить запись макроса

q

затем повторите макрос дважды или столько, сколько нужно

@q@q
0 голосов
/ 09 января 2019

Вы можете использовать :global для итерации по всем строкам (которые начинаются с переменной; затем мы можем повторно использовать шаблон поиска для захвата с помощью команды gn) и добавить к ( регистр), который мы предварительно инициализируем новой строкой, поэтому регистр равен linewise и каждая добавленная переменная отделяется символом новой строки:

:let @a="\n"|g/^\w\+/norm! "Aygn
:put a

код гольфа

Чтобы еще больше сократить это, мы можем заменить шаблон простым ^ (чтобы все строки совпадали) и использовать t=, чтобы просто захватить переменную:

:let @a="\n"|g/^/norm! "Ayt=
:put a
0 голосов
/ 09 января 2019

Хотя мне действительно нравятся компактные способы, описанные в других ответах, здесь есть более пошаговое объяснение.

Сначала скопируйте 3 строки в новое место.

Затем визуально выберите их. Перейти к первой строке и нажать Vjj. V Начните визуально, а затем двигайтесь вниз на две строки.

Затем нажмите :. Курсор переходит к командной строке, которая заполнена '<,'>. Это означает, что команда будет выполняться только на визуально выбранных строках (см. :help v_:). Затем введите команду

'<,'>s/^\([^=]*\)=.*$/\1:\1/

Соответствует имени переменной от начала строки (^) до знака = и сохраняется как «группа 1» (\(...\) обозначает группу). Это также соответствует затем до конца строки (.*$). Замена заменяет всю строку на «группу 1» (\1), за которой следует :, а затем снова «группа 1».

0 голосов
/ 09 января 2019

Вы можете скопировать весь блок, а затем заменить вторую часть регулярным выражением:

ggyGGp:,$s/^\v(.*)\=.*/\1:\1/g

Но вы также можете использовать макрос в различных формах

Хотя ggyGGp - это набор команд, который пользователь vim использует довольно свободно, комментарий Питера под ответом Инго заставил меня вспомнить, что это также довольно новаторский способ сделать это (эй, я все еще учусь так все в порядке).

:%t0 может быть более элегантным, t является синонимом для копирования, % означает каждую строку, а 0 означает нулевую строку. Поэтому мое решение для регулярных выражений будет выглядеть так:

:%t0<cr>o<esc><cr>:,$s/^\v(.*)\=.*/\1:\1/g

Это все еще на 8 символов дольше, чем решение Peters Golf, но я могу с этим смириться, поскольку гольф только для шикарных и богатых.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...