[Top][All Lists]

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

Conditionalized font-locking?

From: Stephen Berman
Subject: Conditionalized font-locking?
Date: Mon, 07 May 2012 10:47:24 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1.50 (gnu/linux)

In a certain mode I'd like to fontify date strings where the date is
earlier than current-time-string differently from date strings of later
dates.  I tried to do this with font-lock-keywords by filtering the
output of the regexp search.  It seems to work, but as soon as a
filtered matching string is fontified, Emacs appears to hang (the gdb
backtrace shows thousands of calls to mark_object).  Hitting `C-x k'
followed by rapidly repeating `C-g' many times eventually gets Emacs
back to normal.

The case with date strings is more complicated than necessary to show
the problem; the following code shows the same problem for a simpler
case, fontifying odd numbers (of course, that can be done with just a
regexp and then there's no problem, but I don't think the date string
case is possible just with a regexp):

--8<---------------cut here---------------start------------->8---
(defvar srb-font-lock-keywords
  (list '(srb-number-matcher 1 font-lock-warning-face t)))

(defun srb-number-matcher (lim)
  "Search for odd numbers within LIM for font-locking."
  (re-search-forward "\\<\\([0-9]+\\)\\>" lim t)
  (let ((num (match-string-no-properties 1)))
    (when (eq (logand (string-to-number num) 1) 1) num)))

(define-derived-mode srb-mode nil "SRB" ()
  "Mode for testing font-locking."
  (set (make-local-variable 'font-lock-defaults)
       '(srb-font-lock-keywords t)))
--8<---------------cut here---------------end--------------->8---

Evaluate this code, switch to a new buffer, type `M-x srb-mode' and then
the number `1': the number gets fontified but Emacs appears to hang.

Am I doing something wrong?  If so, what's the right way to do this?  Or
is what I'm trying to do not possible?

Steve Berman

reply via email to

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