Используйте ключ в качестве префикса и команды

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

  1. Я могу сделать это с key-chord.el, связывая аккорды клавиш с командами, следующими за первым ключом, но у него есть несколько проблем

    • Может использоваться только с буквенно-цифровыми клавишами
    • Это не реально, так как мне нужно быстро нажимать на клавиши, прежде чем они перестанут
  2. Некоторые пакеты, такие как 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).

Как я уже говорил, я давно использовал эту технику, чтобы иметь возможность (а) иметь "повторяющиеся префиксные ключи" и (б) по-прежнему определять другие ключи.

Другие вопросы по тегам