unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
From: Tim X <timx@nospam.dev.null>
To: help-gnu-emacs@gnu.org
Subject: Re: Macro used for dynamic setting of font-lock-keywords
Date: Sun, 27 May 2007 01:23:11 +1000	[thread overview]
Message-ID: <87lkfb4nj4.fsf@lion.rapttech.com.au> (raw)
In-Reply-To: mailman.1274.1180175941.32220.help-gnu-emacs@gnu.org

Sebastian Tennant <sebyte@smolny.plus.com> writes:

> Quoth Tim X <timx@nospam.dev.null>:
>>>   (defun foo (word)
>>>     (display-buffer (set-buffer (get-buffer-create "*bar*")))
>>>     (insert (format "baz\n"))
>>>     (unless (fboundp 'foo-dynamic-add-keyword) ;only define it once
>>>       (defmacro foo-dynamic-add-keyword ()
>>>         `(font-lock-add-keywords nil '((,word . font-lock-warning-face)) 'set)))
>>>     (foo-dynamic-add-keyword) ;call the macro
>>>     (font-lock-mode 1))
>>>
>>>   (foo "baz")
>>>
>>> in that the string argument to foo is added to the buffer's
>>> font-lock-keywords and the string is highlighted wherever it occurs,
>>> but it seems like something of a kludge to me.
>>>
>>> Just out of interest really, is there a better way of passing the
>>> value of a variable as an argument to the function
>>> font-lock-add-keywords?
>>
>> I must be missing something - I don't understand why you are using a macro or
>> what the issue is with passing an argument. Doesn't something like (not tested)
>>
> (defun my-add-keyword (word) 
>   (font-lock-add-keywords nil '((word . font-lock-warning-face)) 'set))
> [C-x C-e]
> my-add-keyword
>
> (my-add-keyword "keyword")
> [C-x C-e]
> (t ((word . font-lock-warning-face)) (word (0 font-lock-warning-face)))
>                                         ^
>                                         |
>  This doesn't do the job ---------------+
>
> As you can see, passing arguments that make it into font-lock-keywords
> is not so straightforward as you think.
>
>> (add-hook xxx-mode-hook 
>>             (lambda ()
>>                .... ; various mode specific struff
>>                (font-lock-add-keywords nil
>>                   '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)))))
>
> Of course this works.  The pattern you want to match is being added
> directly to the list.
>

My mistake for not checking the code and documentation closer. 

Your problem is passing the argument, its that the way you have the function
prevents the argument from being evaluated, so what is really happening is the
symbol word is getting added to the list. Try this

(defun my-add-keyword (word) 
    (font-lock-add-keywords nil (cons word font-lock-warning-face)) t))

Though you probably should define the function to take three arguments, the
word (or regexp), the match-group and the facename. You could make the last two
optional with defaults. 

Tim

  parent reply	other threads:[~2007-05-26 15:23 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <mailman.1240.1180113798.32220.help-gnu-emacs@gnu.org>
2007-05-26  8:20 ` Macro used for dynamic setting of font-lock-keywords Tim X
2007-05-26 10:40   ` Sebastian Tennant
     [not found]   ` <mailman.1274.1180175941.32220.help-gnu-emacs@gnu.org>
2007-05-26 15:23     ` Tim X [this message]
2007-05-26 20:07       ` Sebastian Tennant
2007-06-02  3:29         ` Kevin Rodgers
     [not found]       ` <mailman.1303.1180209955.32220.help-gnu-emacs@gnu.org>
2007-05-27  3:30         ` Tim X
2007-05-27 21:45           ` Xavier Maillard
2007-05-28  9:22             ` Sebastian Tennant
2007-06-02  3:41               ` Kevin Rodgers
2007-06-02  7:26                 ` Eli Zaretskii
2007-06-03  9:39                 ` Sebastian Tennant
     [not found]           ` <mailman.1339.1180303291.32220.help-gnu-emacs@gnu.org>
2007-05-28  8:37             ` Tim X
2007-06-10  0:51 ` Stefan Monnier
2007-05-25 17:24 Sebastian Tennant

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

  List information: https://www.gnu.org/software/emacs/

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

  git send-email \
    --in-reply-to=87lkfb4nj4.fsf@lion.rapttech.com.au \
    --to=timx@nospam.dev.null \
    --cc=help-gnu-emacs@gnu.org \
    /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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).