I'm looking for a way to display both text and a picture in Emacs in a pop-up, as it is done in Wikipedia. Is there already a solution for this?
It works if
tooltip-mode is enabled with:
GNU Emacs 26.1 (build 1, x86<sub>64</sub>-unknown-cygwin, GTK+ Version 3.22.28) of 2018-05-28
(Note especially the
GTK+ toolkit since that feature may be toolkit dependent.)
- Put the
'help-echotext property on the text to be augmented with the tooltip.
- Append a space to the help echo text.
- Propertize that space with the
'displayproperty containing the image you want to show.
There follows a very silly example. For that example you also need SVG-support compiled into Emacs.
(with-current-buffer (get-buffer-create "*ToolTipTest*") (tooltip-mode) (insert (propertize "Some text" 'help-echo (concat "Help text" (propertize " " 'display (let ((svg (svg-create 100 100))) (svg-ellipse svg 50 50 40 40 :fill-color "red") (svg-text svg "SVG" :x 30 :y 55 :font-size 20 :stroke-color "blue" :fill-color "red") (svg-image svg)))))) (display-buffer (current-buffer)))
If you hoover the mouse pointer over
Some text in the newly created buffer
<*ToolTipTest*> you get the following image:
Your original question had that
org-mode-tag. So I will also demonstrate a solution special to
You can use
org-link-set-parameters to set
:help-echo property of links in
(defun my-download-as-string (url) "Download file from URL and return it as string." (let ((image-buf (url-retrieve-synchronously url))) (when image-buf (with-current-buffer image-buf (goto-char (point-min)) (when (looking-at "HTTP/") (delete-region (point-min) (progn (re-search-forward "\n[\n]+") (point)))) (buffer-substring-no-properties (point-min) (point-max)))))) (defun my-download-image (url) "Download URL as image." (create-image (my-download-as-string url) (image-type-from-file-name url) t)) (defun my-org-tooltip-jpeg-images (window object position) "Org link :help-echo function for displaying images from the net." (when (bufferp object) (with-current-buffer object (save-excursion (goto-char position) (let* ((el (org-element-context)) (el-type (org-element-type el)) (prot (org-element-property :type el)) (link (org-element-property :raw-link el)) (b (org-element-property :begin el)) (e (org-element-property :end el)) (img (get-text-property b :help-echo-image))) (if (and (eq el-type 'link) (string-match "https?" prot) (image-type-from-file-name link)) (progn (unless img (setq img (my-download-image link)) (add-text-properties b (1+ b) (list :help-echo-image img))) (concat "LINK: " link " " (propertize " " 'display img))) link)))))) (org-link-set-parameters "http" :help-echo #'my-org-tooltip-jpeg-images) (org-link-set-parameters "https" :help-echo #'my-org-tooltip-jpeg-images)
An impression how it looks like when one hoovers over links in org-mode after running the above code:
It also works with
display-local-help called by C-h .. In that case the image is shown in the echo area: