2014-12-05 101 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)))))