* Elisp and overlay, how to show an image
@ 2024-07-06 21:12 Sébastien Gendre
2024-07-07 5:30 ` tomas
2024-07-07 13:12 ` Stefan Monnier via Users list for the GNU Emacs text editor
0 siblings, 2 replies; 6+ messages in thread
From: Sébastien Gendre @ 2024-07-06 21:12 UTC (permalink / raw)
To: Help Gnu Emacs Mailing List
Hello,
I am trying to show an image on the top of a buffer, before the first
line of text, and put a small margin at the bottom of the image.
I have read the Overlay manual [1] and the source code of the function
`org-display-inline-images`, but I have difficulties to understand how
to use overlay beginning and end parameters.
Here is the source code my first try:
;; Create an overlay at the first char of the buffer
(setq ov1 (make-overlay 1 1))
;; Create the image from a file
(setq my_image (create-image "~/Path/to/my/image.jpg"))
;; Put a new line, to avoid aving the image replacing the first char
(overlay-put ov1 'before-string "\n")
;; Put the image on the overlay
(overlay-put ov1 'display my_image)
When I evaluate this code, for example on the *scratch* buffer, I got a
new line before the first buffer char, but the image do not display.
Should I need to create, on the overlay, an empty space big enough to
put the image in it ? Or did I miss something on the manual ?
Best regards.
[1] https://www.gnu.org/software/emacs/manual/html_node/elisp/Overlays.html
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Elisp and overlay, how to show an image
2024-07-06 21:12 Elisp and overlay, how to show an image Sébastien Gendre
@ 2024-07-07 5:30 ` tomas
2024-07-07 13:12 ` Stefan Monnier via Users list for the GNU Emacs text editor
1 sibling, 0 replies; 6+ messages in thread
From: tomas @ 2024-07-07 5:30 UTC (permalink / raw)
To: Sébastien Gendre; +Cc: Help Gnu Emacs Mailing List
[-- Attachment #1: Type: text/plain, Size: 1081 bytes --]
On Sat, Jul 06, 2024 at 11:12:23PM +0200, Sébastien Gendre wrote:
> Hello,
>
> I am trying to show an image on the top of a buffer, before the first
> line of text, and put a small margin at the bottom of the image.
>
>
> I have read the Overlay manual [1] and the source code of the function
> `org-display-inline-images`, but I have difficulties to understand how
> to use overlay beginning and end parameters.
>
>
> Here is the source code my first try:
>
>
> ;; Create an overlay at the first char of the buffer
> (setq ov1 (make-overlay 1 1))
I think you have to give the overlay some width. Possibly you'll
have to insert some text (one char will be enough) to slap the
overlay on.
>
> ;; Create the image from a file
> (setq my_image (create-image "~/Path/to/my/image.jpg"))
>
> ;; Put a new line, to avoid aving the image replacing the first char
> (overlay-put ov1 'before-string "\n")
I'm not quite sure the before-string is displayed when the overlay has
a 'display property.
Cheers
--
t
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Elisp and overlay, how to show an image
2024-07-06 21:12 Elisp and overlay, how to show an image Sébastien Gendre
2024-07-07 5:30 ` tomas
@ 2024-07-07 13:12 ` Stefan Monnier via Users list for the GNU Emacs text editor
2024-07-07 15:31 ` Sébastien Gendre
1 sibling, 1 reply; 6+ messages in thread
From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2024-07-07 13:12 UTC (permalink / raw)
To: help-gnu-emacs
> Here is the source code my first try:
>
> ;; Create an overlay at the first char of the buffer
> (setq ov1 (make-overlay 1 1))
Please use (point-min) rather than 1.
> ;; Create the image from a file
> (setq my_image (create-image "~/Path/to/my/image.jpg"))
>
> ;; Put a new line, to avoid aving the image replacing the first char
> (overlay-put ov1 'before-string "\n")
>
> ;; Put the image on the overlay
> (overlay-put ov1 'display my_image)
As Tomas points out, the `display` property is obeyed only if it covers
characters. The usual way to "insert" an image without disrupting the
content of the buffer (e.g. in `put-image`) is to put the image (with
`display` property) on a *string* and then put that string in the
`before-string` (or `after-string`) property of an overlay.
(let ((ol (put-image (create-image "~/Path/to/my/image.jpg")
(point-min))))
(overlay-put ol 'after-string "\n"))
- Stefan
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Elisp and overlay, how to show an image
2024-07-07 13:12 ` Stefan Monnier via Users list for the GNU Emacs text editor
@ 2024-07-07 15:31 ` Sébastien Gendre
2024-07-07 19:05 ` Stefan Monnier via Users list for the GNU Emacs text editor
2024-07-08 0:20 ` Michael Heerdegen via Users list for the GNU Emacs text editor
0 siblings, 2 replies; 6+ messages in thread
From: Sébastien Gendre @ 2024-07-07 15:31 UTC (permalink / raw)
To: help-gnu-emacs
Stefan Monnier via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> writes:
> As Tomas points out, the `display` property is obeyed only if it covers
> characters. The usual way to "insert" an image without disrupting the
> content of the buffer (e.g. in `put-image`) is to put the image (with
> `display` property) on a *string* and then put that string in the
> `before-string` (or `after-string`) property of an overlay.
>
> (let ((ol (put-image (create-image "~/Path/to/my/image.jpg")
> (point-min))))
> (overlay-put ol 'after-string "\n"))
>
>
> - Stefan
<#secure method=pgpmime mode=sign>
Thank you, to Tomas and you, for your replies. It help me a lot.
I didn't know that (put-image) will return the overlay it created.
Is there a way to set a bottom margin to the added overlay, or to the
image, like with CSS on a web page ? Or do I need to add more "\n" with
(overlay-put) ?
I need to found a way to modify the way the image is shown. Controlling
the zoom, on which part it's centered and how the image is cut. I will
read more carefully the section "41.17 Images" of the elisp manual.
Until now, I was started by the overlays section of the manual.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Elisp and overlay, how to show an image
2024-07-07 15:31 ` Sébastien Gendre
@ 2024-07-07 19:05 ` Stefan Monnier via Users list for the GNU Emacs text editor
2024-07-08 0:20 ` Michael Heerdegen via Users list for the GNU Emacs text editor
1 sibling, 0 replies; 6+ messages in thread
From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2024-07-07 19:05 UTC (permalink / raw)
To: help-gnu-emacs
> I didn't know that (put-image) will return the overlay it created.
Indeed, I see that the docstring doesn't mention it, although the code
does it quite explicitly (i.e. not by accident). Seems like a docstring bug.
> Is there a way to set a bottom margin to the added overlay, or to the
> image, like with CSS on a web page ? Or do I need to add more "\n" with
> (overlay-put) ?
I'm not very knowledgeable about images, to be honest. If that doesn't
offer any useful options, you should be able to "similate" a bottom
margin by putting a `face` property on the "\n" string with an
appropriate `:height`, something like
(overlay-put ol 'affer-string
(propertize "\n" 'face '(:height 2.5)))
- Stefan
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Elisp and overlay, how to show an image
2024-07-07 15:31 ` Sébastien Gendre
2024-07-07 19:05 ` Stefan Monnier via Users list for the GNU Emacs text editor
@ 2024-07-08 0:20 ` Michael Heerdegen via Users list for the GNU Emacs text editor
1 sibling, 0 replies; 6+ messages in thread
From: Michael Heerdegen via Users list for the GNU Emacs text editor @ 2024-07-08 0:20 UTC (permalink / raw)
To: help-gnu-emacs
Sébastien Gendre <seb@k-7.ch> writes:
> Is there a way to set a bottom margin to the added overlay, or to the
> image, like with CSS on a web page ? Or do I need to add more "\n" with
> (overlay-put) ?
>
> I need to found a way to modify the way the image is shown. Controlling
> the zoom, on which part it's centered and how the image is cut. I will
> read more carefully the section "41.17 Images" of the elisp manual.
> Until now, I was started by the overlays section of the manual.
Have a look at (info "(elisp) Image Descriptors") - in particular,
:scale, :ascent, :margin. AFAIU you are allowed to manipulate the data
structure of an already created image "object". But note that not every
image type supports or implements all descriptors.
Michael.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-07-08 0:20 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-06 21:12 Elisp and overlay, how to show an image Sébastien Gendre
2024-07-07 5:30 ` tomas
2024-07-07 13:12 ` Stefan Monnier via Users list for the GNU Emacs text editor
2024-07-07 15:31 ` Sébastien Gendre
2024-07-07 19:05 ` Stefan Monnier via Users list for the GNU Emacs text editor
2024-07-08 0:20 ` Michael Heerdegen via Users list for the GNU Emacs text editor
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).