From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Tassilo Horn Newsgroups: gmane.emacs.bugs Subject: bug#20096: 25.0.50; Add Font-Lock support for subr-x macros Date: Sat, 14 Mar 2015 09:26:21 +0100 Message-ID: <87sid8vvbm.fsf@gnu.org> References: <87d24etxni.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1426321646 6963 80.91.229.3 (14 Mar 2015 08:27:26 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 14 Mar 2015 08:27:26 +0000 (UTC) Cc: 20096@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat Mar 14 09:27:14 2015 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1YWhPd-00021n-SK for geb-bug-gnu-emacs@m.gmane.org; Sat, 14 Mar 2015 09:27:14 +0100 Original-Received: from localhost ([::1]:40021 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YWhPd-0001Rd-7o for geb-bug-gnu-emacs@m.gmane.org; Sat, 14 Mar 2015 04:27:13 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:52173) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YWhPZ-0001RW-Fg for bug-gnu-emacs@gnu.org; Sat, 14 Mar 2015 04:27:10 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YWhPU-0000db-FH for bug-gnu-emacs@gnu.org; Sat, 14 Mar 2015 04:27:09 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:47084) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YWhPS-0000dM-Ns for bug-gnu-emacs@gnu.org; Sat, 14 Mar 2015 04:27:04 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1YWhPS-0007IA-Ht for bug-gnu-emacs@gnu.org; Sat, 14 Mar 2015 04:27:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Tassilo Horn Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 14 Mar 2015 08:27:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 20096 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 20096-submit@debbugs.gnu.org id=B20096.142632158827984 (code B ref 20096); Sat, 14 Mar 2015 08:27:02 +0000 Original-Received: (at 20096) by debbugs.gnu.org; 14 Mar 2015 08:26:28 +0000 Original-Received: from localhost ([127.0.0.1]:45652 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YWhOt-0007HI-Nf for submit@debbugs.gnu.org; Sat, 14 Mar 2015 04:26:28 -0400 Original-Received: from out3-smtp.messagingengine.com ([66.111.4.27]:57831) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YWhOr-0007H7-2q for 20096@debbugs.gnu.org; Sat, 14 Mar 2015 04:26:25 -0400 Original-Received: from compute6.internal (compute6.nyi.internal [10.202.2.46]) by mailout.nyi.internal (Postfix) with ESMTP id D1F3820A16 for <20096@debbugs.gnu.org>; Sat, 14 Mar 2015 04:26:22 -0400 (EDT) Original-Received: from frontend2 ([10.202.2.161]) by compute6.internal (MEProxy); Sat, 14 Mar 2015 04:26:24 -0400 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=x-sasl-enc:from:to:cc:subject:in-reply-to :references:date:message-id:mime-version:content-type; s= smtpout; bh=3Qk3wH0vMmiZ0DqTYxghP3vk5p0=; b=VO31dhvTdi3hHireLpJp VxqRMFXvd9RR5rhjMBcGMfytkN40B9iaqCOBWEfuBgIBjMMMF671cx+H1GM3lqqZ HIRePl/WFYB6+9UM/Fb2uVD6rV+o92xEipXV/gTZiSKxXGtD6pHHXaT1XsoSQXNf 3ENYjDXdASWJq9hqeslZKN8= X-Sasl-enc: llsYExfhuvMlNNIVPZdADqNb+BBc+oWomAm/fYni2cIj 1426321584 Original-Received: from thinkpad-t440p (unknown [2.162.112.8]) by mail.messagingengine.com (Postfix) with ESMTPA id A9C906800F1; Sat, 14 Mar 2015 04:26:23 -0400 (EDT) In-Reply-To: (Stefan Monnier's message of "Thu, 12 Mar 2015 10:52:51 -0400") User-Agent: Gnus/5.130012 (Ma Gnus v0.12) Emacs/25.0.50 (gnu/linux) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:100466 Archived-At: Stefan Monnier writes: >> Is committing the following change the right thing to do? > > On that philosophical question, I think the answer would be: > not quite. > > Instead, The Right Thing to do, might be to change elisp-mode's > font-lock rules so they check obarray for macros (i.e. use mapatoms + > regexp-opt to generate a macro matching all macros, and probably > update it from after-load-functions)? I don't understant what you mean with generating a macro matching all macros, but the attached patch uses a regexp defconst with a matcher function for font-lock-keywords. The regex is updated by an after-load-function which also refreshes fontification in existing elisp buffers. --8<---------------cut here---------------start------------->8--- diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el index 5d91209..96fa403 100644 --- a/lisp/emacs-lisp/lisp-mode.el +++ b/lisp/emacs-lisp/lisp-mode.el @@ -181,6 +181,30 @@ nil))) 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'." + (let (elisp-macros) + (mapatoms (lambda (a) + (when (macrop a) + (push (symbol-name a) elisp-macros)))) + (setq lisp--el-macro-regexp + (concat "(" (regexp-opt elisp-macros t) "\\_>")))) + +(defun lisp--el-update-after-load (_file) + "Update `lisp--el-macro-regexp' and adjust font-lock in existing buffers." + (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 ((`(,vdefs ,tdefs ,el-defs-re ,cl-defs-re @@ -194,7 +218,9 @@ "when" "unless" "with-output-to-string" "ignore-errors" "dotimes" "dolist" "declare")) (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" "define-derived-mode" "define-minor-mode" "define-generic-mode" "define-global-minor-mode" @@ -333,7 +359,7 @@ `( ;; Regexp negated char group. ("\\[\\(\\^\\)" 1 font-lock-negation-char-face prepend) ;; Control structures. Common Lisp forms. - (,(concat "(" el-kws-re "\\_>") . 1) + (lisp--el-match-macro . 1) ;; Exit/Feature symbols as constants. (,(concat "(\\(catch\\|throw\\|featurep\\|provide\\|require\\)\\_>" "[ \t']*\\(\\(?:\\sw\\|\\s_\\)+\\)?") @@ -514,6 +540,9 @@ font-lock keywords will not be case sensitive." . lisp-font-lock-syntactic-face-function))) (setq-local prettify-symbols-alist lisp--prettify-symbols-alist) (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 (cons '(?\` . ?\') electric-pair-text-pairs))) (setq-local electric-pair-skip-whitespace 'chomp) --8<---------------cut here---------------end--------------->8--- Bye, Tassilo