Разнообразные команды – ЧАСТЬ 11

31.3  Клавиатурные макросы

Клавиатурный макрос — это определенная пользователем команда, обозначающая другую последовательность ключей. Например, если вы обнаружили, что вам нужно набрать C-n C-d сорок раз, то вы можете  ускорить работу, определив клавиатурный макрос для C-n C-d и вызвав его со счетчиком повторений 40.

C-x (      Начать определение клавиатурного макроса (start-kbd-macro).

C-x )      Закончить определение клавиатурного макроса (end-kbd-macro).

C-x e          Выполнить самый последний клавиатурный макрос (call-last-kbd-macro).

C-u C-x (  Заново выполнить последний клавиатурный макрос и затем добавить дополни-

тельные ключи к его определению.

C-x q          Когда достигается эта точка при выполнении макроса, сделать запрос о под-

тверждении (kbd-macro-query).

M-x name-last-kbd-macro

Задать имя команды (на время текущего сеанса) для последнего определенного клавиатурного макроса.

M-x insert-kbd-macro

Вставить в буфер определение клавиатурного макроса как код на Лиспе.

C-x C-k      Отредактировать  ранее   определенный клавиатурный  макрос   (edit-kbdmacro).

M-x apply-macro-to-region-lines

Запустить последний клавиатурный макрос на каждой полной строке в обла-

сти.

Клавиатурные макросы отличаются от обычных команд Emacs тем, что они написаны на командном языке Emacs, а не на Лиспе. Это облегчает их написание для новичков и делает их более удобными  в качестве временных хаков. Однако, мощности командного языка

Emacs как языка программирования недостаточно, чтобы он был удобным для написания чего-либо умного или универсального. Для таких вещей надо использовать Лисп.

Вы определяете клавиатурные макросы во время выполнения команд, являющихся определением. Говоря другими словами, во время определения клавиатурного макроса его определение выполняется  в первый раз.  Таким образом, вы можете  видеть, каково действие ваших команд, так что вы не должны просчитывать его в уме. Когда вы кончили, макрос клавиатуры определен, а также  один раз фактически выполнен. После этого вы можете снова и снова выполнять все целиком, вызывая макрос.

31.3.1  Основы  использования

Для начала определения клавиатурного макроса наберите команду C-x ( (start-kbdmacro). Начиная с этого момента ваши нажатия на клавиши по-прежнему выполняются, но также  становятся частью определения  макроса.  В строке  режима появляется  слово

‘Def’, чтобы напомнить вам о том, что происходит. Когда вы закончите,  команда C-x )

(end-kbd-macro) закончит определение макроса (но не станет его частью!). Например,

C-x ( M-f  foo  C-x )

определяет макрос для перемещения вперед на слово и вставки ‘foo’.

Определенный таким образом макрос может запускаться снова с помощью команды C-x e (call-last-kbd-macro), в качестве числового аргумента которой можно задать счетчик повторов для многократного выполнения макроса.  Команде  C-x ) также  можно задать счетчик повторов в качестве аргумента, в этом случае именно столько раз она повторяет макрос сразу после его определения, но само определение макроса засчитывается как первое повторение (так как оно выполняется в то время, как вы его определяете).  Таким образом, C-x ) с аргументом 4 приводит к непосредственному выполнению  макроса еще 3 раза. Аргумент 0 для C-x e или C-x ) означает повторение макроса бесконечное число раз (пока он не получит ошибку, или вы не наберете C-g или, в MS-DOS, C-hBREAKi).

Если вы хотите повторять операцию в регулярно расположенных местах в тексте,  то определите макрос и включите в него команды для передвижения к следующему месту, в котором вы хотите его использовать. Например, если вы хотите изменить каждую строку, вам нужно поставить точку в начало строки и определить макрос, изменяющий эту строку и перемещающий точку в начало следующей строки. После этого повторение макроса будет обрабатывать строки одну за другой.

