From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Drew Adams" Newsgroups: gmane.emacs.bugs Subject: bug#4835: 23.1; Improper `Invalid face reference' messages. Performance degraded. Date: Wed, 9 Dec 2009 10:23:37 -0800 Message-ID: <006573D5DAC94F779FC64D2E0FEEEE7E@us.oracle.com> References: <87ws2bfkyt.fsf@stupidchicken.com><87iqdvmk1j.fsf@stupidchicken.com><6ABF3195EEF74EB780205758FA68D61B@us.oracle.com><87pr83th6b.fsf@stupidchicken.com><8F2C3E771C104B03B9926AB1AAFD02A5@us.oracle.com><87zl7743tj.fsf@stupidchicken.com><5101E088BA774F93BCA9BA30DF7C826F@us.oracle.com><877hubku5o.fsf@stupidchicken.com> <38BD7996136A41F1A0F8A2B5784A0D16@us.oracle.com> Reply-To: Drew Adams , 4835@emacsbugs.donarmstrong.com NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_001E_01CA78B9.AB99B2A0" X-Trace: ger.gmane.org 1260384479 14434 80.91.229.12 (9 Dec 2009 18:47:59 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 9 Dec 2009 18:47:59 +0000 (UTC) To: <4835@emacsbugs.donarmstrong.com>, "'Stefan Monnier'" Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Dec 09 19:47:51 2009 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1NIRZa-00076y-IH for geb-bug-gnu-emacs@m.gmane.org; Wed, 09 Dec 2009 19:47:51 +0100 Original-Received: from localhost ([127.0.0.1]:53786 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NIRZa-0006KY-AF for geb-bug-gnu-emacs@m.gmane.org; Wed, 09 Dec 2009 13:47:38 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NIRZV-0006JU-Ft for bug-gnu-emacs@gnu.org; Wed, 09 Dec 2009 13:47:33 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NIRZR-0006GV-RJ for bug-gnu-emacs@gnu.org; Wed, 09 Dec 2009 13:47:33 -0500 Original-Received: from [199.232.76.173] (port=53912 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NIRZR-0006GL-Lt for bug-gnu-emacs@gnu.org; Wed, 09 Dec 2009 13:47:29 -0500 Original-Received: from rzlab.ucr.edu ([138.23.92.77]:59475) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NIRZQ-0006Dj-Ob for bug-gnu-emacs@gnu.org; Wed, 09 Dec 2009 13:47:29 -0500 Original-Received: from rzlab.ucr.edu (rzlab.ucr.edu [127.0.0.1]) by rzlab.ucr.edu (8.14.3/8.14.3/Debian-5) with ESMTP id nB9IlQs4011078; Wed, 9 Dec 2009 10:47:26 -0800 Original-Received: (from debbugs@localhost) by rzlab.ucr.edu (8.14.3/8.14.3/Submit) id nB9IU4p9009316; Wed, 9 Dec 2009 10:30:04 -0800 Resent-Date: Wed, 9 Dec 2009 10:30:04 -0800 X-Loop: owner@emacsbugs.donarmstrong.com Resent-From: "Drew Adams" Resent-To: bug-submit-list@donarmstrong.com Resent-CC: Emacs Bugs 2Resent-Date: Wed, 09 Dec 2009 18:30:04 +0000 Resent-Message-ID: Resent-Sender: owner@emacsbugs.donarmstrong.com X-Emacs-PR-Message: followup 4835 X-Emacs-PR-Package: emacs X-Emacs-PR-Keywords: Original-Received: via spool by 4835-submit@emacsbugs.donarmstrong.com id=B4835.12603830458724 (code B ref 4835); Wed, 09 Dec 2009 18:30:04 +0000 Original-Received: (at 4835) by emacsbugs.donarmstrong.com; 9 Dec 2009 18:24:05 +0000 X-Spam-Bayes: score:0.5 Bayes not run. spammytokens:Tokens not available. hammytokens:Tokens not available. Original-Received: from rcsinet12.oracle.com (rcsinet12.oracle.com [148.87.113.124]) by rzlab.ucr.edu (8.14.3/8.14.3/Debian-5) with ESMTP id nB9IO4oe008717 for <4835@emacsbugs.donarmstrong.com>; Wed, 9 Dec 2009 10:24:05 -0800 Original-Received: from rgminet15.oracle.com (rcsinet15.oracle.com [148.87.113.117]) by rcsinet12.oracle.com (Switch-3.4.1/Switch-3.4.1) with ESMTP id nB9INuVk032044 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 9 Dec 2009 18:23:57 GMT Original-Received: from acsmt354.oracle.com (acsmt354.oracle.com [141.146.40.154]) by rgminet15.oracle.com (Switch-3.3.1/Switch-3.3.1) with ESMTP id nB92ggYU023137; Wed, 9 Dec 2009 18:23:59 GMT Original-Received: from abhmt014.oracle.com by acsmt353.oracle.com with ESMTP id 901103781260383016; Wed, 09 Dec 2009 10:23:36 -0800 Original-Received: from dradamslap1 (/130.35.178.194) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 09 Dec 2009 10:23:36 -0800 X-Priority: 1 (Highest) X-MSMail-Priority: High X-Mailer: Microsoft Office Outlook 11 In-Reply-To: <38BD7996136A41F1A0F8A2B5784A0D16@us.oracle.com> Thread-Index: Acpag8xnCcGiX+fVRu2lU35ZF8vAuAAAN/twAcRcw4AF2KkaUA== X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579 Importance: High X-Message-Flag: Follow up X-Auth-Type: Internal IP X-Source-IP: rcsinet15.oracle.com [148.87.113.117] X-CT-RefId: str=0001.0A090204.4B1FEB3E.000D:SCFMA4539811,ss=1,fgs=0 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Resent-Date: Wed, 09 Dec 2009 13:47:33 -0500 X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:33443 Archived-At: This is a multi-part message in MIME format. ------=_NextPart_000_001E_01CA78B9.AB99B2A0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit In hopes of getting some new attention to this bug, I've included a simple test case in the attached file. Just use emacs -Q, then load the file. Then `C-x 5 b *Messages*'. Then `M-x column-marker-1'. Then click the *Messages* frame to select it. At the last step, you will see zillions of messages logged. No messages are logged when the highlighting occurs, however. They appear only when you do something else (e.g. choose the *Messages* window). And they keep on coming, as you interact with Emacs. I assume they are coming from the display engine. [I followed the above recipe with point in column 21. See the comments at the end of the attached file - you will see that they reference "column 22".] The relevant part of `font-lock-keywords' is this: (column-marker-move-to-22 (0 column-marker-1 prepend t)) Function `column-marker-move-to-22' has this as its `symbol-function' when the highlighting is turned on: (lambda (end) (let ((start (point))) (when (> end (point-max)) (setq end (point-max))) (unless (< (current-column) 22) (forward-line 1)) (when (< (current-column) 22) (move-to-column 22)) (while (and (< (current-column) 22) (< (point) end) (= 0 (+ (forward-line 1)(current-column)))) (move-to-column 22)) (if (and (= 22 (current-column)) (<= (point) end) (> (point) start)) (progn (set-match-data (list (1- (point)) (point))) t) (goto-char start) nil))) [Note: The issue of using a `lambda' form in `font-lock-keywords' was removed from the bug recipe: I instead now use a symbol that has a function definition. This unfortunately changes nothing wrt the bug.] The code works fine: column 22 is highlighted as expected. (You can turn off highlighting with `C-u M-x column-marker-1'.) The only problem is the zillions of messages that are logged to *Messages* endlessly. That degrades performance so much that it brings Emacs to a crawl. This is the case for both Emacs 22 and 23. It seems that each redisplay causes this sequence of four messages to be logged many times, over and over: Invalid face reference: prepend Invalid face reference: 0 Invalid face reference: column-marker-move-to-22 Invalid face reference: t Again, I *hope* I am simply doing something wrong, and you will help me by letting me know what is wrong and how to fix it. As far as I can tell, however, this is a serious bug. ------=_NextPart_000_001E_01CA78B9.AB99B2A0 Content-Type: application/octet-stream; name="throw-col-marker.el" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="throw-col-marker.el" (defface column-marker-1 '((t (:background "gray"))) "" :group 'faces)=0A= =0A= (defvar column-marker-vars ())=0A= (make-variable-buffer-local 'column-marker-vars)=0A= =0A= (defvar column-marker-1 ())=0A= (make-variable-buffer-local 'column-marker-1)=0A= (defun column-marker-1 (arg)=0A= (interactive "P")=0A= (unless (memq 'column-marker-1 column-marker-vars)=0A= (push 'column-marker-1 column-marker-vars))=0A= (cond ((null arg)=0A= (column-marker-internal=0A= 'column-marker-1 (1+ (current-column)) 'column-marker-1))=0A= ((consp arg)=0A= (if (=3D 4 (car arg))=0A= (column-marker-internal 'column-marker-1 nil)=0A= (dolist (var column-marker-vars)=0A= (column-marker-internal var nil))))=0A= ((and (integerp arg) (>=3D arg 0))=0A= (column-marker-internal 'column-marker-1=0A= (1+ (prefix-numeric-value arg))=0A= 'column-marker-1))=0A= (t=0A= (dolist (var column-marker-vars)=0A= (column-marker-internal var nil)))))=0A= =0A= (defun column-marker-find (col)=0A= "Defines a function to locate a character in column COL.=0A= Returns the function symbol, named `column-marker-move-to-COL'."=0A= (let ((fn-symb (intern (format "column-marker-move-to-%d" col))))=0A= (fset `,fn-symb=0A= `(lambda (end)=0A= (let ((start (point)))=0A= (when (> end (point-max)) (setq end (point-max)))=0A= =0A= (unless (< (current-column) ,col) (forward-line 1))=0A= (when (< (current-column) ,col) (move-to-column ,col))=0A= (while (and (< (current-column) ,col) (< (point) end)=0A= (=3D 0 (+ (forward-line 1) (current-column))))=0A= (move-to-column ,col))=0A= (if (and (=3D ,col (current-column))=0A= (<=3D (point) end) (> (point) start))=0A= (progn (set-match-data (list (1- (point)) (point))) t)=0A= (goto-char start)=0A= nil))))=0A= fn-symb))=0A= =0A= (defun column-marker-internal (sym col &optional face)=0A= "SYM is the symbol for holding the column marker context.=0A= COL is the column in which a marker should be set.=0A= Supplying nil or 0 for COL turns off the marker.=0A= FACE is the face to use. If nil, then face `column-marker-1' is used."=0A= (setq face (or face 'column-marker-1))=0A= (when (symbol-value sym)=0A= (font-lock-remove-keywords nil (symbol-value sym))=0A= (set sym nil))=0A= (when (or (listp col) (< col 0)) (setq col nil))=0A= (when col=0A= (set sym `((,(column-marker-find col) (0 ,face prepend t))))=0A= (font-lock-add-keywords nil (symbol-value sym) t))=0A= (font-lock-fontify-buffer))=0A= =0A= =0A= ;; --------------------------------------------------------=0A= ;; These are the messages in *Messages*, with this sequence repeated a=0A= ;; zillion times. Note that the messages do *not* appear as soon as I=0A= ;; call `M-x column-marker-1' (with point in column 21). They appear=0A= ;; (I think) as soon as I do something that forces redisplay -=0A= ;; e.g. select a window showing *Messages*.=0A= ;;=0A= ;; Invalid face reference: prepend=0A= ;; Invalid face reference: 0=0A= ;; Invalid face reference: column-marker-move-to-22=0A= ;; Invalid face reference: t=0A= =0A= ;;-----------------------------------------------=0A= ;; This is (symbol-function 'column-marker-1):=0A= ;; (lambda=0A= ;; (arg)=0A= ;; (interactive "P")=0A= ;; (unless=0A= ;; (memq 'column-marker-1 column-marker-vars)=0A= ;; (push 'column-marker-1 column-marker-vars))=0A= ;; (cond=0A= ;; ((null arg)=0A= ;; (column-marker-internal 'column-marker-1=0A= ;; (1+=0A= ;; (current-column))=0A= ;; 'column-marker-1))=0A= ;; ((consp arg)=0A= ;; (if=0A= ;; (=3D 4=0A= ;; (car arg))=0A= ;; (column-marker-internal 'column-marker-1 nil)=0A= ;; (dolist=0A= ;; (var column-marker-vars)=0A= ;; (column-marker-internal var nil))))=0A= ;; ((and=0A= ;; (integerp arg)=0A= ;; (>=3D arg 0))=0A= ;; (column-marker-internal 'column-marker-1=0A= ;; (1+=0A= ;; (prefix-numeric-value arg))=0A= ;; 'column-marker-1))=0A= ;; (t=0A= ;; (dolist=0A= ;; (var column-marker-vars)=0A= ;; (column-marker-internal var nil)))))=0A= =0A= ;;-----------------------------------------------=0A= ;; This the *value* of `column-marker-1', when highlighted:=0A= ;; ((column-marker-move-to-22 (0 column-marker-1 prepend t)))=0A= =0A= ;;-----------------------------------------------=0A= ;; This is (symbol-function 'column-marker-move-to-22) when highlighted:=0A= ;; (lambda (end)=0A= ;; (let ((start (point)))=0A= ;; (when (> end (point-max))=0A= ;; (setq end (point-max)))=0A= ;; (unless (< (current-column) 22) (forward-line 1))=0A= ;; (when (< (current-column) 22) (move-to-column 22))=0A= ;; (while (and (< (current-column) 22)=0A= ;; (< (point) end)=0A= ;; (=3D 0 (+ (forward-line 1)(current-column))))=0A= ;; (move-to-column 22))=0A= ;; (if (and (=3D 22 (current-column))=0A= ;; (<=3D (point) end)=0A= ;; (> (point) start))=0A= ;; (progn=0A= ;; (set-match-data=0A= ;; (list (1- (point)) (point)))=0A= ;; t)=0A= ;; (goto-char start)=0A= ;; nil)))=0A= =0A= ;;-----------------------------------------------=0A= ;; This is the part of `font-lock-keywords' that is relevant:=0A= ;; (column-marker-move-to-22 (0 column-marker-1 prepend t))=0A= =0A= ;;-----------------------------------------------=0A= ;; This is the full value of `font-lock-keywords':=0A= ;; (t=0A= ;; = (("(\\(def\\(\\(advice\\|alias\\|generic\\|macro\\*?\\|method\\|setf\\|su= bst\\*?\\|un\\*?\\|ine-\\(condition\\|\\(?:derived\\|\\(?:global\\(?:ized= \\)?-\\)?minor\\|generic\\)-mode\\|method-combination\\|setf-expander\\|s= keleton\\|widget\\|function\\|\\(compiler\\|modify\\|symbol\\)-macro\\)\\= )\\|\\(const\\(ant\\)?\\|custom\\|varalias\\|face\\|parameter\\|var\\)\\|= \\(class\\|group\\|theme\\|package\\|struct\\|type\\)\\)\\)\\>[ = '(]*\\(setf[ ]+\\sw+)\\|\\sw+\\)?"=0A= ;; (1 font-lock-keyword-face)=0A= ;; (9=0A= ;; (cond=0A= ;; ((match-beginning 3)=0A= ;; font-lock-function-name-face)=0A= ;; ((match-beginning 6)=0A= ;; font-lock-variable-name-face)=0A= ;; (t font-lock-type-face))=0A= ;; nil t))=0A= ;; ("^;;;###\\(autoload\\)" 1 font-lock-warning-face prepend)=0A= ;; ("\\[\\(\\^\\)" 1 font-lock-negation-char-face prepend)=0A= ;; = ("(\\(cond\\(?:ition-case\\)?\\|eval-\\(?:a\\(?:fter-load\\|nd-compile\\|= t-startup\\)\\|next-after-load\\|when\\(?:-compile\\)?\\)\\|i\\(?:f\\|nli= ne\\)\\|l\\(?:ambda\\|et\\*?\\)\\|prog[*12nv]?\\|save-\\(?:current-buffer= \\|excursion\\|match-data\\|restriction\\|selected-window\\|window-excurs= ion\\)\\|track-mouse\\|unwind-protect\\|w\\(?:hile\\(?:-no-input\\)?\\|it= h-\\(?:c\\(?:a\\(?:\\(?:se\\|tegory\\)-table\\)\\|urrent-buffer\\)\\|elec= tric-help\\|local-quit\\|no-warnings\\|output-to-\\(?:string\\|temp-buffe= r\\)\\|s\\(?:elected-window\\|yntax-table\\)\\|t\\(?:emp-\\(?:buffer\\|\\= (?:fil\\|messag\\)e\\)\\|imeout\\(?:-handler\\)?\\)\\)\\)\\)\\>" . 1)=0A= ;; = ("(\\(b\\(?:\\(?:loc\\|rea\\)k\\)\\|c\\(?:ase\\|case\\|ompiler-let\\|type= case\\)\\|d\\(?:e\\(?:cla\\(?:im\\|re\\)\\|structuring-bind\\)\\|o\\(?:\\= *\\|list\\|times\\)?\\)\\|e\\(?:\\(?:type\\)?case\\)\\|flet\\|go\\|handle= r-\\(?:bind\\|case\\)\\|i\\(?:gnore-errors\\|n-package\\)\\|l\\(?:abels\\= |exical-let\\*?\\|o\\(?:cally\\|op\\)\\)\\|m\\(?:acrolet\\|ultiple-value-= \\(?:bind\\|prog1\\)\\)\\|proclaim\\|re\\(?:start-\\(?:bind\\|case\\)\\|t= urn\\(?:-from\\)?\\)\\|symbol-macrolet\\|t\\(?:agbody\\|\\(?:h\\|ypecas\\= )e\\)\\|unless\\|w\\(?:hen\\|ith-\\(?:accessors\\|co\\(?:mpilation-unit\\= |ndition-restarts\\)\\|hash-table-iterator\\|input-from-string\\|o\\(?:pe= n-\\(?:file\\|stream\\)\\|utput-to-string\\)\\|package-iterator\\|s\\(?:i= mple-restart\\|lots\\|tandard-io-syntax\\)\\)\\)\\)\\>" . 1)=0A= ;; ("(\\(catch\\|throw\\|featurep\\|provide\\|require\\)\\>[ = ']*\\(\\sw+\\)?"=0A= ;; (1 font-lock-keyword-face)=0A= ;; (2 font-lock-constant-face nil t))=0A= ;; = ("(\\(abort\\|assert\\|warn\\|check-type\\|cerror\\|error\\|signal\\)\\>"= 1 font-lock-warning-face)=0A= ;; ("\\\\\\\\\\[\\(\\sw+\\)\\]" 1 font-lock-constant-face prepend)=0A= ;; ("`\\(\\sw\\sw+\\)'" 1 font-lock-constant-face prepend)=0A= ;; ("\\<:\\sw+\\>" 0 font-lock-builtin-face)=0A= ;; ("\\<\\&\\sw+\\>" . font-lock-type-face)=0A= ;; ((lambda=0A= ;; (bound)=0A= ;; (catch 'found=0A= ;; (while=0A= ;; (re-search-forward = "\\(\\\\\\\\\\)\\(?:\\(\\\\\\\\\\)\\|\\((\\(?:\\?:\\)?\\|[|)]\\)\\)" = bound t)=0A= ;; (unless=0A= ;; (match-beginning 2)=0A= ;; (let=0A= ;; ((face=0A= ;; (get-text-property=0A= ;; (1-=0A= ;; (point))=0A= ;; 'face)))=0A= ;; (when=0A= ;; (or=0A= ;; (and=0A= ;; (listp face)=0A= ;; (memq 'font-lock-string-face face))=0A= ;; (eq 'font-lock-string-face face))=0A= ;; (throw 'found t)))))))=0A= ;; (1 'font-lock-regexp-grouping-backslash prepend)=0A= ;; (3 'font-lock-regexp-grouping-construct prepend))=0A= ;; (column-marker-move-to-22=0A= ;; (0 column-marker-1 prepend t)))=0A= ;; = ("(\\(def\\(\\(advice\\|alias\\|generic\\|macro\\*?\\|method\\|setf\\|sub= st\\*?\\|un\\*?\\|ine-\\(condition\\|\\(?:derived\\|\\(?:global\\(?:ized\= \)?-\\)?minor\\|generic\\)-mode\\|method-combination\\|setf-expander\\|sk= eleton\\|widget\\|function\\|\\(compiler\\|modify\\|symbol\\)-macro\\)\\)= \\|\\(const\\(ant\\)?\\|custom\\|varalias\\|face\\|parameter\\|var\\)\\|\= \(class\\|group\\|theme\\|package\\|struct\\|type\\)\\)\\)\\>[ = '(]*\\(setf[ ]+\\sw+)\\|\\sw+\\)?"=0A= ;; (1 font-lock-keyword-face)=0A= ;; (9=0A= ;; (cond=0A= ;; ((match-beginning 3)=0A= ;; font-lock-function-name-face)=0A= ;; ((match-beginning 6)=0A= ;; font-lock-variable-name-face)=0A= ;; (t font-lock-type-face))=0A= ;; nil t))=0A= ;; ("^;;;###\\(autoload\\)"=0A= ;; (1 font-lock-warning-face prepend))=0A= ;; ("\\[\\(\\^\\)"=0A= ;; (1 font-lock-negation-char-face prepend))=0A= ;; = ("(\\(cond\\(?:ition-case\\)?\\|eval-\\(?:a\\(?:fter-load\\|nd-compile\\|= t-startup\\)\\|next-after-load\\|when\\(?:-compile\\)?\\)\\|i\\(?:f\\|nli= ne\\)\\|l\\(?:ambda\\|et\\*?\\)\\|prog[*12nv]?\\|save-\\(?:current-buffer= \\|excursion\\|match-data\\|restriction\\|selected-window\\|window-excurs= ion\\)\\|track-mouse\\|unwind-protect\\|w\\(?:hile\\(?:-no-input\\)?\\|it= h-\\(?:c\\(?:a\\(?:\\(?:se\\|tegory\\)-table\\)\\|urrent-buffer\\)\\|elec= tric-help\\|local-quit\\|no-warnings\\|output-to-\\(?:string\\|temp-buffe= r\\)\\|s\\(?:elected-window\\|yntax-table\\)\\|t\\(?:emp-\\(?:buffer\\|\\= (?:fil\\|messag\\)e\\)\\|imeout\\(?:-handler\\)?\\)\\)\\)\\)\\>"=0A= ;; (1 font-lock-keyword-face))=0A= ;; = ("(\\(b\\(?:\\(?:loc\\|rea\\)k\\)\\|c\\(?:ase\\|case\\|ompiler-let\\|type= case\\)\\|d\\(?:e\\(?:cla\\(?:im\\|re\\)\\|structuring-bind\\)\\|o\\(?:\\= *\\|list\\|times\\)?\\)\\|e\\(?:\\(?:type\\)?case\\)\\|flet\\|go\\|handle= r-\\(?:bind\\|case\\)\\|i\\(?:gnore-errors\\|n-package\\)\\|l\\(?:abels\\= |exical-let\\*?\\|o\\(?:cally\\|op\\)\\)\\|m\\(?:acrolet\\|ultiple-value-= \\(?:bind\\|prog1\\)\\)\\|proclaim\\|re\\(?:start-\\(?:bind\\|case\\)\\|t= urn\\(?:-from\\)?\\)\\|symbol-macrolet\\|t\\(?:agbody\\|\\(?:h\\|ypecas\\= )e\\)\\|unless\\|w\\(?:hen\\|ith-\\(?:accessors\\|co\\(?:mpilation-unit\\= |ndition-restarts\\)\\|hash-table-iterator\\|input-from-string\\|o\\(?:pe= n-\\(?:file\\|stream\\)\\|utput-to-string\\)\\|package-iterator\\|s\\(?:i= mple-restart\\|lots\\|tandard-io-syntax\\)\\)\\)\\)\\>"=0A= ;; (1 font-lock-keyword-face))=0A= ;; ("(\\(catch\\|throw\\|featurep\\|provide\\|require\\)\\>[ = ']*\\(\\sw+\\)?"=0A= ;; (1 font-lock-keyword-face)=0A= ;; (2 font-lock-constant-face nil t))=0A= ;; = ("(\\(abort\\|assert\\|warn\\|check-type\\|cerror\\|error\\|signal\\)\\>"=0A= ;; (1 font-lock-warning-face))=0A= ;; ("\\\\\\\\\\[\\(\\sw+\\)\\]"=0A= ;; (1 font-lock-constant-face prepend))=0A= ;; ("`\\(\\sw\\sw+\\)'"=0A= ;; (1 font-lock-constant-face prepend))=0A= ;; ("\\<:\\sw+\\>"=0A= ;; (0 font-lock-builtin-face))=0A= ;; ("\\<\\&\\sw+\\>"=0A= ;; (0 font-lock-type-face))=0A= ;; ((lambda=0A= ;; (bound)=0A= ;; (catch 'found=0A= ;; (while=0A= ;; (re-search-forward = "\\(\\\\\\\\\\)\\(?:\\(\\\\\\\\\\)\\|\\((\\(?:\\?:\\)?\\|[|)]\\)\\)" = bound t)=0A= ;; (unless=0A= ;; (match-beginning 2)=0A= ;; (let=0A= ;; ((face=0A= ;; (get-text-property=0A= ;; (1-=0A= ;; (point))=0A= ;; 'face)))=0A= ;; (when=0A= ;; (or=0A= ;; (and=0A= ;; (listp face)=0A= ;; (memq 'font-lock-string-face face))=0A= ;; (eq 'font-lock-string-face face))=0A= ;; (throw 'found t)))))))=0A= ;; (1 'font-lock-regexp-grouping-backslash prepend)=0A= ;; (3 'font-lock-regexp-grouping-construct prepend))=0A= ;; (column-marker-move-to-22=0A= ;; (0 column-marker-1 prepend t))=0A= ;; ("^\\s("=0A= ;; (0=0A= ;; (if=0A= ;; (memq=0A= ;; (get-text-property=0A= ;; (match-beginning 0)=0A= ;; 'face)=0A= ;; '(font-lock-string-face font-lock-doc-face font-lock-comment-face))=0A= ;; (list 'face font-lock-warning-face 'help-echo "Looks like a = toplevel defun: escape the parenthesis"))=0A= ;; prepend)))=0A= =0A= ;;---------------------------------------------------------=0A= ;; For reference, this is a macro used in the original code. I simply=0A= ;; inlined a call to it with arg `column-marker-1', above, to simplify = things.=0A= =0A= ;; ;; (defmacro column-marker-create (var &optional face)=0A= ;; "Define a column marker named VAR.=0A= ;; FACE is the face to use. If nil, then face `column-marker-1' is = used."=0A= ;; (setq face (or face 'column-marker-1))=0A= ;; `(progn=0A= ;; (defvar ,var () "Buffer local. Used internally to store column = marker spec.")=0A= ;; (make-variable-buffer-local ',var)=0A= ;; (defun ,var (arg)=0A= ;; (interactive "P")=0A= ;; (unless (memq ',var column-marker-vars) (push ',var = column-marker-vars))=0A= ;; (cond ((null arg)=0A= ;; (column-marker-internal ',var (1+ (current-column)) = ,face))=0A= ;; ((consp arg)=0A= ;; (if (=3D 4 (car arg))=0A= ;; (column-marker-internal ',var nil)=0A= ;; (dolist (var column-marker-vars)=0A= ;; (column-marker-internal var nil))))=0A= ;; ((and (integerp arg) (>=3D arg 0))=0A= ;; (column-marker-internal ',var (1+ (prefix-numeric-value = arg)) ,face))=0A= ;; (t=0A= ;; (dolist (var column-marker-vars)=0A= ;; (column-marker-internal var nil)))))))=0A= ;;=0A= ;;(column-marker-create column-marker-1)=0A= =0A= =0A= ------=_NextPart_000_001E_01CA78B9.AB99B2A0--