Я начал кодировать второстепенный режим, чтобы обеспечить некоторые сочетания клавиш. Моя первая попытка была опечатка:
(define-minor-mode borked-mode
"A mode defined with a broken key binding"
nil nil
'(([b] . 'previous-line)))
Я намеревался использовать b
ключ и сразу понял, что должен был использовать "b"
вместо [b]
. Поэтому я переопределил второстепенный режим:
(define-minor-mode borked-mode
"A mode defined with a broken key binding"
nil nil
'(("b" . 'previous-line)))
Однако это не сработало. Это вызвало у меня погоню за диким гусем через различные способы привязки ключей (например, (kbd ...), [...] и т. Д.). Наконец я понял, что простая переоценка (define-minor-mode ...)
формы ничего не меняет, я застрял с исходной картой сломанного ключа. Затем я попытался изменить раскладку клавиатуры напрямую, (define-key borked-mode-map ...)
но не смог загрузить исправленную раскладку. Наконец я перезапустил Emacs, и мой второстепенный режим был правильно загружен.
Мой вопрос: как вы обновляете определение второстепенного режима по мере его разработки? Есть ли способ очистить сломанное определение, или вам нужно перезапустить emacs, чтобы убрать битые биты?
источник
defvar
не буду оценивать это значение снова послеC-M-x
:) Вам нужноdefparameter
или отдельноsetf
.define-minor-mode
макрос: вызовdefvar
для определения карты. Оценка этого defvar во второй раз не имеет никакого эффекта.C-M-x
(eval-defun
) для переоценки,defvar
то переменная будет обновлена. Это особый случай вeval-defun
; если вы позвонитеeval-buffer
илиeval-region
тогда существующее значение не изменится.C-M-x
вdefvar
форме обновляется только сама переменная mode-map. Вы также должныC-M-x
вdefine-minor-mode
форме перевести измененную карту в «второстепенный режим». Я пытался выяснить, почему, расширяя макросы, но это вне меня.