我正在尝试定义我的次要模式,然后模仿它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])(在 Ch Cv-ing 我的键盘映射之后,这并不奇怪)。可能会发生什么?
编辑:为了澄清问题,我试图将其隔离并提出以下代码。假设我想要一个人工的、相当最小的次要模式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(没有加载站点文件和我的 .emacs),所以没有其他代码应该干预(我害怕 yasnippet 以某种方式捕获 TAB 等)这是怎么回事?