如何在Emacs中进行缓冲区本地键绑定?

Woj*_*Gac 5 emacs elisp key-bindings

我最近一直在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)))
Run Code Online (Sandbox Code Playgroud)

并且会产生一个缓冲区,并以图像作为参数传递,但是关闭缓冲区需要点击C-x kReturn,这在一段时间后开始变得很麻烦。简化关闭此类瞬态缓冲区的方法是对该kill-this-buffer函数进行键绑定,但是它必须是特定于缓冲区的,以便不弄乱其他任何东西。问题是如何通过创建缓冲区来进行这种绑定。

law*_*ist 9

来自 EmacsWiki:https ://www.emacswiki.org/emacs/BufferLocalKeys

对于缓冲区本地键,您不能使用local-set-key,除非您想修改有问题的整个主要模式的键映射:local-set-key是主要模式的本地,而不是缓冲区。

对于缓冲区本地修改,请改用:

(use-local-map (copy-keymap foo-mode-map))
(local-set-key "d" 'some-function)
Run Code Online (Sandbox Code Playgroud)

作者:蒂亚戈萨博加


要检查更改,请键入C-h bakaM-x describe-bindings


Woj*_*Gac 2

我被网上一些建议使用 的帖子误导了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)))
Run Code Online (Sandbox Code Playgroud)

并且可以通过按 轻​​松关闭新创建的图像缓冲区q

  • `local-set-key` 修改本地键映射,在大多数情况下是主模式键映射,这将影响使用该主模式的*所有*缓冲区。所以“local-set-key”**不是**缓冲区本地效果。(它只是“本地”,而不是对每个缓冲区都可见的“全局”键映射。) (2认同)
  • 感谢您的回复,@phils。我对你的言论做了一些调查。当我使用“iimage-mode”显示图像时,该缓冲区的主要模式是“Fundamental”(其他次要模式是“iImg”和“MRev”)。在进行“local-set-key”绑定后,我检查了所有这些模式下的键绑定,没有一个显示出您警告我的行为。鉴于此,我的看法是它确实会导致缓冲区局部效应。如果我在这里遗漏了一些重要的东西,请纠正我。 (2认同)