emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Running (prettify-symbols-mode) twice adds two entries to font-lock-keyw


From: Clément Pit--Claudel
Subject: Running (prettify-symbols-mode) twice adds two entries to font-lock-keywords
Date: Sat, 27 Feb 2016 10:07:07 -0500
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1

Hi emacs-devel,

Do bug reports with a proposed fix go on the bug tracker, or on this list? I've 
seen patches discussed here, so I'm not too sure. Apologies if this is the 
wrong place (please do let me know!)

Changing the lists of symbols prettified by prettify-symbols-mode is more 
tricky than it should be; I think this is a bug in prettify-symbols-mode. Here 
is a test case:

(with-current-buffer (get-buffer-create "fl")
  (erase-buffer)
  (emacs-lisp-mode)
  (prettify-symbols-mode -1)
  (setq prettify-symbols-alist '(("A" . ?B)))
  (prettify-symbols-mode)
  (setq prettify-symbols-alist '(("A" . ?C)))
  (prettify-symbols-mode)
  (insert "A A A")
  (pop-to-buffer (current-buffer)))

Looking at this code, I expect “C C C” to be shown. Yet it's not the case; 
instead, “B B B” is shown.

On the other hand, this works:

(with-current-buffer (get-buffer-create "fl")
  (erase-buffer)
  (emacs-lisp-mode)
  (prettify-symbols-mode -1)
  (setq prettify-symbols-alist '(("A" . ?B)))
  (prettify-symbols-mode)
  (prettify-symbols-mode -1)
  (setq prettify-symbols-alist '(("A" . ?C)))
  (prettify-symbols-mode)
  (insert "A A A")
  (pop-to-buffer (current-buffer)))

I think the line indicated by !!! in the following code sample is wrong:

    (define-minor-mode prettify-symbols-mode
      (...)
      (if prettify-symbols-mode
          ;; Turn on
          (when (setq prettify-symbols--keywords 
(prettify-symbols--make-keywords))
            (font-lock-add-keywords nil prettify-symbols--keywords) ;; !!! HERE
            (setq-local font-lock-extra-managed-props
                        (append font-lock-extra-managed-props
                                '(composition
                                  prettify-symbols-start
                                  prettify-symbols-end)))
            (when prettify-symbols-unprettify-at-point
              (add-hook 'post-command-hook
                        #'prettify-symbols--post-command-hook nil t))
            (font-lock-flush))

Indeed, turning on prettify-symbols-mode twice in a row causes two entries to 
be added to font-lock-add-keywords. This is not an issue in general, except if 
one changes prettify-symbols-alist between two calls. In that case 
font-lock-keywords gets two distinct entries for prettify-symbols, and the 
second one is ignored.

The proposed fix is to move the following snippet up, so that it runs in all 
cases, instead of just running when prettify-symbols-mode is turned off.

    (when prettify-symbols--keywords
      (font-lock-remove-keywords nil prettify-symbols--keywords)
      (setq prettify-symbols--keywords nil))

Cheers,
Clément.

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]