unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#41002: Undo breaks inhibit-read-only text property
@ 2020-05-01 10:38 Serhii Mozghovyi
  2020-05-02 17:33 ` Filipp Gunbin
  0 siblings, 1 reply; 9+ messages in thread
From: Serhii Mozghovyi @ 2020-05-01 10:38 UTC (permalink / raw)
  To: 41002

The inhibit-read-only text property in a read-only buffer does not work
with Undo:

C-x b <unique buffer name>, then insert some text, such as:

---

First paragraph.

Second paragraph.

---

Then M-: (put-text-property (point-min) (point-max) 'inhibit-read-only
t), and C-x C-q to make the buffer read-only. Now select the "Se" and
kill it with C-w: it succeeds. Then hit C-/ to undo, select "Sec" and
try to kill again. Now it fails. For any other region that does not
intersect with "Se", killing works.






^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#41002: Undo breaks inhibit-read-only text property
  2020-05-01 10:38 bug#41002: Undo breaks inhibit-read-only text property Serhii Mozghovyi
@ 2020-05-02 17:33 ` Filipp Gunbin
  2020-05-02 19:09   ` Serhii Mozghovyi
  0 siblings, 1 reply; 9+ messages in thread
From: Filipp Gunbin @ 2020-05-02 17:33 UTC (permalink / raw)
  To: Serhii Mozghovyi; +Cc: 41002

On 01/05/2020 13:38 +0300, Serhii Mozghovyi wrote:

> The inhibit-read-only text property in a read-only buffer does not work
> with Undo:
>

[...]

Cannot reproduce on current master.  Can you reproduce it with emacs -Q?
Do you have any custom undo functionality? (like a package)

You should file a proper bug report with M-x report-emacs-bug, it will
automatically include your Emacs version.

Filipp





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#41002: Undo breaks inhibit-read-only text property
  2020-05-02 17:33 ` Filipp Gunbin
@ 2020-05-02 19:09   ` Serhii Mozghovyi
  2020-05-03  3:22     ` Filipp Gunbin
  0 siblings, 1 reply; 9+ messages in thread
From: Serhii Mozghovyi @ 2020-05-02 19:09 UTC (permalink / raw)
  To: Filipp Gunbin; +Cc: 41002

Yes, I can reproduce with emacs -Q. My Emacs version is 26.3. Here are
the details:

In GNU Emacs 26.3 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.22.30)
 of 2020-05-01 built on serhii-dell
Windowing system distributor 'The X.Org Foundation', version 11.0.12004000
System Description:    CentOS Linux release 7.7.1908 (Core)

