Можно ли смоделировать произвольное ключевое событие из elisp? Мне известны способы, с помощью которых я могу найти привязку для данного ключа и затем вызвать эту команду в интерактивном режиме, но что, если это событие ключа не связано с командой?
В качестве одного примера , что если бы я хотел связать C-`
себя так же, как ESC
ключ во всех контекстах ?
elisp
key-bindings
events
nispio
источник
источник
key-bindings
это неправильный тег, если вы не пытаетесь связать псевдоним ключа. Также, возможно, вам следует изменить свой пример на что-то другое, чтобы оно не запуталось.key-events
тега. Должен ли я сделать один?key-translation-map
облегчает последнее, поэтому, если это все, что вы хотите, я бы предложил использовать его, а не делать что-то более ручное.Ответы:
Вы можете передавать произвольные события (нажатия клавиш, щелчки мыши и т. Д.) В командный цикл, помещая их в
unread-command-events
. Например, следующее приведёт к тому, что командный цикл выполнит разрыв при следующем запуске:Обратите внимание, что это только передает события в командный цикл, поэтому ничего интересного не получится, если вы зацикливаетесь в своем собственном коде.
Другой подход, о котором вы, похоже, знаете, состоит в том, чтобы найти функцию, с которой связан данный ключ, и выполнить ее самостоятельно:
Это выполнит команду немедленно. Однако помните, что некоторые команды имеют различное поведение в зависимости от того, вызываются ли они интерактивно, например, по умолчанию используются аргументы. Вы хотите компенсировать это с помощью
call-interactively
:источник
unread-command-events
но я не смог понять, как его использовать. Установка этого не имела никакого эффекта для меня. Есть ли хороший пример того, как он используется?unread-command-events
.unread-command-events
это то, что говорит его название. Вы можете просмотреть событие и затем, в зависимости от того, что это такое, условно отодвинуть его обратно,u-c-e
чтобы затем оно было обработано в обычном режиме. Есть много примеров его использования в исходном коде Emacs -grep
это ваш друг.unread-command-events
до работы. Часть, которую я пропустил прежде, былаlistify-key-sequence
функцией. Я только что использовал необработанный ключевой вектор.with-simulated-input
макроса, который оценивает любое выражение сunread-command-events
привязкой let к указанной последовательности клавиш: github.com/DarwinAwardWinner/ido-ubiquitous/blob/…Самый простой способ, который я знаю, это просто использовать
execute-kbd-macro
:источник
C-`
дает мне ошибкуapply: Wrong number of arguments: #[(ad--addoit-function ...
.emacs -Q
этой ошибкой нет. Я все еще получаю эту ошибку, хотя:After 0 kbd macro iterations: foo: Lisp nesting exceeds `max-lisp-eval-depth'
evil
) прямой вызов нужной функции в моем случае имел неожиданный эффект (evilmi-jump-items
), и мне пришлось использовать(execute-kbd-macro (kbd "%"))
Исходя из этого ответа , вы можете использовать глобальный набор ключей, как это
Который будет относиться
C-`
какescapeЭто, кажется, имеет некоторые проблемы, хотя, если вторая комбинация не выполняет функцию. Так что, если escapeиспользуется как
Meta
, то это не работает правильно. Но, похоже, работает для команд, связанных с функциями.источник
C-`
дает мне ошибку:After 0 kbd macro iterations: command-execute: Lisp nesting exceeds `max-lisp-eval-depth'
.C-
связаныESC
каким-либо другим методом, так что это идет в бесконечный цикл.eval-sexp
происходит за один сеанс. :-) Но попытка снова сemacs -Q
причинамиC-`
просто ничего не делать.(kbd "<escape>")
и(kbd "ESC")
может означать разные вещи - вы пробовали оба?Прочитав предложение от jch об использовании
unread-command-events
, я смог собрать решение, которое выполнит некоторые из тех вещей, которые я ищу.Есть еще много перегибов, чтобы решить. А именно, я не получаю правильный результат, если вызываю эту функцию дважды подряд в течение одного
defun
.Примечание:
После проверки Phils' предложение , чтобы использовать
key-translation-map
я был в состоянии найтиlocal-function-key-map
что также является очень полезным в достижении некоторых из моих более широких целей.источник