如何在Emacs中创建缓冲区本地键绑定?

时间:2014-12-05 17:23:03

标签: 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)))

并且它生成一个缓冲区,图像作为参数传递,但关闭缓冲区需要点击 C-x k 返回,一段时间后开始变得麻烦。简化这种瞬态缓冲区关闭的方法是为kill-this-buffer函数设置一个键绑定,但它需要特定于缓冲区,以免弄乱其他任何东西。问题是如何通过创建缓冲区来实现这种绑定。

4 个答案:

答案 0 :(得分:1)

网上的一些帖子暗示使用了local-key-binding,但有些方面它对我不起作用 - 当我显示图像并检查了键绑定时,我选择了{{ 1}}没有生效。经过一些实验并挖掘q个引用,我发现我需要使用elisp。所以现在我的函数看起来像这样:

local-set-key

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

答案 1 :(得分:1)

我建议您在致电special-mode后向switch-to-buffer添加电话。 从长远来看,你会想要使用自己的主要模式,所以你可以这样做:

(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)))))

答案 2 :(得分:1)

来自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)

撰稿:TiagoSaboga

要检查更改,请键入C-h b又名M-x describe-bindings

答案 3 :(得分:0)

创建次要模式:

(define-minor-mode my-mode "my doc" nil nil (make-sparse-keymap))

然后您可以使用此模式的 my-mode-map 来定义您的键绑定。使用 (my-mode) 激活模式。