2014-12-05 207 views
2

我最近一直在研究Emacs的次要模式,其部分功能是在單獨的緩衝區中顯示圖像。到目前爲止,我一直在使用這樣的函數:如何在Emacs中創建緩衝區本地鍵綁定?

(defun create-buffer-with-image (name) 
    (let ((buffer (generate-new-buffer name)) 
     (image (get-svg-for-kanji-code name))) 
    (switch-to-buffer buffer) 
    (turn-on-iimage-mode) 
    (iimage-mode-buffer t) 
    (insert-image image))) 

和它產生作爲參數傳遞的圖像的緩衝區,但關閉緩衝要求打CXķ返回,它開始變得一段時間後很麻煩。簡化關閉這種瞬態緩衝區的方法是爲kill-this-buffer函數設置一個鍵綁定,但它需要是緩衝區特定的,以免混淆其他任何東西。問題是如何通過創建緩衝區來實現這種綁定。

回答

1

我有點被web建議使用local-key-binding上一些帖子誤導,但不知何故,它並沒有爲我工作 - 被顯示的圖像,我檢查了鍵綁定的時候,我選擇的q是未生效。經過一些實驗並通過elisp參考文獻進行挖掘後,我發現我需要使用local-set-key。所以,現在我的功能看起來是這樣的:

(defun create-buffer-with-image (name) 
    (let ((buffer (generate-new-buffer name)) 
     (image (get-svg-for-kanji-code name))) 
    (switch-to-buffer buffer) 
    (local-set-key (kbd "q") 'kill-this-buffer) 
    (turn-on-iimage-mode) 
    (iimage-mode-buffer t) 
    (insert-image image))) 

和新創建的圖像緩衝區可以很容易地通過按下q關閉。

+0

'地方設置key'修改本地鍵映射,在大多數情況下是主要模式鍵盤映射,這將影響使用該主要模式的所有*緩衝區。所以'local-set-key'是**不是**緩衝區本地效應。 (這只是「本地」,而不是每個緩衝區都可見的「全局」鍵映射。) – phils 2014-12-06 08:48:39

+1

感謝您的回覆,@phils。我對你的評論做了一些調查。當我使用'iimage-mode'顯示圖像時,該緩衝區的主要模式是'Fundamental'(其他次要模式是'iImg'和'MRev')。在做了local-set-key綁定之後,我檢查了所有這些模式下的鍵綁定,並且他們都沒有顯示出你警告過我的行爲。根據我的看法,它確實會導致緩衝區局部效應。如果我在這裏丟失了重要的東西,請糾正我。 – 2014-12-21 14:06:46

+1

在基本模式下,這是正確的。它不設置本地鍵盤映射,並且在這種情況下看起來'local-set-key'確實創建了緩衝區本地鍵盤映射。請注意,這不是正常行爲,因爲大多數主要模式都設置(和共享)本地鍵盤映射。 – phils 2014-12-21 20:39:26

1

我建議你在撥打switch-to-buffer後再撥打special-mode。 從長遠來看,你會希望使用自己的主要模式,所以你會怎麼做:

(define-derived-mode my-image-mode special-mode "MyImage" 
    "My own major mode to display images." 
    ;; We could add more things here 
) 

(defun create-buffer-with-image (name) 
    (with-current-buffer (generate-new-buffer name) 
    (my-image-mode) 
    (let ((image (get-svg-for-kanji-code name))) 
     (turn-on-iimage-mode) 
     (iimage-mode-buffer t) 
     (insert-image image) 
     (pop-to-bffer (current-buffer)))))