diff options
author | Daniel Colascione <dancol@dancol.org> | 2015-03-23 01:38:12 -0700 |
---|---|---|
committer | Daniel Colascione <dancol@dancol.org> | 2015-03-23 01:38:20 -0700 |
commit | d235b1d261ae9f275ac1f412dd8a8ad3f1c45e51 (patch) | |
tree | f0ad20b881e2d66616e4651d04fdc097eb821f23 /lisp/emacs-lisp | |
parent | 47e0e319329a1ecf9da4fa1afd2b9f2738fada67 (diff) | |
download | emacs-d235b1d261ae9f275ac1f412dd8a8ad3f1c45e51.tar.gz emacs-d235b1d261ae9f275ac1f412dd8a8ad3f1c45e51.tar.bz2 emacs-d235b1d261ae9f275ac1f412dd8a8ad3f1c45e51.zip |
Try to avoid fontifying macros in funcall position
* lisp/emacs-lisp/lisp-mode.el
(lisp--el-non-funcall-position-p): New function.
(lisp--el-match-keyword): Use it.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r-- | lisp/emacs-lisp/lisp-mode.el | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el index 9c4194557ef..52bc6a5405b 100644 --- a/lisp/emacs-lisp/lisp-mode.el +++ b/lisp/emacs-lisp/lisp-mode.el @@ -181,13 +181,47 @@ nil))) res)) +(defun lisp--el-non-funcall-position-p (&optional pos) + "Heuristically determine whether POS is an evaluated position." + (setf pos (or pos (point))) + (save-match-data + (save-excursion + (goto-char pos) + (or (eql (char-before) ?\') + (let ((parent + (ignore-errors + (up-list -1) + (cond + ((looking-at (rx "(" (* (syntax -)) "(")) + (up-list -1) + (when (looking-at "(\\_<let\\*?\\_>") + (goto-char (match-end 0)) + 'let)) + ((looking-at + (rx "(" + (group-n 1 (+ (or (syntax w) (syntax _)))) + symbol-end)) + (prog1 (intern-soft (match-string-no-properties 1)) + (goto-char (match-end 1)))))))) + (or (eq parent 'declare) + (and (eq parent 'let) + (progn + (forward-sexp 1) + (< pos (point)))) + (and (eq parent 'condition-case) + (progn + (forward-sexp 2) + (< (point) pos))))))))) + (defun lisp--el-match-keyword (limit) (catch 'found (while (re-search-forward "(\\(\\(?:\\sw\\|\\s_\\)+\\)\\_>" limit t) (let ((sym (intern-soft (match-string 1)))) (when (or (special-form-p sym) (and (macrop sym) - (not (get sym 'no-font-lock-keyword)))) + (not (get sym 'no-font-lock-keyword)) + (not (lisp--el-non-funcall-position-p + (match-beginning 0))))) (throw 'found t)))))) (defun lisp--el-font-lock-flush-elisp-buffers (&optional file) |