Як я можу переглянути та відредагувати свою запис (тобто записаний макрос)?


39

Я використовую складні повтори для запису своїх операцій ( qqдля запису, деяких операцій , qдля зупинки), і я допустив помилку.

Можна побачити, що я записав, і виправити помилку, замість того, щоб це зробити ще раз?

Викликання записаних персонажів до @qтворів, але я не бачу їх у своїх картах ( :map q- No mapping found).

І там НЕ так багато інформації в довідці по типізації: :help recording.

Відповіді:


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 Right; ви можете просто використовувати vта вибрати весь рядок (без нового рядка).
Мартін Турноїй

@Carpetsmoker "v^$"aya потягнути (скопіювати) цей рядок до реєстру." Хіба це не повинно ^бути раніше v, а $ви хіба ще не копіюєте новий рядок? Я думаю, що це має бути: 0v$h"ay(так болісно довго!)
joeytwiddle

2
@joeytwiddle ні, $рухається до кінця рядка, але не включає новий рядок. Це різниця між 0y$і yy. Поклавши hпісля того , як $тільки буде означати, що ви пропустите останній символ.
злий

Одне, що ви можете зробити для того, щоб зробити редагування: нехай команди @ a = тип легше редагується - це набрати: <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>(тобто управління + r) для вставки з будь-якого реєстру в режим командного рядка (або в цьому режимі вставки).

Крім того, коли ви перебуваєте в режимі командного рядка, якщо ви введете <C-f>це, з’явиться вікно командного рядка, в якому ви зможете побачити / редагувати минулі команди, що вийшли, і ви зможете редагувати поточну команду перед тим, як викликати її. Натисніть клавішу Enter у команді, яку потрібно подати.

Перевага цього полягає в тому, що ви можете використовувати свої звичайні команди переміщення / заміщення всередині цього буфера для редагування макросу. Наприклад:

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}

Звичайно, ви можете вставити вміст реєстру у свій буфер і змінити його там. Але ви можете зробити все необхідне, не забруднюючи робочий буфер.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.