[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Bug in Elisp font-locking (was: Concern around use of eval)
From: |
Tassilo Horn |
Subject: |
Bug in Elisp font-locking (was: Concern around use of eval) |
Date: |
Fri, 20 Mar 2015 18:19:43 +0100 |
User-agent: |
Gnus/5.130012 (Ma Gnus v0.12) Emacs/25.0.50 (gnu/linux) |
Thierry Volpiatto <thierry.volpiatto@gmail.com> writes:
>> (defun lh/gen-predicate (label)
>> (defalias (intern (concat "lh/" label "-p"))
> ^^^^^^
> In this case intern should not be highlighted, isn't it ?.
Indeed, it shouldn't be. But the font-lock entry for definitions which
applies the function name face here matches next to `defun', `defmacro',
or `defalias' also `cl-defstruct', and that may have the two forms
(defstruct struct-name ...)
(defstruct (struct-name OPTIONS) ...)
and therefore, the regexp simply skips the paren. The following patch
should fix that.
Cc-ing emacs-devel to ask if that's ok to commit. Is it? Or too much
hassle for just `defalias'? (I think that's the only definition form
which is implemented as a function where the name may be provided by a
funcall.)
--8<---------------cut here---------------start------------->8---
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index 6b30773..614fbc6 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -320,14 +320,18 @@
`( ;; Definitions.
(,(concat "(" el-defs-re "\\_>"
;; Any whitespace and defined object.
- "[ \t'\(]*"
- "\\(\\(?:\\sw\\|\\s_\\)+\\)?")
+ "[ \t']*"
+ ;; With defstruct, the name may follow a paren,
+ ;; e.g. (defstruct (foo-struct opts)...).
+ "\\(([ \t']*\\)?\\(\\(?:\\sw\\|\\s_\\)+\\)?")
(1 font-lock-keyword-face)
- (2 (let ((type (get (intern-soft (match-string 1)) 'lisp-define-type)))
- (cond ((eq type 'var) font-lock-variable-name-face)
- ((eq type 'type) font-lock-type-face)
- (t font-lock-function-name-face)))
- nil t))
+ (3 (let ((type (get (intern-soft (match-string 1)) 'lisp-define-type)))
+ (cond ((eq type 'var) font-lock-variable-name-face)
+ ((eq type 'type) font-lock-type-face)
+ ;; If match-string 2 is non-nil, we encountered a
+ ;; form like (defalias (intern (concat s "-p"))).
+ ((not (match-string 2)) font-lock-function-name-face)))
+ nil t))
;; Emacs Lisp autoload cookies. Supports the slightly different
;; forms used by mh-e, calendar, etc.
("^;;;###\\([-a-z]*autoload\\)" 1 font-lock-warning-face prepend))
--8<---------------cut here---------------end--------------->8---
Bye,
Tassilo
- Concern around use of eval, Les Harris, 2015/03/19
- Re: Concern around use of eval, Stefan Monnier, 2015/03/19
- Re: Concern around use of eval, Thierry Volpiatto, 2015/03/20
- Bug in Elisp font-locking (was: Concern around use of eval),
Tassilo Horn <=
- Message not available
- RE: Bug in Elisp font-locking, Drew Adams, 2015/03/20
- Message not available
- Re: Bug in Elisp font-locking, Tassilo Horn, 2015/03/20
- Re: Bug in Elisp font-locking, Stefan Monnier, 2015/03/20
- Re: Bug in Elisp font-locking, Tassilo Horn, 2015/03/20
- Re: Bug in Elisp font-locking, Stefan Monnier, 2015/03/20