После того как  вы завершили  определение макроса, вы можете  добавить что-либо в его конец, набрав C-u C-x ).  Это эквивалентно обычной C-x (, за которой следует повторный набор всего имевшегося до сих пор определения.  Как  следствие этого, она повторно выполнит макрос, как было определено ранее.

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

Одна из вещей, которая не всегда правильно работает в клавиатурных макросах, — это команда C-M-c (exit-recursive-edit).  Когда эта команда выводит из рекурсивного редактирования, которое было начато внутри макроса, то она работает так, как вы ожидали. Но если вы выходите из рекурсивного редактирования, которое было начато до того, как  вы запустили клавиатурный макрос, то также  происходит выход из клавиатурного макроса как из части этого процесса.

Вы можете отредактировать уже существующий клавиатурный макрос, используя C-x

C-k (edit-kbd-macro).   Затем вы должны ввести то,  что  вы будете  использовать для

вызова макроса — C-x e или M-x имя или какую-то другую последовательность ключей. Это форматирует  определение макроса в буфере и входит в специальный основной режим для его редактирования. Наберите в этом буфере C-h m,  чтобы получить подробности о редактировании макроса. Когда вы закончите редактирование, нажмите C-c C-c.

Команда M-x apply-macro-to-region-lines повторяет последний определенный клавиатурный макрос для каждой полной строки внутри текущей области.  Она делает это строка за строкой, перемещая точку в начало строки и выполняя затем макрос.

31.3.2  Именование и сохранение  клавиатурных макросов

Если вы хотите сохранить макрос клавиатуры дольше, чем до следующего определения, то вы должны дать ему имя, используя M-x name-last-kbd-macro. Эта команда считывает имя как аргумент, используя минибуфер, и определяет это имя для выполнения макроса. Имя макроса — это лисповский символ, а определение его таким способом делает его допустимым именем команды для вызова при помощи M-x или для привязывания ключа с помощью global-set-key (см. Раздел 31.4.1 [Таблицы ключей], с. 356). Если вы укажете имя, уже имеющее определение, отличное от макроса клавиатуры, то печатается сообщение об ошибке, и ничего не изменяется.

Когда  макрос получает имя команды, вы можете  записать его определение  в файл. Потом его можно будет использовать в другом сеансе редактирования. Сначала обратитесь к файлу, в котором хотите записать определение. Затем используйте эту команду:

M-x insert-kbd-macro hRETi  имямакро hRETi

Это вставляет Лисп-код, который,  будучи выполнен позднее,  определит тот  же  самый макрос с тем же  самым определением,  которое он имеет сейчас.  (Чтобы  сделать это, вам не нужно разбираться в Лисп-коде,  так как insert-kbd-macro напишет его за вас.) Затем сохраните файл. Позже вы можете загрузить этот файл с помощью load-file (см. Раздел 23.7 [Библиотеки Лиспа], с. 253). Если файл, в который вы записываете, является вашим файлом инициализации  ‘~/.emacs’ (см. Раздел 31.7 [Файл инициализации], с. 366), то макрос будет определяться каждый раз, когда вы запускаете Emacs.

Если вы зададите команде insert-kbd-macro числовой аргумент, то она создаст дополнительный Лисп-код для записи ключей (если они есть), которые вы привязали к макросу клавиатуры; таким образом, когда вы загрузите файл, макрос будут вновь привязан к тем же самым ключам.

31.3.3  Выполнение макроса  с вариациями

Используя C-x q (kbd-macro-query),  вы можете  достигнуть эффекта,  сходного с действием query-replace, когда макрос каждый раз запрашивает у вас, должен ли он производить изменения. Во время определения макроса наберите C-x q в той точке,  где  вы хотите  получать запрос.  При определении  макроса эта команда ничего не  делает, но когда вы запускаете  макрос, то C-x q произведет интерактивный запрос о продолжении действий.

Правильными ответами на запрос от C-x q являются hSPCi  (или y), hDELi  (или n), hRETi (или q), C-l  и C-r.  Ответы те же самые, что и для query-replace, хотя не все варианты ответа для query-replace имеют смысл.

Эти ответы включают hSPCi  для продолжения, а hDELi  для пропуска остатка этого повторения макроса и начала нового повторения макроса. hRETi  означает пропуск остатка данного повторения и отмены остальных повторений. C-l  перерисовывает экран и снова делает запрос.

C-r  входит на уровень рекурсивного редактирования, где  вы можете  выполнить ре-

дактирование, которое не является  частью макроса. Когда вы выйдете из рекурсивного

редактирования с помощью C-M-c, у вас снова спросят о том, как продолжать выполнение клавиатурного макроса. Если тогда вы нажмете hSPCi, то будет выполнен остаток макроса.

C-u C-x q, то есть C-x q с числовым аргументом, осуществляет  совершенно другую функцию. Она входит в рекурсивное редактирование, считывая ввод с клавиатуры, и когда вы набираете его во время определения макроса, и когда он выполняется из макроса. Во время определения, редактирование,  которое вы делаете внутри рекурсивного редактирования, не становится частью макроса.  Во время выполнения макроса рекурсивное редактирование дает вам возможность выполнить какое-либо  особенное редактирование  в каждом повторении. См. Раздел 30.12 [Рекурсивное  редактирование],  с. 338.

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий