emacs,python-mode.el定义 - 键映射赋值

时间:2012-07-19 22:53:47

标签: emacs key-bindings python-mode

当我在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'才能在我的计算机上工作?

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

2 个答案:

答案 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中:

  • 您的模式行应显示字母“Py”
  • type M-:ENTER major-mode ENTER - >这应该将“python-mode”打印到迷你缓冲区

答案 1 :(得分: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作为键映射变量。其他键映射用于辅助缓冲区。