Дополнительных клавиш в Emacs?


В последнее время я довольно много изменял настройки Emacs, но я достиг проблемы, которая начинает меня раздражать. Я хотел бы иметь возможность ввести дополнительный модификатор, как ключи. То, что я пытаюсь сделать, чтобы сделать вещи более ясными, когда я нахожусь в режиме dired (который не принимает текстовый ввод, поэтому обычные буквы могут быть восстановлены), я хотел бы, чтобы, когда я удерживаю букву s и нажимаю j или l, курсор перемещается на следующую и предыдущую строку каталога соответственно. Эффективно заставляя ключ s действовать как модификатор.

Я рассматривал возможность применения модификатора s, такого как super или hyper, но все они используются для глобальных вещей. Возможно ли это? если нет, то это позор.

Правка:

Кажется, есть некоторая путаница с тем, что я ищу. Если я определяю нормальную последовательность ключей, такую как

(define-key map (kbd "s j") 'dired-next-dirline)

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

Я надеюсь, что сделал это более ясным. Спасибо.
4 4

4 ответа:

Я покопался в коде и нашел вот это. Он связывает s j с my-dired-next-dirline, но сразу после того, как вы это сделали, достаточно просто j, чтобы сделать это снова. Любой другой ключ сбрасывает временную привязку.

Обратите внимание, что функция set-temporary-overlay-map была добавлена в Emacs 24.2, который на момент написания этой статьи еще не был выпущен, поэтому вам нужно будет построить Emacs из git.
(defun my-dired-next-dirline ()
  (interactive)
  (dired-next-dirline 1)
  (set-temporary-overlay-map
   (let ((map (make-sparse-keymap)))
     (define-key map [?j] 'my-dired-next-dirline)
     map)
   nil))

(eval-after-load "dired"
  '(progn
     (let ((prefix-map (make-sparse-keymap)))
       (define-key prefix-map "j" 'my-dired-next-dirline)  
       (define-key dired-mode-map "s" prefix-map))))

Ключевые аккорды могут быть тем, что вы ищете.

Если ключевые аккорды-это не то, что вы ищете (как вы предположили в комментарии к ответу Тома ), то вы, кажется, хотите простой define-key, который использует последовательность клавиш. то есть

(define-key dired-mode-map (kbd "s j") 'dired-previous-line)

Это имеет недостаток в отключении первоначальной функциональности ключа s, но вы можете повторно привязать его к последовательности s-s, полагаю, да.

Этот вопрос предшествует ему, но пакет Hydra позволяет сделать это и многое другое.

Https://github.com/abo-abo/hydra

Смотрите примеры здесь: https://github.com/abo-abo/hydra/blob/master/hydra-examples.el и здесь https://github.com/abo-abo/hydra/blob/master/hydra-test.el

Wiki также имеет более полезные примеры https://github.com/abo-abo/hydra/wiki/Hydras-by-Topic

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

  • делайте действия и оставайтесь в ключевом режиме (фактически то, что вы просите.) (так называемая blue гидра)
  • выполнить действие и выйти из ключевого режима (A red hydra)

И так далее.

К счастью a более буквальный синтаксис был добавлен в феврале 2015 года, проверьте тесты, чтобы увидеть цвет и буквальный синтаксис бок о бок. (также этот коммит https://github.com/abo-abo/hydra/commit/0a3cc60f5856eb4a38204b9075d67d058ba56bef )

См.Также эту статью автора. http://oremacs.com/2015/02/02/colorful-hydrae/