我想要定義我的次要模式,在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