insert image into text buffer

unutbu picture unutbu · Mar 20, 2012 · Viewed 16.5k times · Source

If I place

(insert-image (create-image "/tmp/test.png"))

in a buffer, place the cursor after the last parenthesis and evaluate it with C-x C-e, then the image /tmp/test.png is displayed in the buffer:

enter image description here

Pretty neat. But,

  1. I had to put the final parenthesis on a separate line, so the image is close to the left-hand side of the buffer. Is there a way to hide the (insert-image ...) text altogether?
  2. The text file contains the (insert-image ...) text only, not the image. I'm happy with that, but is there a way to tell emacs to automatically replace all the (insert-image ...) expressions by their corresponding images (after the file is opened) without me having to type C-x C-e after each one?

Answer

François Févotte picture François Févotte · Mar 20, 2012

Depending on exactly what you want to achieve, you might try one the the following ideas:

1. use org-mode as your buffer's major mode. You then have access to all the power of org-mode formatting, which includes linking to image files and displaying them:

an image without description
[[file:/tmp/image.png]]

an image with description
[[file:/tmp/image.png][my description]]

then you can call org-toggle-inline-images (C-c C-x C-v) to display images in the buffer (without a prefix argument, it will display only images without description; if you give a prefix argument, it will display all images)

2. write your own elisp code to insert images where you want them, and put it in an eval local pseudo-variable so that it is called when opening the file. For example:

foo
<HERE>
bar

# Local Variables:
#   eval: (progn (beginning-of-buffer)(search-forward "<HERE>")(insert-image (create-image "/tmp/image.png")))
# End:

You can of course wrap the elisp code into a neat function and simply call it from the eval local variable (which is cleaner, but forces you to have the function definition somewhere else, away from your file)