[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