24

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?
unutbu
  • 842,883
  • 184
  • 1,785
  • 1,677
  • 1
    insert-image actually doesn't insert any image into the buffer to save it on to the disk instead its just visual representation. you didn't mention the purpose. In org-mode you can link pictures in the buffer and display them if you want, and export them. is that what you are looking for.? – kindahero Mar 20 '12 at 03:55
  • I'm lookimg for true inline images - where the image data exists in the emacs buffer, probably uuencoded, rather than a pointer to a file containing the image-data. It's a pain to manage separate files. – Krazy Glew Jul 13 '12 at 21:30

3 Answers3

33

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)

François Févotte
  • 19,520
  • 4
  • 51
  • 74
30

Take a look at iimage-mode, the inline image minor mode. It's included since Emacs-23, IIRC.

M-xiimage-mode

Toby Speight
  • 27,591
  • 48
  • 66
  • 103
huaiyuan
  • 26,129
  • 5
  • 57
  • 63
  • 6
    +1: I did not know of this mode, but this is definitely the way to go: standard and not overfeatured. – François Févotte Mar 20 '12 at 16:12
  • 2
    Here's a Wayback Machine link to the original link: https://web.archive.org/web/20120424055608/http://www.netlaputa.ne.jp/~kose/Emacs/iimage.html – SCFrench Apr 20 '16 at 18:56
1

If you don't want the text (actually lisp code) in the buffer, don't type it into the buffer in the first place. Try M-x eval-expression and enter your lisp code after the Eval prompt:

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

Then the image is inserted at point in the buffer. You can define a function like this:

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

Either type M-x eval-expression and the above defun or type it into a buffer and C-x C-e after it. Then you can insert the image using M-x my-insert-image.

David Andersson
  • 755
  • 4
  • 9
  • 1
    Probably better to use `(defun my-insert-image (image-file) (interactive "fImage File: ") (insert-image (create-image image-file)))`. – Inaimathi Mar 20 '12 at 12:32
  • Or as the manual says (http://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Images.html) (defimage test-image ((:type xpm :file "~/test1.xpm") (:type xbm :file "~/test1.xbm"))) (insert-image test-image) – yPhil Aug 02 '12 at 00:36