all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Stephen Berman <stephen.berman@gmx.net>
To: "Stefan Monnier" <monnier@IRO.UMontreal.CA>
Cc: emacs-devel@gnu.org
Subject: Re: Conditionalized font-locking?
Date: Thu, 10 May 2012 17:22:06 +0200	[thread overview]
Message-ID: <87ipg49i3l.fsf@escher.home> (raw)
In-Reply-To: <87ipg858fd.fsf@escher.home> (Stephen Berman's message of "7 May 2012 17:15:34 +0200")

On 7 May 2012 17:15:34 +0200 "Stephen Berman" <stephen.berman@gmx.net> wrote:

> On Mon, 07 May 2012 11:05:27 -0400 Stefan Monnier <monnier@IRO.UMontreal.CA> wrote:
>
>>> (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)))
>>
>> If the re-search-forward fails, this function will mis-behave.
>
> D'oh!

Unfortunately, I'm still not getting what I want.  It's not unlikely I'm
again overlooking something obvious (though I've looked long and hard,
and tried lots of variations), so if you or someone else can point it
out, I'd be grateful.

Again, what I want is to fontify date-time strings with a special face
if the date in the string is earlier than the current date; moreover,
the time string is optional.  The following code (which is close to what
I'm actually using but with a simpler regexp and filtering condition)
seems to work at first:

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

(defun srb-date-time-matcher (lim)
  "Search for date-time strings within LIM for font-locking."
  (when (re-search-forward (concat "^\\(?1:[0-9][0-9][0-9][0-9]-"
  				   "[0-9][0-9]-[0-9][0-9]\\)"
  				   " \\(?2:[0-9]?[0-9]:[0-9][0-9]\\)?")
                           lim t)
    (let* ((date (match-string-no-properties 1))
    	   (time (match-string-no-properties 2))
	   ;; days-between needs a non-empty time string.
    	   (date-time (concat date " " (or time "00:00"))))
      (when (< (days-between date-time (current-time-string)) 0)
	(concat date " " time)))))

(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---

However, if the buffer contains a string that matches the regexp but
fails the second when-condition, then not only is it -- correctly -- not
fontified but subsequent matching dates that pass the when-condition are
also -- incorrectly -- not fontified.  Here's a test file showing the
problem:

--8<---------------cut here---------------start------------->8---
2012-04-01 10:00 
2012-05-02 
2013-05-01 10:00 
2012-03-10 10:00 
2012-04-01 10:00 
2012-05-02 
2012-03-10 10:00 
2012-04-01 10:00 
2012-05-02 
2012-03-10 10:00 

Local Variables:
mode: srb
End:
--8<---------------cut here---------------end--------------->8---

When I evaluate the code above and then visit this file, I see only the
first two dates in font-lock-warning-face.  However, if I modify the
buffer at one of the dates after the 2013 date that fails the
when-condition, e.g. by typing a space, then that date becomes fontified
(and maybe the following one too, this seems to vary).

(With my actual code and data, some but not all dates after a correctly
non-fontified date are correctly fontified, though I've found no pattern
to explain this; but I hope a solution to the above case will also take
care of this wrinkle.)

I suspect the problem has to do with this (info (elisp)Search-based
Fontification):

     Fontification will call FUNCTION repeatedly with the same limit,
     and with point where the previous invocation left it, until
     FUNCTION fails.  On failure, FUNCTION need not reset point in any
     particular way.

I tried resetting point on failure, but that either didn't have an
effect or it resulted in all dates being fontified.

So how can I get all and only dates that satisfy the when-condition
fontified?

Steve Berman



  reply	other threads:[~2012-05-10 15:22 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-07  8:47 Conditionalized font-locking? Stephen Berman
2012-05-07 15:05 ` Stefan Monnier
2012-05-07 15:15   ` Stephen Berman
2012-05-10 15:22     ` Stephen Berman [this message]
2012-05-10 15:30       ` Davis Herring
2012-05-10 18:18         ` Stephen Berman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87ipg49i3l.fsf@escher.home \
    --to=stephen.berman@gmx.net \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@IRO.UMontreal.CA \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.