all messages for Emacs-related lists mirrored at yhetil.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

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 external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.