unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#22761: Surprising interaction between font-lock, invisible text, and point (self-insert-command and insert behave differently)
@ 2016-02-22  0:19 Clément Pit--Claudel
  2016-02-22 15:53 ` Eli Zaretskii
  0 siblings, 1 reply; 6+ messages in thread
From: Clément Pit--Claudel @ 2016-02-22  0:19 UTC (permalink / raw)
  To: 22761

[-- Attachment #1: Type: text/plain, Size: 2441 bytes --]

Hi,

I'm running into problems using font-lock to display certain strings as subscripts. The basic goal is to display ‘a__b’ as ‘ab’ with ‘b’ vertically offset. Using font-lock to make ‘__’ invisible and to add (display (raise -0.15)) to ‘b’ works fine. There is a strange interaction between self-insert-command and font-lock, however, and the problem does not happen if using ‘insert’ instead of ‘self-insert-command’.

The problem happens when editing ‘a_foo_b’ to replace ‘foo’ by ‘bar’ (to get ‘a_bar_b’). Removing ‘foo’ leaves ‘__’ in the buffer, which font-lock recognizes: the whole string gets displayed as ‘ab’. Even then, the point is still between the two underscores (it hasn't moved after font-lock added the invisible property to the underscores). Pressing ‘b’ to start inserting ‘bar’ works fine (I end up with ‘a_b_c’), except for one thing: the point gets moved after the second underscore. Thus, pressing ‘ar’ to complete ‘bar’ ends up inserting ‘a_b_arb’.

On the other hand, using ‘M-: (insert ?b)’ to insert the ‘b’ of ‘bar’ leaves the point in the right place.

To reproduce:

1. Open a buffer in fundamental-mode
2. Evaluate the following setup code:
    (progn
      (setq font-lock-defaults '(nil))
      (font-lock-add-keywords nil `((,(concat "[a-z]+\\(__\\)\\([a-z]+\\)")
                                     (1 '(face nil invisible 'subscript))
                                     (2 '(face nil display (raise -0.25))))))
      (add-to-invisibility-spec 'subscript)
      (make-local-variable 'font-lock-extra-managed-props)
      (add-to-list 'font-lock-extra-managed-props 'display)
      (add-to-list 'font-lock-extra-managed-props 'invisible)
      (font-lock-mode))
3. Insert the following text: before_between_after
4. Place the point after ‘between’; press <backspace> 7 times, to remove ‘between’ entirely.
5. Type ‘between’ (using the key sequence b e t w e e n)

Expected result: buffer contains before_between_after
Actual result: buffer contains before_b_etweenafter

On the other hand, the following protocol works fine:

1-4. Same as before
5. ‘M-: (insert ?b)’
6. Type ‘etween’ (using the key sequence e t w e e n)

Expected result: buffer contains before_between_after
Actual result: buffer contains before_between_after

Cheers,
Clément.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* bug#22761: Surprising interaction between font-lock, invisible text, and point (self-insert-command and insert behave differently)
  2016-02-22  0:19 bug#22761: Surprising interaction between font-lock, invisible text, and point (self-insert-command and insert behave differently) Clément Pit--Claudel
@ 2016-02-22 15:53 ` Eli Zaretskii
  2016-02-22 16:03   ` Clément Pit--Claudel
  0 siblings, 1 reply; 6+ messages in thread
From: Eli Zaretskii @ 2016-02-22 15:53 UTC (permalink / raw)
  To: Clément Pit--Claudel; +Cc: 22761

> From: Clément Pit--Claudel <clement.pitclaudel@live.com>
> Date: Sun, 21 Feb 2016 19:19:17 -0500
> 
> The problem happens when editing ‘a_foo_b’ to replace ‘foo’ by ‘bar’ (to get ‘a_bar_b’). Removing ‘foo’ leaves ‘__’ in the buffer, which font-lock recognizes: the whole string gets displayed as ‘ab’. Even then, the point is still between the two underscores (it hasn't moved after font-lock added the invisible property to the underscores). Pressing ‘b’ to start inserting ‘bar’ works fine (I end up with ‘a_b_c’), except for one thing: the point gets moved after the second underscore. Thus, pressing ‘ar’ to complete ‘bar’ ends up inserting ‘a_b_arb’.

Did you try binding global-disable-point-adjustment to a non-nil
value?





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

* bug#22761: Surprising interaction between font-lock, invisible text, and point (self-insert-command and insert behave differently)
  2016-02-22 15:53 ` Eli Zaretskii
@ 2016-02-22 16:03   ` Clément Pit--Claudel
  2016-02-22 16:38     ` Eli Zaretskii
  0 siblings, 1 reply; 6+ messages in thread
From: Clément Pit--Claudel @ 2016-02-22 16:03 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 22761

[-- Attachment #1: Type: text/plain, Size: 1126 bytes --]

On 02/22/2016 10:53 AM, Eli Zaretskii wrote:
>> From: Clément Pit--Claudel <clement.pitclaudel@live.com> Date: Sun,
>> 21 Feb 2016 19:19:17 -0500
>> 
>> The problem happens when editing ‘a_foo_b’ to replace ‘foo’ by
>> ‘bar’ (to get ‘a_bar_b’). Removing ‘foo’ leaves ‘__’ in the buffer,
>> which font-lock recognizes: the whole string gets displayed as
>> ‘ab’. Even then, the point is still between the two underscores (it
>> hasn't moved after font-lock added the invisible property to the
>> underscores). Pressing ‘b’ to start inserting ‘bar’ works fine (I
>> end up with ‘a_b_c’), except for one thing: the point gets moved
>> after the second underscore. Thus, pressing ‘ar’ to complete ‘bar’
>> ends up inserting ‘a_b_arb’.
> 
> Did you try binding global-disable-point-adjustment to a non-nil 
> value?

I imagine that it would work, but wouldn't it break other parts of Emacs? The mode to which I'm adding this subscripts feature also uses hideshow, for example, and I do want the point to be moved out of invisible sections then.

Clément.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* bug#22761: Surprising interaction between font-lock, invisible text, and point (self-insert-command and insert behave differently)
  2016-02-22 16:03   ` Clément Pit--Claudel
@ 2016-02-22 16:38     ` Eli Zaretskii
  2016-02-22 17:36       ` Clément Pit--Claudel
  0 siblings, 1 reply; 6+ messages in thread
From: Eli Zaretskii @ 2016-02-22 16:38 UTC (permalink / raw)
  To: Clément Pit--Claudel; +Cc: 22761

> Cc: 22761@debbugs.gnu.org
> From: Clément Pit--Claudel <clement.pitclaudel@live.com>
> Date: Mon, 22 Feb 2016 11:03:03 -0500
> 
> On 02/22/2016 10:53 AM, Eli Zaretskii wrote:
> >> From: Clément Pit--Claudel <clement.pitclaudel@live.com> Date: Sun,
> >> 21 Feb 2016 19:19:17 -0500
> >> 
> >> The problem happens when editing ‘a_foo_b’ to replace ‘foo’ by
> >> ‘bar’ (to get ‘a_bar_b’). Removing ‘foo’ leaves ‘__’ in the buffer,
> >> which font-lock recognizes: the whole string gets displayed as
> >> ‘ab’. Even then, the point is still between the two underscores (it
> >> hasn't moved after font-lock added the invisible property to the
> >> underscores). Pressing ‘b’ to start inserting ‘bar’ works fine (I
> >> end up with ‘a_b_c’), except for one thing: the point gets moved
> >> after the second underscore. Thus, pressing ‘ar’ to complete ‘bar’
> >> ends up inserting ‘a_b_arb’.
> > 
> > Did you try binding global-disable-point-adjustment to a non-nil 
> > value?
> 
> I imagine that it would work, but wouldn't it break other parts of Emacs? The mode to which I'm adding this subscripts feature also uses hideshow, for example, and I do want the point to be moved out of invisible sections then.

If it works, perhaps you could bind disable-point-adjustment (not the
global variable) in the insertion commands.

In general, insertion in the middle of invisible text is tricky at
best.  So perhaps you should rethink how you handle this situation --
you could, for example, temporarily remove the entire invisible
portion, until the insertion is complete.





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

* bug#22761: Surprising interaction between font-lock, invisible text, and point (self-insert-command and insert behave differently)
  2016-02-22 16:38     ` Eli Zaretskii
@ 2016-02-22 17:36       ` Clément Pit--Claudel
  2019-10-30 15:55         ` Lars Ingebrigtsen
  0 siblings, 1 reply; 6+ messages in thread
From: Clément Pit--Claudel @ 2016-02-22 17:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 22761

[-- Attachment #1: Type: text/plain, Size: 2399 bytes --]

On 02/22/2016 11:38 AM, Eli Zaretskii wrote:
>> Cc: 22761@debbugs.gnu.org From: Clément Pit--Claudel
>> <clement.pitclaudel@live.com> Date: Mon, 22 Feb 2016 11:03:03
>> -0500
>> 
>> On 02/22/2016 10:53 AM, Eli Zaretskii wrote:
>>>> From: Clément Pit--Claudel <clement.pitclaudel@live.com> Date:
>>>> Sun, 21 Feb 2016 19:19:17 -0500
>>>> 
>>>> The problem happens when editing ‘a_foo_b’ to replace ‘foo’ by 
>>>> ‘bar’ (to get ‘a_bar_b’). Removing ‘foo’ leaves ‘__’ in the
>>>> buffer, which font-lock recognizes: the whole string gets
>>>> displayed as ‘ab’. Even then, the point is still between the
>>>> two underscores (it hasn't moved after font-lock added the
>>>> invisible property to the underscores). Pressing ‘b’ to start
>>>> inserting ‘bar’ works fine (I end up with ‘a_b_c’), except for
>>>> one thing: the point gets moved after the second underscore.
>>>> Thus, pressing ‘ar’ to complete ‘bar’ ends up inserting
>>>> ‘a_b_arb’.
>>> 
>>> Did you try binding global-disable-point-adjustment to a non-nil
>>>  value?
>> 
>> I imagine that it would work, but wouldn't it break other parts of
>> Emacs? The mode to which I'm adding this subscripts feature also
>> uses hideshow, for example, and I do want the point to be moved out
>> of invisible sections then.
> 
> If it works, perhaps you could bind disable-point-adjustment (not
> the global variable) in the insertion commands.
> 
> In general, insertion in the middle of invisible text is tricky at 
> best.  So perhaps you should rethink how you handle this situation
> -- you could, for example, temporarily remove the entire invisible 
> portion, until the insertion is complete.

Thanks, this is a good idea. It will also be more intuitive for users, probably.
I tried to follow the strategy that prettify-symbols-unprettify-at-point uses, but I kept running into issues; using an overlay seems to work better. The issue described in my OP is still there (when the buffer text is ‘__’ and an ‘a’ is added in the middle (yielding ‘_a_’) the overlay is removed, and Emacs moves the point after the second underscore (probably before fontification kicks in and removes the invisible property?). Still I'm better off, because I can detect that case and protect against it using disable-point-adjustment.

Cheers,
Clément.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* bug#22761: Surprising interaction between font-lock, invisible text, and point (self-insert-command and insert behave differently)
  2016-02-22 17:36       ` Clément Pit--Claudel
@ 2019-10-30 15:55         ` Lars Ingebrigtsen
  0 siblings, 0 replies; 6+ messages in thread
From: Lars Ingebrigtsen @ 2019-10-30 15:55 UTC (permalink / raw)
  To: Clément Pit--Claudel; +Cc: 22761

Clément Pit--Claudel <clement.pitclaudel@live.com> writes:

> Still I'm better off, because I can detect that case and protect
> against it using disable-point-adjustment.

If I skim this thread correctly, I think the conclusion was that there
was nothing to fix here, so I'm closing this bug report.  Please reopen
if that's incorrect.

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





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

end of thread, other threads:[~2019-10-30 15:55 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-22  0:19 bug#22761: Surprising interaction between font-lock, invisible text, and point (self-insert-command and insert behave differently) Clément Pit--Claudel
2016-02-22 15:53 ` Eli Zaretskii
2016-02-22 16:03   ` Clément Pit--Claudel
2016-02-22 16:38     ` Eli Zaretskii
2016-02-22 17:36       ` Clément Pit--Claudel
2019-10-30 15:55         ` 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).