我的Emacs设置中有几行:
;; swap defaults (define-key prog-mode-map (kbd "RET") 'newline-and-indent) (define-key prog-mode-map (kbd "C-j") 'newline)
这在我尝试的其他编程模式中可以正常工作.但在Emacs Lisp模式下,RET仍然受到约束newline
并C-j仍然受到约束newline-and-indent
.即使在将键绑定代码移动到我的Emacs初始化的最开始之后,我仍然观察到这种令人困惑的行为.如果我为Emacs Lisp的模式创建单独的键绑定语句,我没有任何问题.
;; swap defaults for most programming modes (define-key prog-mode-map (kbd "RET") 'newline-and-indent) (define-key prog-mode-map (kbd "C-j") 'newline) ;; swap defaults in Emacs Lisp mode too (define-key emacs-lisp-mode-map (kbd "RET") 'newline-and-indent) (define-key emacs-lisp-mode-map (kbd "C-j") 'newline)
为什么是这样?如果重要,我在OS X 10.8.3上使用Emacs 24.3.
PS我最近了解到electric-indent-mode
,这可能会完成与这些键绑定非常相似的东西.然而,这个谜团仍然存在.
看看emacs-lisp-mode-map
in 的定义lisp-modes.el
:
(defvar emacs-lisp-mode-map (let ((map (make-sparse-keymap "Emacs-Lisp")) (menu-map (make-sparse-keymap "Emacs-Lisp")) (lint-map (make-sparse-keymap)) (prof-map (make-sparse-keymap)) (tracing-map (make-sparse-keymap))) (set-keymap-parent map lisp-mode-shared-map) … map))
关键是set-keymap-parent
电话.虽然Emacs Lisp Mode继承自Prog Mode,但它的keymap不是继承自prog-mode-map
,而是从以下定义的另一个keymap 继承lisp-modes.el
:
(defvar lisp-mode-shared-map (let ((map (make-sparse-keymap))) (define-key map "\e\C-q" 'indent-sexp) (define-key map "\177" 'backward-delete-char-untabify) map) "Keymap for commands shared by all sorts of Lisp modes.")
这个键映射也不会继承prog-mode-map
,因此绑定prog-mode-map
确实对Emacs Lisp模式没有任何影响.
这可以说是Emacs中的一个错误.
更新: 我写信给邮件列表.
更新2: 相应的错误报告
更新3:该错误已得到修复.在当前快照构建中,您的键绑定应该按预期工作.作为早期版本的Emacs的解决方法,您可以在以下代码中使用以下代码段init.el
:
(unless (keymap-parent lisp-mode-shared-map) (set-keymap-parent lisp-mode-shared-map prog-mode-map))
现在lisp-mode-shared-map
将继承prog-mode-map
,有效地复制错误修复.