我想要定义我的次要模式,在isearch-mode
之后模仿它(因为它是一种交互式搜索和替换工具,我认为它可能是一个很好的起点)。我的命令工作得很好(在全局键盘绑定上测试过),但是我在本地(在次要模式映射中)将某些键绑定到某些键,即TAB和RET时存在严重问题。我在做这样的事情:如何在Emacs次要模式下重新绑定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))
(当然,我做把我的键盘映射到较小的模式,地图ALIST)
虽然空间限制的命令工作正常,TAB和RET不知何故。如果我将“\ t”更改为“[f11]”,则它工作正常。我尝试了使用“向量表示法”([?\ t])获得相同结果(在C-h C-v-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等)发生了什么?
这是不正确的;我认为你的意思是'(kbd“)'和'(kbd”)''。 –
tripleee
2012-02-04 10:44:32
没错。除此之外 - 我不想绑定C-TAB,我想要TAB! (我也有C-TAB的问题,一分钟后我要编辑这个问题来反映这一点。) – mbork 2012-02-04 11:23:12
哎呀。是的,我不小心加了'C's。固定。 – Inaimathi 2012-02-04 14:26:53