2012-07-19 151 views
1

当我在emacs中加载python-mode.el文件时,我没有得到任何指定的键绑定。 我开始与文件播放,并注意到,当我改变:emacs,python-mode.el定义键映射分配

(define-key map [(control c)(\#)] 'py-comment-region) 

到:

(define-key global-map [(control c)(\#)] 'py-comment-region) 

它工作正常。

我去看看那里的定义地图变量和看到:

(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.") 

被定义好了的“映射”变量?我应该对init文件做一些更改吗?我假设这个文件适用于其他人,那么为什么我需要将“地图”变量改为“全局地图”,以便它可以在我的电脑中工作?

我正在虚拟机中运行,如果有任何帮助。

回答

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在两个方面:

  • 你的模式行应显示字母 “PY”
  • 类型M-:ENTER主要模式ENTER - >这应该打印“python模式”的迷你缓冲区
+0

谢谢,显然加载的Python的环境仍然是python.el而不是python-mode.el。我在init.el中添加了一些行来改变它,现在它工作正常。 – 2012-07-20 09:16:20

0

每个主要模式和一些次要模式都有各自的键盘映射,它覆盖在全局键盘映射(global-map)上。当您按下某个键时,Emacs会尝试在叠加的键盘映射中找到该键的绑定,并返回到“更全局”的键,直到它到达全局映射。这就是为什么global-map有效,而map没有。

在lisp中,let用于绑定局部变量。 map变量不存在于let之外(或者它确实存在,但它可能不是您想要的那个)。阅读letdefvar(例如C-h f defvar)的文档。

你需要找出哪些键盘映射在主要模式中使用,并且使用上define-key。在这种情况下,(define-key python-mode-map (kbd "C-C#") 'py-comment-region)可能会工作。注:我不使用Python-mode.el,但看着它好像它采用python-mode-map的键盘映射变量的来源。其他键盘映射用于辅助缓冲区。