summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp
diff options
context:
space:
mode:
authorDaniel Colascione <dancol@dancol.org>2015-03-23 01:38:12 -0700
committerDaniel Colascione <dancol@dancol.org>2015-03-23 01:38:20 -0700
commitd235b1d261ae9f275ac1f412dd8a8ad3f1c45e51 (patch)
treef0ad20b881e2d66616e4651d04fdc097eb821f23 /lisp/emacs-lisp
parent47e0e319329a1ecf9da4fa1afd2b9f2738fada67 (diff)
downloademacs-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.el36
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)