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.
This commit is contained in:
Daniel Colascione 2015-03-23 01:38:12 -07:00
parent 47e0e31932
commit d235b1d261
2 changed files with 40 additions and 1 deletions

View file

@ -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)