Як відновити МЕКЛАМНИЙ запис макросу на клавіатурі?


10

Класичний футляр:

  1. Ви починаєте запис макросу: C-x (
  2. Скажімо, ви щось робите hello.
  3. Ви запускаєте команду, яка видає помилку, скажімо C-g(наприклад, ви помилково запустите C-sі вам доведеться скасувати це C-g, тепер ваша робота втрачена).

Тепер ваш запис поки що втрачено.

Я хотів би відновити місце, де я зупинився, перш ніж запустити команду, яка перервала запис. Я подивився C-h f start-kbd-macro, але це написано на С, тому я не можу його налаштувати. Я також полював навколо на змінну на кшталт current-kbd-macro, але поки не знайшов жодної.

Чи можна її відновити?

Оновлення:

Я не міг зрозуміти, чому C-u C-x (не працює для мене, але я виявив, що це було тестування C-g.

Виявляється, C-gце особливе - якщо ви запускаєте помилку іншого типу, наприклад

C-x ( M-: (signal 'quit nil) 

Потім це припинить запис, але last-kbd-macroбуде містити "M-: M-( signal 'quit nil", але з

C-x ( C-g

Це зупиняє запис і відкидає все записане. Як користувач із задоволенням від Cg (як мінімум двоє моїх друзів), це досить прикрою відмінністю. Я спробував редагувати keyboard-quit, але там нічого не можу зробити.

Схоже, єдиний спосіб відновити це через recent-keysі автоматично з'ясувати, куди викликався старт-kbd-макрос (або подібний), як в kmacro-edit-lossage.

Відповіді:


8

Я почав реалізацію тут , яка дозволяє перепрівязивают ваш C-x (To resmacro-start-macro.

Тепер, припустимо, ви проходите на півдорозі через макрос, помиляєтесь і натискаєте C-g, наприклад, ви запустили C-sпомилково, і тому натисніть, C-gщоб скасувати його, або ж / е.

C-x ( hello C-s C-g 

Тепер запустіть, C-u C-x (який підкаже у minibuffer із:

Відновити макрос за допомогою (RET: продовжити, DEL: видалити останнє): h e l l o C-s

Таким чином, ви натискаєте backspace ( DEL), щоб видалити, C-sа потім RETпродовжити. Тепер сказано:

Додавання до макросу kbd ...

І ви можете продовжувати.

Загалом:

C-x (      -- start macro
hello
C-s        -- mistake
C-g        -- cancel mistake (and macro)
C-u C-x (  -- recover lost macro
DEL        -- remove mistake
RET        -- continue recording
world!

Зручне, без контекстного перемикання, мінімальне прив’язка клавіш для досягнення завдання, автоматично визначає, звідки почався (у C-x () ваш макрос (recent-keys).


1
Гей, це звучить дійсно приємно. Хочете подати його як патч до Emacs?
Стефан

Запрошуємо це робити / релігізувати як завгодно! Я збираюся пробувати це деякий час на місцях, перш ніж оголосити його де завгодно, щоб я міг знати, що це надійно. Хоча технічні працівники Emacs можуть подумати, що це занадто хакі. ;-)
Христофор зробив

Щоб включити його в Emacs, нам потрібно, щоб автор підписав документи про авторські права (звичайно, ця ж документація охоплювала б також режим бога).
Стефан

Зараз посилання розірвано :(
Брудне iCE

2

Виконайте kmacro-start-macro-or-insert-counterз префіксом ( C-u), щоб додати до попереднього макросу.


2
Рядок документація не говорить про це, але подвійному префікс Arg ( C-u C-u) встановлює якAPPEND і NO-EXECаргументи start-kbd-macro, яка дозволяє додавати без початкової перегравання макро-так далеко. Така поведінка є документально в керівництві, проте:(emacs) Basic Keyboard Macro
Phils

Спробуйте це на прикладі в моєму питанні, не виходить.
Крістофер Зроблено

2

Поєднання хороших відповідей з stsquad та artagnon дає (на мій погляд) комплексне рішення проблеми, що є цілком розумним:

  • C-xC-keC-hl щоб відредагувати макрос, сформований із втрати
  • відредагуйте макрос, щоб зменшити його до початкового запису
  • C-cC-c для зберігання відредагованого макросу
  • Або C-u<f3>спочатку відтворити цей макрос, а потім продовжити запис наступних натискань клавіш, які будуть додані до визначення макросу
  • ... або C-uC-u<f3>продовжувати запис без початкового відтворення макросу досі.

Можливо, необхідність редагування lossage-as-macro не є ідеальною , але (a) ви повинні були редагувати макрос незалежно, якщо ви перервали запис, і (b) це не повинно траплятися дуже часто, якщо ви просто пам'ятаєте, як нормально зупинити макрос (наприклад, <f4>замість цього C-g).

Жодне з яких не означає, що це не було б корисно, якби перерваний макрос десь зберігався; це просто те, що я не думаю, що це насправді відбувається. Напевно, варто було M-x report-emacs-bugб запропонувати цю особливість.


Це не вирішує проблему. З вашим рішенням половину часу було б легше просто запустити макрос заново. Я розмістив відповідь в іншому місці, що справді вирішує проблему.
Крістофер Зроблено

1
Зрозуміло, для простих випадків починати все було б простіше. Це все ще корисно для решти, але це означає, що деякі люди вважають це корисним; тим більше, що це доступно за замовчуванням. Як я зазначив, я вважаю, що ідея більш автоматизованого підходу є вдалою, тому я радий бачити, як ви працюєте над рішенням, і, безумовно, підтвердив свою відповідь.
Філз

0

Канонічне рішення - C-x C-k C-e( kmacro-edit-macro), яке дозволить вам переходити через кожне натискання клавіш і вставляти / видаляти все, що вам потрібно. Синтаксис команд для редактора трохи короткочасний, але ?відображатиме керівництво. Існує більш природний редактор, пов'язаний з C-x C-k e( edit-kbd-macro), який дає звичайний текстовий редактор макросів з коментарями.

Ще один варіант, M-x insert-kbd-macroякий дозволить вам редагувати макрос як Lisp, але це не сама читабельна річ у світі.

Що стосується змінних, яких ви шукаєте last-kbd-macroта kmacro-ring.

Як ви згадуєте, ви не завершили свій макрос, ви можете просто створити його з вашої втрати. C-x C-k e C-h lта видалити до 300 попередніх символів.


Це погана відповідь, яку я б сказав, якби міг. Ви або не читали питання, або ігноруєте його. Ні, last-kbd-macroні kmacro-ringмістять натиснуті раніше клавіші C-gабо сталася помилка. Я спеціально ставив INCOMPLETE у великих заголовках у своєму заголовку, очікуючи таких поганих відповідей. Дякую, що намагалися допомогти.
Крістофер зроблено

1
@ChristopherDone: впевнений, що можна - я додав примітку внизу, щоб згадати про втрату. Ви можете створити макрос із до 300 ваших раніше введених символів.
stsquad

Так, хтось згадав про втрату на #emacs. Я просто хочу відновити, де я зупинився. Мені не хочеться відкривати редактор і починати видаляти речі з цього, коли я в середині щось роблю.
Крістофер Зроблено

2
Поєднання відповідей цього та відповіді артаньона дає прекрасне рішення: C-x C-k e C-h lредагувати, C-c C-cа потім C-u f3продовжувати запис (зазначаючи, що цей останній f3спочатку відтворить макрос до цього часу, перш ніж чекати подальшого введення). Можливо, необхідність редагування lossage-as-macro не є ідеальною , але (a) ви повинні були редагувати макрос незалежно, якщо ви перервали запис, і (b) це не повинно траплятися дуже часто, якщо ви просто пам'ятаєте, як нормально зупинити макрос.
Філз

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