Я пытаюсь определить мой второстепенный режим, имитируя его после isearch-mode
(поскольку это своего рода интерактивный инструмент поиска и замены, я подумал, что это может быть хорошей отправной точкой). Мои команды работают хорошо (проверено на глобальных сочетаниях клавиш), но у меня есть серьезные проблемы с привязкой их локально (в карте второстепенных режимов) к некоторым ключам, а именно TAB и RET. Я делаю что-то вроде этого:
(defvar my-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "\s" 'my-command)
(define-key map "\t" 'another-one)
(define-key map "\r" 'yet-another)
map))
(Конечно, я действительно поместил свою раскладку ключей в minor-mode-map-alist.)
Хотя команда space-bound работает нормально, TAB и RET почему-то не работают. Если я изменю, например, "\ t" на "[f11]", он будет работать нормально. Я попытался использовать «векторную нотацию» ([? \ T]) с идентичными результатами (после C-h C-v-моей карты клавиш это не удивительно). Что может происходить?
Редактировать: , чтобы прояснить проблему, я попытался изолировать ее и придумал следующий код. Предположим, что я хочу иметь искусственный, довольно минимальный второстепенный режим tabbang
, в котором клавиша TAB вставляет восклицательный знак. Я делаю это:
(defvar tabbang-mode)
(add-to-list 'minor-mode-alist '(tabbang-mode tabbang-mode) t)
(defvar tabbang-mode-map
(let ((map (make-sparse-keymap)))
(define-key map [?\t] 'tabbang-insert-bang)
(define-key map [?\C-\t] 'tabbang-insert-bang)
(define-key map [f11] 'tabbang-insert-bang)
(define-key map [?\r] 'tabbang-done)
(define-key map [t] 'tabbang-other-char)
map))
(add-to-list 'minor-mode-map-alist `(tabbang-mode . ,tabbang-mode-map) t)
(defun tabbang-insert-bang ()
(interactive)
(insert "!"))
(defun tabbang-mode ()
(interactive)
(setq tabbang-mode " tabbang"))
(defun tabbang-other-char ()
(interactive)
(tabbang-done)
(setq unread-command-events
(append (listify-key-sequence (this-command-keys))
unread-command-events)))
(defun tabbang-done ()
(interactive)
(setq tabbang-mode nil))
В то время как в моем tabbang-mode
«другие» клавиши корректно выходят из режима и вставляют себя, f11 вставляет удар (правильно), TAB не выходит из режима (правильно), но ничего не вставляет (неправильно), C-TAB выдает ошибку «неопределенный ключ» (определенно неправильно), и RET выходит из режима (правильно), но вставляет новую строку (неправильно). И я попробовал «свежий» emacs (без загрузки site-file и моего .emacs), чтобы не вмешивался другой код (я боялся, что yasnippet каким-то образом захватит TAB и т. Д.) Что происходит?