2012-07-19 152 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的鍵盤映射變量的來源。其他鍵盤映射用於輔助緩衝區。