Search code examples
emacselispkey-bindings

How to make a buffer-local key binding in Emacs?


I've been working on an Emacs minor mode lately and part of its functionality was displaying images in separate buffers. So far I've been using a function like this:

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

and it produces a buffer with the image passed as argument, but closing the buffer requires hitting C-x k and Return, which started to get cumbersome after a while. The way to simplify closing of such transient buffers would be to have a key binding for the kill-this-buffer function, but it would need to be buffer-specific, so as not to mess up anything else. The question is how to make such a binding with the creation of a buffer.


Solution

  • I was a bit mislead by some posts on the web suggesting the use of local-key-binding, but somehow it did not work for me - when the image was displayed and I examined the key bindings, my choice of q was not in effect. After some experimentation and digging through elisp references I found that I needed to use local-set-key. So now my function looks like this:

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

    and the newly created image buffer can easily be closed by pressing q.