如何在Emacs中创建缓冲区本地键绑定?
问题描述:
我最近一直在研究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
函数设置一个键绑定,但它需要是缓冲区特定的,以免混淆其他任何东西。问题是如何通过创建缓冲区来实现这种绑定。
答
我有点被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关闭。
答
我建议你在拨打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)))))
'地方设置key'修改本地键映射,在大多数情况下是主要模式键盘映射,这将影响使用该主要模式的所有*缓冲区。所以'local-set-key'是**不是**缓冲区本地效应。 (这只是“本地”,而不是每个缓冲区都可见的“全局”键映射。) – phils 2014-12-06 08:48:39
感谢您的回复,@phils。我对你的评论做了一些调查。当我使用'iimage-mode'显示图像时,该缓冲区的主要模式是'Fundamental'(其他次要模式是'iImg'和'MRev')。在做了local-set-key绑定之后,我检查了所有这些模式下的键绑定,并且他们都没有显示出你警告过我的行为。根据我的看法,它确实会导致缓冲区局部效应。如果我在这里丢失了重要的东西,请纠正我。 – 2014-12-21 14:06:46
在基本模式下,这是正确的。它不设置本地键盘映射,并且在这种情况下看起来'local-set-key'确实创建了缓冲区本地键盘映射。请注意,这不是正常行为,因为大多数主要模式都设置(和共享)本地键盘映射。 – phils 2014-12-21 20:39:26