Recent messages:
Quit
nil
Read-Only mode enabled in current buffer
Mark set
19 (#o23, #x13, ?\C-s)
20 (#o24, #x14, ?\C-t)
Undo!
Mark activated
kill-region: Text is read-only: #<buffer new>
Making completion list...

Configured using:
 'configure --prefix=/home/serhii/local'

Configured features:
XPM JPEG TIFF GIF PNG RSVG SOUND DBUS GSETTINGS GLIB NOTIFY LIBSELINUX
GNUTLS LIBXML2 FREETYPE XFT ZLIB TOOLKIT_SCROLL_BARS GTK3 X11 XDBE XIM
THREADS

Important settings:
  value of $LANG: en_US.UTF-8
  value of $XMODIFIERS: @im=ibus
  locale-coding-system: utf-8-unix

Major mode: Fundamental

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  buffer-read-only: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message rmc puny seq byte-opt gv
bytecomp byte-compile cconv cl-loaddefs cl-lib dired dired-loaddefs
format-spec rfc822 mml easymenu mml-sec password-cache epa derived epg
epg-config gnus-util rmail rmail-loaddefs mm-decode mm-bodies mm-encode
mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047
rfc2045 ietf-drums mm-util mail-prsvr mail-utils elec-pair time-date
mule-util tooltip eldoc electric uniquify ediff-hook vc-hooks
lisp-float-type mwheel term/x-win x-win term/common-win x-dnd tool-bar
dnd fontset image regexp-opt fringe tabulated-list replace newcomment
text-mode elisp-mode lisp-mode prog-mode register page menu-bar
rfn-eshadow isearch timer select scroll-bar mouse jit-lock font-lock
syntax facemenu font-core term/tty-colors frame cl-generic cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european
ethiopic indian cyrillic chinese composite charscript charprop
case-table epa-hook jka-cmpr-hook help simple abbrev obarray minibuffer
cl-preloaded nadvice loaddefs button faces cus-face macroexp files
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget hashtable-print-readable backquote threads dbusbind
inotify dynamic-setting system-font-setting font-render-setting
move-toolbar gtk x-toolkit x multi-tty make-network-process emacs)

Memory information:
((conses 16 95086 6451)
 (symbols 48 20250 1)
 (miscs 40 47 168)
 (strings 32 28285 1382)
 (string-bytes 1 745581)
 (vectors 16 13895)
 (vector-slots 8 500670 14660)
 (floats 8 50 198)
 (intervals 56 235 9)
 (buffers 992 13)
 (heap 1024 24712 1221))

On 5/2/20 8:33 PM, Filipp Gunbin wrote:
> On 01/05/2020 13:38 +0300, Serhii Mozghovyi wrote:
>
>> The inhibit-read-only text property in a read-only buffer does not work
>> with Undo:
>>
> [...]
>
> Cannot reproduce on current master.  Can you reproduce it with emacs -Q?
> Do you have any custom undo functionality? (like a package)
>
> You should file a proper bug report with M-x report-emacs-bug, it will
> automatically include your Emacs version.
>
> Filipp





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#41002: Undo breaks inhibit-read-only text property
  2020-05-02 19:09   ` Serhii Mozghovyi
@ 2020-05-03  3:22     ` Filipp Gunbin
  2020-05-09  7:37       ` Eli Zaretskii
  2020-05-19 12:12       ` Lars Ingebrigtsen
  0 siblings, 2 replies; 9+ messages in thread
From: Filipp Gunbin @ 2020-05-03  3:22 UTC (permalink / raw)
  To: Serhii Mozghovyi; +Cc: 41002, larsi

> On 5/2/20 8:33 PM, Filipp Gunbin wrote:
[...]
>> Cannot reproduce on current master.  Can you reproduce it with emacs -Q?
>> Do you have any custom undo functionality? (like a package)

I see I wasn't trying right, it's actually reproducible on master too.

I think this comes from verify_interval_modification (textprop.c).  For
each interval, we check INTERVAL_WRITABLE_P, and then:

commit d1b04a9e7ada7070dbd84bb450411c1f169b3739
Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
Date:   Sun Nov 16 23:36:58 2014 +0100
[...]
diff --git a/src/textprop.c b/src/textprop.c
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -2301,0 +2301,4 @@
+	  if (i->position + LENGTH (i) < end
+	      && (!NILP (BVAR (current_buffer, read_only))
+		  && NILP (Vinhibit_read_only)))
+	    xsignal1 (Qbuffer_read_only, Fcurrent_buffer ());

So if there happens to be an (writeable) interval ending before "end"
(the end of the region we're killing with C-w), we will signal that the
buffer is read-only.  This may be read as "if we're going over the
boundary of an interval, then check the _buffer_ read-onliness".  Maybe
Lars, as the author of this code, could comment on this.

Filipp





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#41002: Undo breaks inhibit-read-only text property
  2020-05-03  3:22     ` Filipp Gunbin
@ 2020-05-09  7:37       ` Eli Zaretskii
  2020-05-09 13:34         ` Filipp Gunbin
  2020-05-19 12:12       ` Lars Ingebrigtsen
  1 sibling, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2020-05-09  7:37 UTC (permalink / raw)
  To: Filipp Gunbin; +Cc: 41002, egnartsms, larsi

> From: Filipp Gunbin <fgunbin@fastmail.fm>
> Date: Sun, 03 May 2020 06:22:20 +0300
> Cc: 41002@debbugs.gnu.org, larsi@gnus.org
> 
> --- a/src/textprop.c
> +++ b/src/textprop.c
> @@ -2301,0 +2301,4 @@
> +	  if (i->position + LENGTH (i) < end
> +	      && (!NILP (BVAR (current_buffer, read_only))
> +		  && NILP (Vinhibit_read_only)))
> +	    xsignal1 (Qbuffer_read_only, Fcurrent_buffer ());
> 
> So if there happens to be an (writeable) interval ending before "end"
> (the end of the region we're killing with C-w), we will signal that the
> buffer is read-only.  This may be read as "if we're going over the
> boundary of an interval, then check the _buffer_ read-onliness".  Maybe
> Lars, as the author of this code, could comment on this.

I think you are right: we need to augment this with something that
pays attention to the inhibit-read-only property.  Would you like to
suggest a patch?

Btw, how is this related to undo?

Thanks.





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#41002: Undo breaks inhibit-read-only text property
  2020-05-09  7:37       ` Eli Zaretskii
@ 2020-05-09 13:34         ` Filipp Gunbin
  2020-05-09 13:49           ` Eli Zaretskii
  0 siblings, 1 reply; 9+ messages in thread
From: Filipp Gunbin @ 2020-05-09 13:34 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 41002, egnartsms, larsi

On 09/05/2020 10:37 +0300, Eli Zaretskii wrote:

>> From: Filipp Gunbin <fgunbin@fastmail.fm>
>> Date: Sun, 03 May 2020 06:22:20 +0300
>> Cc: 41002@debbugs.gnu.org, larsi@gnus.org
>>
>> --- a/src/textprop.c
>> +++ b/src/textprop.c
>> @@ -2301,0 +2301,4 @@
>> +	  if (i->position + LENGTH (i) < end
>> +	      && (!NILP (BVAR (current_buffer, read_only))
>> +		  && NILP (Vinhibit_read_only)))
>> +	    xsignal1 (Qbuffer_read_only, Fcurrent_buffer ());
>>
>> So if there happens to be an (writeable) interval ending before "end"
>> (the end of the region we're killing with C-w), we will signal that the
>> buffer is read-only.  This may be read as "if we're going over the
>> boundary of an interval, then check the _buffer_ read-onliness".  Maybe
>> Lars, as the author of this code, could comment on this.
>
> I think you are right: we need to augment this with something that
> pays attention to the inhibit-read-only property.  Would you like to
> suggest a patch?

That property is checked in INTERVAL_WRITABLE_P just above, it looks
fine..  The problem is I don't know what the "if" I cited is for.

> Btw, how is this related to undo?

Before undo, we seem to have one interval spanning all the text.  After
undo, there appears a short interval on which "i->position + LENGTH (i)
< end" triggers.

Filipp





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#41002: Undo breaks inhibit-read-only text property
  2020-05-09 13:34         ` Filipp Gunbin
@ 2020-05-09 13:49           ` Eli Zaretskii
  2020-05-09 16:55             ` Filipp Gunbin
  0 siblings, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2020-05-09 13:49 UTC (permalink / raw)
  To: Filipp Gunbin; +Cc: 41002, egnartsms, larsi

> From: Filipp Gunbin <fgunbin@fastmail.fm>
> Cc: egnartsms@gmail.com,  41002@debbugs.gnu.org,  larsi@gnus.org
> Date: Sat, 09 May 2020 16:34:43 +0300
> 
> > I think you are right: we need to augment this with something that
> > pays attention to the inhibit-read-only property.  Would you like to
> > suggest a patch?
> 
> That property is checked in INTERVAL_WRITABLE_P just above, it looks
> fine.

That tests if the interval is _not_ writable.  But the problem is not
triggered by the interval, it is triggered by characters after the
interval, is it not?

> The problem is I don't know what the "if" I cited is for.

Hopefully, Lars will answer that.

> > Btw, how is this related to undo?
> 
> Before undo, we seem to have one interval spanning all the text.  After
> undo, there appears a short interval on which "i->position + LENGTH (i)
> < end" triggers.

Right, thanks.  So this situation could be recreated without any undo
in the recipe, right?





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#41002: Undo breaks inhibit-read-only text property
  2020-05-09 13:49           ` Eli Zaretskii
@ 2020-05-09 16:55             ` Filipp Gunbin
  0 siblings, 0 replies; 9+ messages in thread
From: Filipp Gunbin @ 2020-05-09 16:55 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 41002, egnartsms, larsi

On 09/05/2020 16:49 +0300, Eli Zaretskii wrote:

>> From: Filipp Gunbin <fgunbin@fastmail.fm>
>> Cc: egnartsms@gmail.com,  41002@debbugs.gnu.org,  larsi@gnus.org
>> Date: Sat, 09 May 2020 16:34:43 +0300
>>
>> > I think you are right: we need to augment this with something that
>> > pays attention to the inhibit-read-only property.  Would you like to
>> > suggest a patch?
>>
>> That property is checked in INTERVAL_WRITABLE_P just above, it looks
>> fine.
>
> That tests if the interval is _not_ writable.  But the problem is not
> triggered by the interval, it is triggered by characters after the
> interval, is it not?

The buffer is read-only, and all characters have inhibit-read-only
property set (it's in the recipe).  Undo properly restores characters as
well as their properties.  But now, after undo, we don't have one single
interval any more, we have 3 intervals instead: before killed region,
killed (and restored) region, and the rest.  And this is where our
problematic (?) "if" triggers.  So I wouldn't talk about characters
after the interval, no.

>> > Btw, how is this related to undo?
>>
>> Before undo, we seem to have one interval spanning all the text.  After
>> undo, there appears a short interval on which "i->position + LENGTH (i)
>> < end" triggers.
>
> Right, thanks.  So this situation could be recreated without any undo
> in the recipe, right?

Yes, just put-text-property on separate (and adjacent) intervals instead
of the full buffer at once, and try to kill a region which crosses 
any interval boundary:

(with-temp-buffer
  (insert "ab")
  (put-text-property 1 2 'inhibit-read-only t)
  (put-text-property 2 3 'inhibit-read-only t)
  (setq buffer-read-only t)
  (kill-region 1 3))                    ;(kill-region 1 2) works

Thanks,
Filipp





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#41002: Undo breaks inhibit-read-only text property
  2020-05-03  3:22     ` Filipp Gunbin
  2020-05-09  7:37       ` Eli Zaretskii
@ 2020-05-19 12:12       ` Lars Ingebrigtsen
  1 sibling, 0 replies; 9+ messages in thread
From: Lars Ingebrigtsen @ 2020-05-19 12:12 UTC (permalink / raw)
  To: Filipp Gunbin; +Cc: 41002, Serhii Mozghovyi

Filipp Gunbin <fgunbin@fastmail.fm> writes:

> @@ -2301,0 +2301,4 @@
> +	  if (i->position + LENGTH (i) < end
> +	      && (!NILP (BVAR (current_buffer, read_only))
> +		  && NILP (Vinhibit_read_only)))
> +	    xsignal1 (Qbuffer_read_only, Fcurrent_buffer ());
>
> So if there happens to be an (writeable) interval ending before "end"
> (the end of the region we're killing with C-w), we will signal that the
> buffer is read-only.  This may be read as "if we're going over the
> boundary of an interval, then check the _buffer_ read-onliness".  Maybe
> Lars, as the author of this code, could comment on this.

Hm...  I've re-read the original patch, and I don't really have any
recollection of what my original thought here was, I'm afraid.  

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2020-05-19 12:12 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-01 10:38 bug#41002: Undo breaks inhibit-read-only text property Serhii Mozghovyi
2020-05-02 17:33 ` Filipp Gunbin
2020-05-02 19:09   ` Serhii Mozghovyi
2020-05-03  3:22     ` Filipp Gunbin
2020-05-09  7:37       ` Eli Zaretskii
2020-05-09 13:34         ` Filipp Gunbin
2020-05-09 13:49           ` Eli Zaretskii
2020-05-09 16:55             ` Filipp Gunbin
2020-05-19 12:12       ` Lars Ingebrigtsen

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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).