Как я могу просмотреть и отредактировать свою запись (т.е. записанный макрос)?

39

Я использую сложные повторы для записи своих операций ( qqдля записи, некоторых операций , qдля остановки), и я сделал ошибку.

Можно увидеть, что я записал и исправить ошибку, вместо того, чтобы делать это снова?

Вызов записанных персонажей по @qпроизведениям, но я не вижу этого в своих сопоставлениях ( :map q- No mapping found).

И там не так много информации в справке по типизации: :help recording.

kenorb
источник

Ответы:

42

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

Примечание 2: <1b>есть Esc; Вы можете вставить это с Ctrl+vи затем Esc. Может также отображаться как ^[(в зависимости от displayнастроек).


Это не отображение; так что имеет смысл, что :mapне работает. Он записывается в регистр, и вы можете просматривать и редактировать его, как любой регистр.

Все, что qделает, это «очищает этот регистр и добавляет к нему любое нажатие клавиши» , а все, что @делает, это «оценивает регистр как команды» .

В макросе нет ничего «другого», вы можете вызвать любой регистр в качестве макроса.


Для просмотра просто используйте:

:echo @a

Как и любой регистр.

Вы также можете использовать :registersдля просмотра всех регистров.


Для редактирования вы можете сделать несколько вещей:

Самый простой способ, которым вы можете просто назначить @a, вот так:

:let @a='iasd<1b>'

Это запустит режим вставки ( i), вставки asdи возврата в обычный режим.

Это не очень полезно для обширного редактирования; Вы можете использовать функции (то есть. substitute()), или, возможно, добавить что-то ( :let @a=@a . 'more'), но изменить что-то в середине не так просто.

Я обнаружил, что лучший способ для этого - запустить новый буфер с помощью :splitили :tabnewи отредактировать регистр, вставив его туда, отредактировав, а затем скопировав обратно.

Вы можете использовать "apкоторый вставит текст в буфер (где aнаходится ваш регистр):

iThis is A<1b>

Теперь я могу просто изменить строку на:

iThis is an edited macro<1b>

Затем я делаю, ^v$"ayчтобы вытащить (скопировать) эту строку в aреестр:

  • ^ для начала строки
  • v для визуального режима
  • $ для конца строки
  • "ay дергать выбор, чтобы зарегистрироваться a

Если вы хотите, вы можете сделать это без использования визуального режима с ^"ay$.

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

Вы также можете просто использовать yy, а затем @", что немного быстрее. Это также скопирует завершающий символ новой строки и может вызвать побочные эффекты ... Другой способ сделать это быстрее - использовать макрос :-)

Мартин Турной
источник
2
Я хотел бы отметить, что при добавлении движения в ваш регистр побочным эффектом будет добавление символа новой строки, как если бы вы нажали Enterв конце записи. Во многих случаях это может быть безболезненно, но в тех случаях, когда вы тщательно обработали положение курсора в конце записи, это может повлиять на повторяемость.
tommcdo
@tommcdo Верно; Вы можете просто использовать vи выбрать всю строку (без новой строки).
Мартин Турной
@Carpetsmoker "v^$"aya вернуть (скопировать) эту строку в реестр." Разве это не должно ^произойти раньше v, и $вы все еще не копируете новую строку? Я думаю, что это должно быть: 0v$h"ay(да больно долго!)
joeytwiddle
2
@joeytwiddle нет, $движется к концу линии, но не включает в себя символ новой строки. Это разница между 0y$и yy. Если поставить hпосле, это $будет означать, что вы пропустите последний символ.
evilsoup
Единственное, что вы можете сделать, чтобы сделать редактирование: let @ a = type команды, более легко редактируемые, это набрать: <Ctrl-f>, выбрать и отредактировать соответствующую строку (последнюю строку, которой она по умолчанию соответствует, если вы редактируете последняя строка, которую вы ввели) используя vim как обычно. Нажмите клавишу возврата, когда вы закончите, чтобы выполнить строку, или <Ctrl-c>, чтобы выйти.
9

Чтобы заставить что-то работать с ...

qajjjq

Начнёт запись макроса в aреестр.

С помощью команды вы можете увидеть многие текущие регистры (используемые для макросов, восстановления, удаления и т. Д.) :regИли указать регистр для отображения, указав его имя. Например, чтобы показать регистр a:

:reg a

доходность

--- Registers ---
"a   jjj

Вы можете добавить в существующий именованный регистр, используя соответствующую заглавную букву. Это работает не только для записи макросов, но и для восстановления. Например:

qAkkkq
:reg a

доходность

--- Registers ---
"a   jjjkkk

Если вы хотите использовать синтаксис let для редактирования существующего макроса, вы можете сделать:

let @a='<C-r>a'

который будет расширяться до

let @a='jjjkkk'

и затем вы можете изменить отдельные нажатия клавиш.

Обратите внимание, что вы можете использовать <C-r>(то есть control + r) для вставки из любого регистра в режим командной строки (или, в этом случае, в режим вставки).

Кроме того, когда вы находитесь в режиме командной строки, если вы наберете <C-f>это, появится окно командной строки, в котором вы можете просмотреть / отредактировать прошлые введенные команды, и вы можете отредактировать текущую команду перед ее вызовом. Нажмите ввод на команду, которую вы хотите отправить.

Преимущество этого заключается в том, что вы можете использовать ваши обычные команды перемещения / замены внутри этого буфера для редактирования макроса. Например:

let @a='<C-r>a'<C-f>

будет воспитывать:

:118 reg
:119 reg a
:120 let @a='jjjkkk'

Если вы на команде 120, вы можете сделать:

s/kkk/}
<return>
:reg a

доходность

--- Registers ---
"a   jjj}

Конечно, вы можете вставить содержимое регистра в ваш буфер и изменить его там. Но вы можете делать все, что вам нужно, не загрязняя ваш рабочий буфер.

Зак Ингбретсен
источник