mbo*_*ork 2 emacs elisp keymapping
我试图定义我的次要模式,之后模仿它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))
Run Code Online (Sandbox Code Playgroud)
(当然,我确实把我的keymap放到了minor-mode-map-alist中.)
虽然空间绑定命令工作正常,但TAB和RET在某种程度上没有.如果我改变,例如,"\ t"改为"[f11]",它可以正常工作.我尝试使用"矢量符号"([?\ t]),结果相同(在我的键盘映射之后,这并不奇怪).可能会发生什么?
编辑:澄清问题,我试图隔离它,我想出了以下代码.假设我想要一个人为的,相当小的次要模式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))
Run Code Online (Sandbox Code Playgroud)
在我的tabbang-mode"其他"键正确退出模式并自行插入时,f11插入一声(正确),TAB不退出模式(正确),但不插入(错误),C-TAB产生"未定义键"错误(肯定是错误的),RET退出模式(正确),但插入换行符(错误).我尝试了一个"新鲜的"emacs(没有加载站点文件和我的.emacs),所以没有其他代码应该介入(我害怕yasnippet以某种方式捕获TAB等)发生了什么?
我相信你可以改变他们(kbd "<tab>"),并(kbd "<return>")分别代替"\ t"和"\ r".
为了回应您的编辑,是的,以下对我来说非常有效:
...
(defvar tabbang-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "<tab>") 'tabbang-insert-bang)
(define-key map (kbd "<C-tab>") 'tabbang-insert-bang)
(define-key map (kbd "<f11>") 'tabbang-insert-bang)
(define-key map (kbd "<return>") 'tabbang-done)
(define-key map (kbd "t") 'tabbang-other-char)
map))
(add-to-list 'minor-mode-map-alist `(tabbang-mode . ,tabbang-mode-map) t)
...
Run Code Online (Sandbox Code Playgroud)