1

当我在 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.")

'map' 变量定义好吗?我应该对我的初始化文件做一些更改吗?我假设该文件对其他人都有效,那么为什么我需要将“地图”变量更改为“全局地图”才能在我的计算机上工作?

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

4

2 回答 2

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”打印到 minibuffer
于 2012-07-20T04:32:07.103 回答
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用作键映射变量。其他键映射用于辅助缓冲区。

于 2012-07-20T04:26:43.753 回答