* How to temporarily show an image in an Emacs buffer?
@ 2023-03-08 4:53 Marcin Borkowski
2023-03-08 5:23 ` Marcin Borkowski
` (2 more replies)
0 siblings, 3 replies; 15+ messages in thread
From: Marcin Borkowski @ 2023-03-08 4:53 UTC (permalink / raw)
To: Help Gnu Emacs mailing list
Hi all,
I need to insert an image in the buffer in a way that doesn't interfere
with the undo mechanism. In other words, `insert-image' won't help me
because (as I understand it) it needs to insert a space or some other
string so that it can put display property on it. How to achieve this?
To be more precise, imagine I have this buffer:
xxxxxxxxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyyyyyyyy
(two lines of text). I want it to look like this:
xxxxxxxxxxxxxxxxxxxxxxxx
+----------------------+
| |
+----------------------+
yyyyyyyyyyyyyyyyyyyyyyyy
in other words, I want a rectangular image (inserted by `insert-image'
or actually `svg-insert-image') to appear between them, but in a way
that doesn't actually change the buffer contents.
Alternatively, it _may_ change the buffer contents but in a way that is
not recorded in `buffer-undo-list'. Is that possible?
TIA,
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-08 4:53 How to temporarily show an image in an Emacs buffer? Marcin Borkowski
@ 2023-03-08 5:23 ` Marcin Borkowski
2023-03-08 6:19 ` Ruijie Yu via Users list for the GNU Emacs text editor
2023-03-08 16:41 ` Michael Heerdegen
2023-03-08 13:38 ` Eli Zaretskii
2023-03-10 16:26 ` Stefan Monnier via Users list for the GNU Emacs text editor
2 siblings, 2 replies; 15+ messages in thread
From: Marcin Borkowski @ 2023-03-08 5:23 UTC (permalink / raw)
To: Help Gnu Emacs mailing list
On 2023-03-08, at 05:53, Marcin Borkowski <mbork@mbork.pl> wrote:
> Alternatively, it _may_ change the buffer contents but in a way that is
> not recorded in `buffer-undo-list'. Is that possible?
I did some experimenting, and this
(defvar no-undo-marker (make-marker))
(defun no-undo-insert ()
"Test undo."
(save-excursion
(let ((buffer-undo-list))
(set-marker no-undo-marker (point))
(insert "this can't be undone\n"))))
(defun no-undo-uninsert ()
(save-excursion
(goto-char no-undo-marker)
(let ((buffer-undo-list))
(when (looking-at-p "this can't be undone\n")
(delete-char 21)))))
seems to do the trick, but depending on the order of typing and calling
these functions, the undo list becomes corrupted (I get "primitive-undo:
Changes to be undone are outside visible portion of buffer").
Any hints?
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-08 5:23 ` Marcin Borkowski
@ 2023-03-08 6:19 ` Ruijie Yu via Users list for the GNU Emacs text editor
2023-03-08 16:01 ` Marcin Borkowski
2023-03-08 16:41 ` Michael Heerdegen
1 sibling, 1 reply; 15+ messages in thread
From: Ruijie Yu via Users list for the GNU Emacs text editor @ 2023-03-08 6:19 UTC (permalink / raw)
To: Marcin Borkowski; +Cc: help-gnu-emacs
Marcin Borkowski <mbork@mbork.pl> writes:
> On 2023-03-08, at 05:53, Marcin Borkowski <mbork@mbork.pl> wrote:
>
>> Alternatively, it _may_ change the buffer contents but in a way that is
>> not recorded in `buffer-undo-list'. Is that possible?
>
> I did some experimenting, and this
>
> (defvar no-undo-marker (make-marker))
> (defun no-undo-insert ()
> "Test undo."
> (save-excursion
> (let ((buffer-undo-list))
> (set-marker no-undo-marker (point))
> (insert "this can't be undone\n"))))
>
> (defun no-undo-uninsert ()
> (save-excursion
> (goto-char no-undo-marker)
> (let ((buffer-undo-list))
> (when (looking-at-p "this can't be undone\n")
> (delete-char 21)))))
>
> seems to do the trick, but depending on the order of typing and calling
> these functions, the undo list becomes corrupted (I get "primitive-undo:
> Changes to be undone are outside visible portion of buffer").
>
> Any hints?
Maybe you can make use of overlays [1]? That sounds like a great fit
according to the description of your need.
[1]: (info "(elisp) Managing Overlays")
--
Best,
RY
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-08 4:53 How to temporarily show an image in an Emacs buffer? Marcin Borkowski
2023-03-08 5:23 ` Marcin Borkowski
@ 2023-03-08 13:38 ` Eli Zaretskii
2023-03-08 16:00 ` Marcin Borkowski
2023-03-10 16:26 ` Stefan Monnier via Users list for the GNU Emacs text editor
2 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2023-03-08 13:38 UTC (permalink / raw)
To: help-gnu-emacs
> From: Marcin Borkowski <mbork@mbork.pl>
> Date: Wed, 08 Mar 2023 05:53:46 +0100
>
> I need to insert an image in the buffer in a way that doesn't interfere
> with the undo mechanism. In other words, `insert-image' won't help me
> because (as I understand it) it needs to insert a space or some other
> string so that it can put display property on it. How to achieve this?
You can put a display property on the existing text in the buffer
without inserting any new text. See the node "Other Display
Properties" in the ELisp manual, where it describes the
‘(image . IMAGE-PROPS)’ display property spec.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-08 13:38 ` Eli Zaretskii
@ 2023-03-08 16:00 ` Marcin Borkowski
2023-03-13 8:29 ` Jean Louis
0 siblings, 1 reply; 15+ messages in thread
From: Marcin Borkowski @ 2023-03-08 16:00 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: help-gnu-emacs
On 2023-03-08, at 14:38, Eli Zaretskii <eliz@gnu.org> wrote:
>> From: Marcin Borkowski <mbork@mbork.pl>
>> Date: Wed, 08 Mar 2023 05:53:46 +0100
>>
>> I need to insert an image in the buffer in a way that doesn't interfere
>> with the undo mechanism. In other words, `insert-image' won't help me
>> because (as I understand it) it needs to insert a space or some other
>> string so that it can put display property on it. How to achieve this?
>
> You can put a display property on the existing text in the buffer
> without inserting any new text. See the node "Other Display
> Properties" in the ELisp manual, where it describes the
> ‘(image . IMAGE-PROPS)’ display property spec.
You're right, of course, but it's a bit more complex than that. Since
an overlay with the `image' property "hides" the text beneath it, the
key is to create an overlay with a `before-string' property whose value
is a dummy string (say, a space), and put the `image' /text/ property on
that very string. I did some experiments and it seems to work, though
I'll have a (hopefully) working prototype by the end of the week (no
more time for this today).
Thanks a lot! (Also, once I have it working, I will definitely describe
it on my blog; I may also copy it here if someone is interested.)
Best,
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-08 6:19 ` Ruijie Yu via Users list for the GNU Emacs text editor
@ 2023-03-08 16:01 ` Marcin Borkowski
0 siblings, 0 replies; 15+ messages in thread
From: Marcin Borkowski @ 2023-03-08 16:01 UTC (permalink / raw)
To: Ruijie Yu; +Cc: help-gnu-emacs
On 2023-03-08, at 07:19, Ruijie Yu <ruijie@netyu.xyz> wrote:
> Marcin Borkowski <mbork@mbork.pl> writes:
>
>> On 2023-03-08, at 05:53, Marcin Borkowski <mbork@mbork.pl> wrote:
>>
>>> Alternatively, it _may_ change the buffer contents but in a way that is
>>> not recorded in `buffer-undo-list'. Is that possible?
>>
>> I did some experimenting, and this
>>
>> (defvar no-undo-marker (make-marker))
>> (defun no-undo-insert ()
>> "Test undo."
>> (save-excursion
>> (let ((buffer-undo-list))
>> (set-marker no-undo-marker (point))
>> (insert "this can't be undone\n"))))
>>
>> (defun no-undo-uninsert ()
>> (save-excursion
>> (goto-char no-undo-marker)
>> (let ((buffer-undo-list))
>> (when (looking-at-p "this can't be undone\n")
>> (delete-char 21)))))
>>
>> seems to do the trick, but depending on the order of typing and calling
>> these functions, the undo list becomes corrupted (I get "primitive-undo:
>> Changes to be undone are outside visible portion of buffer").
>>
>> Any hints?
>
> Maybe you can make use of overlays [1]? That sounds like a great fit
> according to the description of your need.
>
> [1]: (info "(elisp) Managing Overlays")
As I said in my reply to Eli, you were right. (I knew about overlays,
but I didn't know that apparently you can use an overlay with
a `before-string' property /and/ put another display property on the
/string/ being the value of `before-string', which is kind of cool!)
Thanks,
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-08 5:23 ` Marcin Borkowski
2023-03-08 6:19 ` Ruijie Yu via Users list for the GNU Emacs text editor
@ 2023-03-08 16:41 ` Michael Heerdegen
2023-03-11 8:14 ` Marcin Borkowski
1 sibling, 1 reply; 15+ messages in thread
From: Michael Heerdegen @ 2023-03-08 16:41 UTC (permalink / raw)
To: help-gnu-emacs
Marcin Borkowski <mbork@mbork.pl> writes:
> On 2023-03-08, at 05:53, Marcin Borkowski <mbork@mbork.pl> wrote:
>
> > Alternatively, it _may_ change the buffer contents but in a way that is
> > not recorded in `buffer-undo-list'. Is that possible?
>
> I did some experimenting, and this
>
> (defvar no-undo-marker (make-marker))
> (defun no-undo-insert ()
> "Test undo."
> (save-excursion
> (let ((buffer-undo-list))
> (set-marker no-undo-marker (point))
> (insert "this can't be undone\n"))))
> [...]
Regardless of what has already been said, just for the sake of
completeness: AFAIK the intended way to inhibit the recording of undo
is to bind buffer-undo-list to t (not to nil).
There are lots of use case in the sources - see e.g.
`image-toggle-display-text'.
Michael.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-08 4:53 How to temporarily show an image in an Emacs buffer? Marcin Borkowski
2023-03-08 5:23 ` Marcin Borkowski
2023-03-08 13:38 ` Eli Zaretskii
@ 2023-03-10 16:26 ` Stefan Monnier via Users list for the GNU Emacs text editor
2023-03-11 8:15 ` Marcin Borkowski
2 siblings, 1 reply; 15+ messages in thread
From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2023-03-10 16:26 UTC (permalink / raw)
To: help-gnu-emacs
> I need to insert an image in the buffer in a way that doesn't interfere
> with the undo mechanism. In other words, `insert-image' won't help me
> because (as I understand it) it needs to insert a space or some other
> string so that it can put display property on it. How to achieve this?
`put-image` maybe?
Stefan
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-08 16:41 ` Michael Heerdegen
@ 2023-03-11 8:14 ` Marcin Borkowski
2023-03-12 3:37 ` Michael Heerdegen
0 siblings, 1 reply; 15+ messages in thread
From: Marcin Borkowski @ 2023-03-11 8:14 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: help-gnu-emacs
On 2023-03-08, at 17:41, Michael Heerdegen <michael_heerdegen@web.de> wrote:
> Marcin Borkowski <mbork@mbork.pl> writes:
>
>> On 2023-03-08, at 05:53, Marcin Borkowski <mbork@mbork.pl> wrote:
>>
>> > Alternatively, it _may_ change the buffer contents but in a way that is
>> > not recorded in `buffer-undo-list'. Is that possible?
>>
>> I did some experimenting, and this
>>
>> (defvar no-undo-marker (make-marker))
>> (defun no-undo-insert ()
>> "Test undo."
>> (save-excursion
>> (let ((buffer-undo-list))
>> (set-marker no-undo-marker (point))
>> (insert "this can't be undone\n"))))
>> [...]
>
> Regardless of what has already been said, just for the sake of
> completeness: AFAIK the intended way to inhibit the recording of undo
> is to bind buffer-undo-list to t (not to nil).
Thanks, I missed that.
> There are lots of use case in the sources - see e.g.
> `image-toggle-display-text'.
I didn't experiment with this, but I'm afraid that interlacing changes
to the buffer done by the user (when recording undo changes) and by the
Elisp code (while `buffer-undo-list' is bound to `t') may result in
undoing being impossible.
Anyway, I solved /my/ particular problem using overlays. Thanks!
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-10 16:26 ` Stefan Monnier via Users list for the GNU Emacs text editor
@ 2023-03-11 8:15 ` Marcin Borkowski
0 siblings, 0 replies; 15+ messages in thread
From: Marcin Borkowski @ 2023-03-11 8:15 UTC (permalink / raw)
To: Stefan Monnier; +Cc: help-gnu-emacs
On 2023-03-10, at 17:26, Stefan Monnier via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> wrote:
>> I need to insert an image in the buffer in a way that doesn't interfere
>> with the undo mechanism. In other words, `insert-image' won't help me
>> because (as I understand it) it needs to insert a space or some other
>> string so that it can put display property on it. How to achieve this?
>
> `put-image` maybe?
Oh, thanks! It looks like I reinvented it (although in a less flexible
form, sufficient for my purposes). I guess I'll switch to `put-image'.
Best,
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-11 8:14 ` Marcin Borkowski
@ 2023-03-12 3:37 ` Michael Heerdegen
2023-03-12 7:46 ` Marcin Borkowski
0 siblings, 1 reply; 15+ messages in thread
From: Michael Heerdegen @ 2023-03-12 3:37 UTC (permalink / raw)
To: help-gnu-emacs
Marcin Borkowski <mbork@mbork.pl> writes:
> I didn't experiment with this, but I'm afraid that interlacing changes
> to the buffer done by the user (when recording undo changes) and by the
> Elisp code (while `buffer-undo-list' is bound to `t') may result in
> undoing being impossible.
Yes, what is allowed is very limited. AFAIU anything changing any
positions is already very bad (undo positions are numbers, not markers).
Michael.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-12 3:37 ` Michael Heerdegen
@ 2023-03-12 7:46 ` Marcin Borkowski
0 siblings, 0 replies; 15+ messages in thread
From: Marcin Borkowski @ 2023-03-12 7:46 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: help-gnu-emacs
On 2023-03-12, at 04:37, Michael Heerdegen <michael_heerdegen@web.de> wrote:
> Marcin Borkowski <mbork@mbork.pl> writes:
>
>> I didn't experiment with this, but I'm afraid that interlacing changes
>> to the buffer done by the user (when recording undo changes) and by the
>> Elisp code (while `buffer-undo-list' is bound to `t') may result in
>> undoing being impossible.
>
> Yes, what is allowed is very limited. AFAIU anything changing any
> positions is already very bad (undo positions are numbers, not markers).
Thanks, that confirms my reservations, and shows that overlays are the
way to go.
Best,
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-08 16:00 ` Marcin Borkowski
@ 2023-03-13 8:29 ` Jean Louis
2023-03-13 9:27 ` Marcin Borkowski
2023-04-01 15:57 ` Marcin Borkowski
0 siblings, 2 replies; 15+ messages in thread
From: Jean Louis @ 2023-03-13 8:29 UTC (permalink / raw)
To: Marcin Borkowski; +Cc: Eli Zaretskii, help-gnu-emacs
* Marcin Borkowski <mbork@mbork.pl> [2023-03-08 19:02]:
> Thanks a lot! (Also, once I have it working, I will definitely describe
> it on my blog; I may also copy it here if someone is interested.)
I am interested in feature:
1. To temporary show image in buffer
2. To remove that image, as it was temporary shown.
Did you make functions to do that?
--
Jean
Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns
In support of Richard M. Stallman
https://stallmansupport.org/
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-13 8:29 ` Jean Louis
@ 2023-03-13 9:27 ` Marcin Borkowski
2023-04-01 15:57 ` Marcin Borkowski
1 sibling, 0 replies; 15+ messages in thread
From: Marcin Borkowski @ 2023-03-13 9:27 UTC (permalink / raw)
To: Jean Louis; +Cc: Eli Zaretskii, help-gnu-emacs
On 2023-03-13, at 09:29, Jean Louis <bugs@gnu.support> wrote:
> * Marcin Borkowski <mbork@mbork.pl> [2023-03-08 19:02]:
>> Thanks a lot! (Also, once I have it working, I will definitely describe
>> it on my blog; I may also copy it here if someone is interested.)
>
> I am interested in feature:
>
> 1. To temporary show image in buffer
>
> 2. To remove that image, as it was temporary shown.
>
> Did you make functions to do that?
Not yet. But it will be blogged about (no sooner than in April, though
– I have a buffer until the end of March). I can mention it here, too,
unless I forget.
Best,
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: How to temporarily show an image in an Emacs buffer?
2023-03-13 8:29 ` Jean Louis
2023-03-13 9:27 ` Marcin Borkowski
@ 2023-04-01 15:57 ` Marcin Borkowski
1 sibling, 0 replies; 15+ messages in thread
From: Marcin Borkowski @ 2023-04-01 15:57 UTC (permalink / raw)
To: Jean Louis; +Cc: Eli Zaretskii, help-gnu-emacs
On 2023-03-13, at 09:29, Jean Louis <bugs@gnu.support> wrote:
> * Marcin Borkowski <mbork@mbork.pl> [2023-03-08 19:02]:
>> Thanks a lot! (Also, once I have it working, I will definitely describe
>> it on my blog; I may also copy it here if someone is interested.)
>
> I am interested in feature:
>
> 1. To temporary show image in buffer
>
> 2. To remove that image, as it was temporary shown.
>
> Did you make functions to do that?
https://mbork.pl/2023-04-01_Showing_an_image_between_lines_in_Emacs
As for removing, `remove-overlays' is the nuclear option, and
`delete-overlay' a standard way to remove just one overlay (of course,
for that you need a reference to it).
Hth,
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2023-04-01 15:57 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-03-08 4:53 How to temporarily show an image in an Emacs buffer? Marcin Borkowski
2023-03-08 5:23 ` Marcin Borkowski
2023-03-08 6:19 ` Ruijie Yu via Users list for the GNU Emacs text editor
2023-03-08 16:01 ` Marcin Borkowski
2023-03-08 16:41 ` Michael Heerdegen
2023-03-11 8:14 ` Marcin Borkowski
2023-03-12 3:37 ` Michael Heerdegen
2023-03-12 7:46 ` Marcin Borkowski
2023-03-08 13:38 ` Eli Zaretskii
2023-03-08 16:00 ` Marcin Borkowski
2023-03-13 8:29 ` Jean Louis
2023-03-13 9:27 ` Marcin Borkowski
2023-04-01 15:57 ` Marcin Borkowski
2023-03-10 16:26 ` Stefan Monnier via Users list for the GNU Emacs text editor
2023-03-11 8:15 ` Marcin Borkowski
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).