mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-06 11:50:51 -08:00
Font-lock elisp macros/special forms dynamically
* emacs-lisp/lisp-mode.el (lisp--el-macro-regexp): New defconst. (lisp--el-update-macro-regexp, lisp--el-update-after-load) (lisp--el-match-macro): New functions. (lisp-mode-variables): Update lisp--el-macro-regexp and add lisp--el-update-after-load to after-load-functions.
This commit is contained in:
parent
994168240a
commit
51e7e463e9
2 changed files with 42 additions and 2 deletions
|
|
@ -1,3 +1,11 @@
|
||||||
|
2015-03-15 Tassilo Horn <tsdh@gnu.org>
|
||||||
|
|
||||||
|
* emacs-lisp/lisp-mode.el (lisp--el-macro-regexp): New defconst.
|
||||||
|
(lisp--el-update-macro-regexp, lisp--el-update-after-load)
|
||||||
|
(lisp--el-match-macro): New functions.
|
||||||
|
(lisp-mode-variables): Update lisp--el-macro-regexp and add
|
||||||
|
lisp--el-update-after-load to after-load-functions.
|
||||||
|
|
||||||
2015-03-15 Daniel Colascione <dancol@dancol.org>
|
2015-03-15 Daniel Colascione <dancol@dancol.org>
|
||||||
|
|
||||||
* emacs-lisp/cl-indent.el
|
* emacs-lisp/cl-indent.el
|
||||||
|
|
|
||||||
|
|
@ -181,6 +181,33 @@
|
||||||
nil)))
|
nil)))
|
||||||
res))
|
res))
|
||||||
|
|
||||||
|
(defconst lisp--el-macro-regexp nil
|
||||||
|
"A regular expression matching all loaded elisp macros.
|
||||||
|
Can be updated using `lisp--el-update-macro-regexp' after new
|
||||||
|
macros were defined.")
|
||||||
|
|
||||||
|
(defun lisp--el-update-macro-regexp ()
|
||||||
|
"Update `lisp--el-update-macro-regexp' from `obarray'.
|
||||||
|
Return non-nil only if the old and new value are different."
|
||||||
|
(let ((old-regex lisp--el-macro-regexp)
|
||||||
|
(elisp-macros nil))
|
||||||
|
(mapatoms (lambda (a)
|
||||||
|
(when (or (macrop a) (special-form-p a))
|
||||||
|
(push (symbol-name a) elisp-macros))))
|
||||||
|
(setq lisp--el-macro-regexp
|
||||||
|
(concat "(" (regexp-opt elisp-macros t) "\\_>"))
|
||||||
|
(not (string= old-regex lisp--el-macro-regexp))))
|
||||||
|
|
||||||
|
(defun lisp--el-update-after-load (_file)
|
||||||
|
"Update `lisp--el-macro-regexp' and adjust font-lock in existing buffers."
|
||||||
|
(when (lisp--el-update-macro-regexp)
|
||||||
|
(dolist (buf (buffer-list))
|
||||||
|
(when (derived-mode-p 'emacs-lisp-mode)
|
||||||
|
(font-lock-flush)))))
|
||||||
|
|
||||||
|
(defun lisp--el-match-macro (limit)
|
||||||
|
(re-search-forward lisp--el-macro-regexp limit t))
|
||||||
|
|
||||||
(pcase-let
|
(pcase-let
|
||||||
((`(,vdefs ,tdefs
|
((`(,vdefs ,tdefs
|
||||||
,el-defs-re ,cl-defs-re
|
,el-defs-re ,cl-defs-re
|
||||||
|
|
@ -194,7 +221,9 @@
|
||||||
"when" "unless" "with-output-to-string"
|
"when" "unless" "with-output-to-string"
|
||||||
"ignore-errors" "dotimes" "dolist" "declare"))
|
"ignore-errors" "dotimes" "dolist" "declare"))
|
||||||
(lisp-errs '("warn" "error" "signal"))
|
(lisp-errs '("warn" "error" "signal"))
|
||||||
;; Elisp constructs. FIXME: update dynamically from obarray.
|
;; Elisp constructs. Now they are update dynamically
|
||||||
|
;; from obarray but they are also used for setting up
|
||||||
|
;; the keywords for Common Lisp.
|
||||||
(el-fdefs '("define-advice" "defadvice" "defalias"
|
(el-fdefs '("define-advice" "defadvice" "defalias"
|
||||||
"define-derived-mode" "define-minor-mode"
|
"define-derived-mode" "define-minor-mode"
|
||||||
"define-generic-mode" "define-global-minor-mode"
|
"define-generic-mode" "define-global-minor-mode"
|
||||||
|
|
@ -333,7 +362,7 @@
|
||||||
`( ;; Regexp negated char group.
|
`( ;; Regexp negated char group.
|
||||||
("\\[\\(\\^\\)" 1 font-lock-negation-char-face prepend)
|
("\\[\\(\\^\\)" 1 font-lock-negation-char-face prepend)
|
||||||
;; Control structures. Common Lisp forms.
|
;; Control structures. Common Lisp forms.
|
||||||
(,(concat "(" el-kws-re "\\_>") . 1)
|
(lisp--el-match-macro . 1)
|
||||||
;; Exit/Feature symbols as constants.
|
;; Exit/Feature symbols as constants.
|
||||||
(,(concat "(\\(catch\\|throw\\|featurep\\|provide\\|require\\)\\_>"
|
(,(concat "(\\(catch\\|throw\\|featurep\\|provide\\|require\\)\\_>"
|
||||||
"[ \t']*\\(\\(?:\\sw\\|\\s_\\)+\\)?")
|
"[ \t']*\\(\\(?:\\sw\\|\\s_\\)+\\)?")
|
||||||
|
|
@ -514,6 +543,9 @@ font-lock keywords will not be case sensitive."
|
||||||
. lisp-font-lock-syntactic-face-function)))
|
. lisp-font-lock-syntactic-face-function)))
|
||||||
(setq-local prettify-symbols-alist lisp--prettify-symbols-alist)
|
(setq-local prettify-symbols-alist lisp--prettify-symbols-alist)
|
||||||
(when elisp
|
(when elisp
|
||||||
|
(unless lisp--el-macro-regexp
|
||||||
|
(lisp--el-update-macro-regexp))
|
||||||
|
(add-hook 'after-load-functions #'lisp--el-update-after-load)
|
||||||
(setq-local electric-pair-text-pairs
|
(setq-local electric-pair-text-pairs
|
||||||
(cons '(?\` . ?\') electric-pair-text-pairs)))
|
(cons '(?\` . ?\') electric-pair-text-pairs)))
|
||||||
(setq-local electric-pair-skip-whitespace 'chomp)
|
(setq-local electric-pair-skip-whitespace 'chomp)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue