当我在emacs中加载python-mode.el文件时,我没有得到任何指定的键绑定。 我开始玩这个文件并发现当我改变时:
(define-key map [(control c)(\#)] 'py-comment-region)
为:
(define-key global-map [(control c)(\#)] 'py-comment-region)
它工作正常。
我去看看定义map变量的位置并看到了:
(defvar py-shell-map nil
"Keymap used in *Python* shell buffers.")
;; used by py-completion-at-point, the way of python.el
(defvar python-shell-map
(let ((map (copy-keymap comint-mode-map)))
(define-key map [tab] 'py-shell-complete)
(define-key map "\C-c-" 'py-up-exception)
(define-key map "\C-c=" 'py-down-exception)
map)
"Keymap used in *Python* shell buffers.")
'map'变量是否定义正常?我应该对我的init文件进行一些更改吗?我假设这个文件适用于其他所有人,那么为什么我需要将'map'变量更改为'global-map'才能在我的计算机上工作?
如果有任何帮助,我正在虚拟机中运行。
答案 0 :(得分:2)
您引用的代码map
定义的代码实际上并不是代码的相关部分。它是用于python shell的不同键映射,它不是在Emacs中编辑python文件时使用的键映射。
您正在编辑的行显示在以下代码块内的python-mode
中:
(defvar python-mode-map)
(setq python-mode-map
(let ((map (make-sparse-keymap)))
;; electric keys
(define-key map [(:)] 'py-electric-colon)
(define-key map [(\#)] 'py-electric-comment)
...
正如您所看到的,变量map
首先被初始化为“稀疏键映射”,然后在该映射中定义某些键绑定,最后将映射设置为python-mode-map
的值。后者是python-mode
中的缓冲区中使用的键映射。
所以键绑定应该有效 - 但当然只能在python-mode
的缓冲区中。要激活缓冲区中的python-mode
,请键入 M-x python-mode 。这仅在加载文件python-mode.el
后才有效。
您可以通过两种方式检查当前缓冲区是否在python-mode
中:
答案 1 :(得分:0)
每个主要模式和一些次要模式都有自己的键映射,它覆盖在全局键映射(global-map
)上。当您按下某个键时,Emacs会尝试在重叠的键盘图中找到该键的绑定,然后回到“更全局”的键,直到它到达全局映射。这就是global-map
有效而map
无效的原因。
在lisp中,let
用于绑定局部变量。 map
变量不存在于let
之外(或者可能存在,但它可能不是您想要的变量)。阅读let
和defvar
的文档(例如C-h f defvar
)。
您需要确定在主模式下使用的是哪个键映射,并在其上使用define-key
。在这种情况下,(define-key python-mode-map (kbd "C-c #") 'py-comment-region)
可能会起作用。注:我不使用python-mode.el,但查看源代码似乎使用python-mode-map
作为键映射变量。其他键映射用于辅助缓冲区。