help-gnu-emacs
[Top][All Lists]
Advanced

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

Re: Major-mode devel: how to drop font-lock 'display when mode is disabl


From: Stefan Monnier
Subject: Re: Major-mode devel: how to drop font-lock 'display when mode is disabled?
Date: Mon, 11 Mar 2024 09:16:30 -0400
User-agent: Gnus/5.13 (Gnus v5.13)

> After some searching and experimentation I figured it's easy by making
> a major mode, which basically uses a `(put-text-property start end
> 'display human-redable-text)` to change the display of timestamps.
>
> It works fine but one problem I couldn't figure out how to get rid of
> is that upon changing the major mode the custom display does not
> go away.
>
> As a workaround I have the following call:
>
>       (add-to-list 'font-lock-extra-managed-props 'display)

You should make this change buffer-locally rather than globally.
Beside this detail, this is not considered as a workaround but as the
officially supported solution.

> …however, I presume this will make all "display" changes disappear,
> even if they been done by another mode, which isn't good.

Yup, currently Emacs doesn't keep track of who a given `display` property
belongs to, so that's as good as it gets. 🙁

>     (defun zsh-hist-display ()
>       (let ((start (match-beginning 0))
>             (end (match-end 0)))
>         (put-text-property start end 'display
>                            (zsh-hist-convert-unix-timestamp 
> (match-string-no-properties 1)))
>         ;; put some highlighting
>         (put-text-property start end 'face '(:weight bold))
>         (put-text-property start end 'zsh-hist:fontified t)
>         nil))

I'd do:

    (defun zsh-hist-display ()
      `( face bold       ;; Or `face (:weight bold)` if you insist.
         display ,(zsh-hist-convert-unix-timestamp (match-string-no-properties 
1))
         zsh-hist:fontified t))

Note that doing it this way lets font-lock know that it has set those
extra properties, so *in theory* it could allow font-lock to remove
those display properties (and only those) automatically.  Font-lock does
not do this, currently, tho. 🙁

>     (define-derived-mode zsh-history-mode text-mode "Zsh History Files"
>       "Major mode for viewing zsh-history files."
>       (add-to-list 'font-lock-extra-managed-props 'zsh-hist:fontified)
>       ;; BUG: this may potentially remove font-lock for other modes that 
> decided to use
>       ;; 'display. Unfortunately it is unclear how to make font-lock only 
> remove 'display
>       ;; for our mode.
>       (add-to-list 'font-lock-extra-managed-props 'display)
>       (font-lock-add-keywords 'zsh-history-mode '(("^: \\([0-9]+\\)" (0 
> (zsh-hist-display))))))

Use something like:

      (setq-local font-lock-extra-managed-props '(zsh-hist:fontified display))


-- Stefan




reply via email to

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