Короткий ответ
Строка проблемы:
'(((kbd "<kp-1>") . "a"))
Решение (форсировать оценку макроса):
;; Single quote changed to back-quote and added a comma
`((,(kbd "<kp-1>") . "a"))
Длинный ответ
Макрос define-minor-mode позволяет вам создавать второстепенные режимы относительно легко (насколько это возможно в Emacs).
First I 'покажу, как это делается, потом объясню, как это работает:
В общем виде:
(define-minor-mode NAME-mode
"DOCUMENTATION"
INIT-VALUE
"LIGHTER"
;; keymap
'(
(KEY-SEQUENCE . DEFINITION)
(KEY-SEQUENCE . DEFINITION)
... ETC ...
)
;; other options
:KEYWORD-ARG VALUE
:KEYWORD-ARG VALUE
... ETC ...
)
Конкретный пример с принудительной оценкой макросов в alist:
;; Custom Minor Mode
(define-minor-mode custom-mode
"Doc description, yada yada yada."
;; The initial value - Set to 1 to enable by default
nil
;; The indicator for the mode line.
" CustomMode"
;; The minor mode keymap
`(
(,(kbd "C-c C-a") . some-command)
(,(kbd "C-c C-b") . other-command)
("\C-c\C-c" . "This works too")
)
;; Make mode global rather than buffer local
:global 1
)
Альтернативный способ, если вы хотите использовать переменную для таблицы ключей, - это определить переменную таблицы ключей и таблицу ключей до объявления второстепенного режима примерно так:
(defvar custom-mode-keymap (make-keymap) "num-mode keymap.")
(define-key custom-mode-keymap (kbd "C-c C-a") 'some-command)
А затем, в вашем второстепенном определении режима, просто перечислите имя переменной для вашей раскладки клавиш вместо alist
(define-key custom-mode-keymap (kbd "C-c C-b") 'other-command)
;; Num pad enable
(define-minor-mode custom-mode
...
;; The minor mode bindings.
custom-mode-keymap
Как все это работает
Сверхувнизу, сразу после define-minor-mode, мы определяем имя команды для переключения второстепенного режима.custom-mode
в этом случае (M-x custom-mode
для переключения режима).Это также определяет переменную с тем же именем.
Сразу после имени команды мы перечисляем строку документации для второстепенного режима в кавычках.Это может быть сколько угодно.
Далее у нас есть несколько вариантов.Самый простой выбор - просто перечислить три вещи, а затем любые дополнительные опции.Три вещи должны быть перечислены в порядке ниже.Эти три вещи:
Значение инициализации для вспомогательной переменной режима.nil
отключит режим по умолчанию.Что-то кроме nil
будет по умолчанию включено.
Зажигалка.Светлее - это просто то, что отображается в строке режима внизу, когда ваш второстепенный режим включен.Это должно быть коротким, и это часто помогает, с точки зрения форматирования, начинать его с пробела.
Карта клавиш.Карта ключей может быть определена как переменная или как список (список ассоциаций).Поскольку использование alist проще и короче, это то, что я использовал в примере.Список alist должен быть в форме (key-sequence . definition)
.
Если вы определите раскладку клавиатуры как список, есть несколько вещей, на которые следует обратить внимание, особенно если вы привыкли определять глобальныесочетания клавиш.Во-первых, имена команд не заключаются в кавычки.Во-вторых, если вы хотите использовать макрос, вы должны заставить его вычислить ( и SO ) .Это делается с помощью комбинации обратной кавычки (не одиночной кавычки) и запятой.Вы можете увидеть, как это делается в примере с макросом kbd.Я также включил определение нажатия клавиш, если вы не используете макрос kbd.Если вы просто заключите в кавычку строку в вашей клавиатуре, она будет распечатана при нажатии определенной комбинации клавиш (как и для определения глобальных привязок клавиш).
Карта клавиш не будет работать с макросами kbd, еслиВы не форсируете оценку макросов kbd комбинацией обратной кавычки и запятой. Например:
`((,(kbd "C-c C-a") . some-command))
Наконец, вы можете добавить дополнительные опции, используя ключевые слова-аргументы вида :blah
.В примере я использовал :global
.Мы могли бы определить весь режим с помощью ключевых слов-аргументов, но короче просто перечислить значения init, lighter и keymap в правильном порядке.