GNU bug report logs - #47603
comint sets '(rear-nonsticky t) on entire prompt, disabling 'cursor-intangible

Previous Next

Package: emacs;

Reported by: JD Smith <jdtsmith <at> gmail.com>

Date: Mon, 5 Apr 2021 18:08:01 UTC

Severity: normal

Done: Stefan Monnier <monnier <at> iro.umontreal.ca>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 47603 in the body.
You can then email your comments to 47603 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#47603; Package emacs. (Mon, 05 Apr 2021 18:08:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to JD Smith <jdtsmith <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Mon, 05 Apr 2021 18:08:01 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: JD Smith <jdtsmith <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: comint sets '(rear-nonsticky t) on entire prompt, disabling
 'cursor-intangible
Date: Mon, 5 Apr 2021 14:07:17 -0400
[Message part 1 (text/plain, inline)]
Comint sets ‘(rear-nonsticky t) on the entire detected prompt text, which prevents `cursor-intangible from functioning correctly when applied to the prompt.  As Stefan put it:

I suspect the issue comes from the difference between `get-pos-property` and `get-char-property`: positions (like `point`) are not placed on a character but between two characters.  But text properties only apply to characters.  So the properties that are "on a position" are based on what properties would a character inherit if it where inserted at that position.

By default text properties are front-nonstick and rear-sticky, so basically a position gets its properties from the char right before it. But if you set (rear-nonsticky t), then you get no properties at all at that position.

This causes issues when "applying (rear-nonsticky t) a bit too generously, e.g. to all the chars in the prompt rather than only to the last one."
[Message part 2 (text/html, inline)]

Reply sent to Stefan Monnier <monnier <at> iro.umontreal.ca>:
You have taken responsibility. (Tue, 13 Apr 2021 02:51:02 GMT) Full text and rfc822 format available.

Notification sent to JD Smith <jdtsmith <at> gmail.com>:
bug acknowledged by developer. (Tue, 13 Apr 2021 02:51:02 GMT) Full text and rfc822 format available.

Message #10 received at 47603-done <at> debbugs.gnu.org (full text, mbox):

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: JD Smith <jdtsmith <at> gmail.com>
Cc: 47603-done <at> debbugs.gnu.org
Subject: Re: bug#47603: comint sets '(rear-nonsticky t) on entire prompt,
 disabling 'cursor-intangible
Date: Mon, 12 Apr 2021 22:49:55 -0400
> Comint sets ‘(rear-nonsticky t) on the entire detected prompt text, which
> prevents `cursor-intangible from functioning correctly when applied to the
> prompt.  As Stefan put it:

I fixed it a while back but forgot the `font-lock-face` property in the
list of properties to add to `rear-nonstick` so I just added the
patch below to `master`.
I believe this should now do it.


        Stefan


diff --git a/lisp/comint.el b/lisp/comint.el
index 2745c5a26f..b90e6354d8 100644
--- a/lisp/comint.el
+++ b/lisp/comint.el
@@ -1797,6 +1797,9 @@ comint-add-to-input-history
 			(min size (- comint-input-ring-size size)))))
     (ring-insert comint-input-ring cmd)))
 
+(defconst comint--prompt-rear-nonsticky
+  '(field inhibit-line-move-field-capture read-only font-lock-face))
+
 (defun comint-send-input (&optional no-newline artificial)
   "Send input to process.
 After the process output mark, sends all text from the process mark to
@@ -1916,8 +1919,8 @@ comint-send-input
             (unless (or no-newline comint-use-prompt-regexp)
               ;; Cover the terminating newline
               (add-text-properties end (1+ end)
-                                   '(rear-nonsticky
-                                     (field inhibit-line-move-field-capture read-only)
+                                   `(rear-nonsticky
+                                     ,comint--prompt-rear-nonsticky
                                      field boundary
                                      inhibit-line-move-field-capture t)))))
 
@@ -2124,10 +2127,10 @@ comint-output-filter
 	    (unless comint-use-prompt-regexp
               (with-silent-modifications
                 (add-text-properties comint-last-output-start (point)
-                                     '(front-sticky
+                                     `(rear-nonsticky
+				       ,comint--prompt-rear-nonsticky
+				       front-sticky
 				       (field inhibit-line-move-field-capture)
-				       rear-nonsticky
-				       (field inhibit-line-move-field-capture read-only)
 				       field output
 				       inhibit-line-move-field-capture t))))
 
@@ -2157,8 +2160,8 @@ comint-output-filter
 					       'font-lock-face
 					       'comint-highlight-prompt)
 	      (add-text-properties prompt-start (point)
-	                           '(rear-nonsticky
-	                             (field inhibit-line-move-field-capture read-only))))
+	                           `(rear-nonsticky
+	                             ,comint--prompt-rear-nonsticky)))
 	    (goto-char saved-point)))))))
 
 (defun comint-preinput-scroll-to-bottom ()





bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Tue, 11 May 2021 11:24:04 GMT) Full text and rfc822 format available.

This bug report was last modified 2 years and 322 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.