Используйте ключ в качестве префикса и команды
Я хотел бы знать, как использовать ключ в качестве префикса для других ключей и самой команды.
Я могу сделать это с
key-chord.el
, связывая аккорды клавиш с командами, следующими за первым ключом, но у него есть несколько проблем- Может использоваться только с буквенно-цифровыми клавишами
- Это не реально, так как мне нужно быстро нажимать на клавиши, прежде чем они перестанут
Некоторые пакеты, такие как
easy-kill
а такжеexpand-region
поддерживают эту функциональность, но они имеют сложные кодовые базы, и мои навыки LISP не впечатляют...
Как бы мне удалось это сделать? Я бы очень хотел <menu>
быть привязанным к evil-ex
, но я хотел бы также связать <menu>
в качестве префикса для всех движений (например, клавиш со стрелками), который устанавливает метку как аккорд cua-selection-mode
,
Так как за злом не следуют движения и никакие самостоятельные вставки движения, это был бы идеальный вариант использования. <menu>
идеально, потому что он находится рядом с клавишами со стрелками и другими клавишами движения (например, конец, дом и т. д.), и он не изменен.
2 ответа
Кажется, вам нужно что-то вроде smartrep, которое позволяет указывать ключ в качестве общего префикса для нескольких команд. Единственное, что вы упустите из коробки - это привязать команду к общему префиксному ключу, так что вам нужно запачкать руки smartrep
немного внутренностей. Функция, которую вы ищете
(smartrep-read-event-loop
'((KEY1 command)
(KEY2 command)
...))
Вот фрагмент кода, который может помочь вам начать:
(defun my-command-with-prefix ()
(interactive)
(invoke-prefix-command)
(initialize-event-loop)
;; The form
;;
;; (condition-case ERR FORM (quit QUIT-HANDLER))
;;
;; is there to catch C-g key presses and make sure that
;; finalization code is run.
(condition-case e
(smartrep-read-event-loop
'(("a" . command1)
("b" . command2)
("c" . command3)))
(quit nil))
;; finalize loop
(finalize-event-loop))
Приведенный выше фрагмент - это, по сути, дистиллированная версия кода, найденная здесь.
Если я понимаю, что вы хотите, я бы предположил, что лучше забыть о таймерах и подождать с небольшой задержкой (то есть, чтобы различить намерение <menu>
как команда от его использования в качестве префиксного ключа).
Подход, который я рекомендую и использую довольно часто, заключается в определении префиксного ключа (в вашем случае, например, <menu>
), а затем поместите команду, которую вы хотели использовать для <menu>
на <menu> <menu>
, Это так же быстро, как ударить <menu>
один раз и пытаюсь рассчитывать на небольшую задержку и т. д.
И это позволяет команде, которую вы считаете <menu>
(на самом деле это на <menu> <menu>
) быть повторяемым.
Я обычно делаю такую команду повторяемой, чтобы <menu> <menu> <menu>
повторяет команду один раз, <menu> <menu> <menu> <menu>
повторяет это дважды и так далее. Я хочу использовать этот трюк для команд, которые я действительно хочу легко повторить, просто удерживая клавишу.
Вот простой пример из предложенного мною предложения emacs-devel@gnu.org
еще в 2009 году ЗДЕСЬ. В этом сообщении из списка рассылки, если вы прокрутите вниз до #9, вы увидите предложение использовать такие ключи, #12 показывает тот же пример, а #15 напрямую отвечает на ваш вопрос. Заголовок темы " есть торт будет есть, есть торт будет иметь - Krazy Key koncept kontroversy ", и его тема именно вопрос, который вы подняли.
;; This function builds a repeatable version of its argument COMMAND.
(defun repeat-command (command)
"Repeat COMMAND."
(interactive)
(let ((repeat-previous-repeated-command command)
(last-repeatable-command 'repeat))
(repeat nil)))
Here is how you could then define `C-x', which is already a prefix
key, as also a repeatable key for an action command, in this case,
`backward-char':
(defun backward-char-repeat ()
"Like `backward-char', but repeatable even on a prefix key."
(interactive)
(repeat-command 'backward-char))
(define-key ctl-x-map "\C-x" 'backward-char-repeat)
Now just holding down `C-x' invokes `backward-char' repeatedly - once
you've gotten past the first `C-x' (the prefix).
Как я уже говорил, я давно использовал эту технику, чтобы иметь возможность (а) иметь "повторяющиеся префиксные ключи" и (б) по-прежнему определять другие ключи.