Я включил полный рабочий пример для создания второстепенного режима с желаемым поведением; ключ должен использовать set-char-table-range
на раскладке, созданной make-keymap
, которая создает плотную раскладку с полными char-table
; использование этого на разреженной карте ключей, созданной с помощью make-sparse-keymap
, не будет работать.
(defalias 'foo-electric-delete 'backward-kill-word)
(defun foo-mode-quit (&optional arg)
(interactive)
(foo-mode -1))
(defvar foo-mode-map
(let (map (make-keymap))
(set-char-table-range (nth 1 map) t 'foo-mode-quit)
(define-key map [backspace] 'foo-electric-delete)
map))
(define-minor-mode foo-mode
"Toggle Foo mode.
With no argument, this command toggles the mode.
Non-null prefix argument turns on the mode.
Null prefix argument turns off the mode.
When Foo mode is enabled, the control delete key
gobbles all preceding whitespace except the last.
See the command \\[foo-electric-delete]."
;; The initial value.
:init-value nil
;; The indicator for the mode line.
:lighter " Foo"
;; The minor mode bindings.
:keymap foo-mode-map
:group 'foo)
(defvar major-baz-mode-map '(keymap (t . major-baz-mode-default-function)))
Установка привязки по умолчанию для карты основного режима более проста, и я привожу здесь этот пример, но, как я уже отмечал выше, этот тип запасной таблицы ключей не будет работать для вспомогательного режима:
(defvar major-baz-mode-map '(keymap (t . major-baz-mode-default-function)))
Это обсуждается в документации в Формат раскладок , где говорится:
(t . binding)
This specifies a default key binding; any event not bound by other
elements of the keymap is given binding as its binding. Default
bindings allow a keymap to bind all possible event types without
having to enumerate all of them. A keymap that has a default binding
completely masks any lower-precedence keymap, except for events
explicitly bound to nil (see below).