Jos*_*les 4 debugging emacs elisp
我的Emacs设置中有几行:
;; swap defaults
(define-key prog-mode-map (kbd "RET") 'newline-and-indent)
(define-key prog-mode-map (kbd "C-j") 'newline)
Run Code Online (Sandbox Code Playgroud)
这在我尝试的其他编程模式中可以正常工作.但在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)
Run Code Online (Sandbox Code Playgroud)
为什么是这样?如果重要,我在OS X 10.8.3上使用Emacs 24.3.
PS我最近了解到electric-indent-mode
,这可能会完成与这些键绑定非常相似的东西.然而,这个谜团仍然存在.
lun*_*orn 10
看看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))
Run Code Online (Sandbox Code Playgroud)
关键是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.")
Run Code Online (Sandbox Code Playgroud)
这个键映射也不会继承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))
Run Code Online (Sandbox Code Playgroud)
现在lisp-mode-shared-map
将继承prog-mode-map
,有效地复制错误修复.
归档时间: |
|
查看次数: |
546 次 |
最近记录: |