annotate lisp/packages/paren.el @ 189:489f57a838ef r20-3b21

Import from CVS: tag r20-3b21
author cvs
date Mon, 13 Aug 2007 09:57:07 +0200
parents 1370575f1259
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 ;;; paren.el --- highlight (un)matching parens and whole expressions
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 ;; Copyright (C) 1993 Free Software Foundation, Inc.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 ;; Copyright (C) 1993, 1994, 1995 Tinker Systems
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6 ;; Author: Jonathan Stigelman <Stig@hackvan.com>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 ;; Note: (some code scammed from simple.el and blink-paren.el)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 ;; Maintainer: Jonathan Stigelman <Stig@hackvan.com>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 ;; Keywords: languages, faces
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 ;;; This file is part of XEmacs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 ;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 ;;; XEmacs is free software; you can redistribute it and/or modify
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 ;;; it under the terms of the GNU General Public License as published by
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 ;;; the Free Software Foundation; either version 2 of the License, or
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 ;;; (at your option) any later version.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 ;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 ;;; XEmacs is distributed in the hope that it will be useful,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 ;;; GNU General Public License for more details.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 ;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 ;;; You should have received a copy of the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 ;;; along with XEmacs; if not, write to the Free Software
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 ;;; Synched up with: Not synched with FSF.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 ;;; Way different from FSF.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 ;;; Commentary:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 ;; Purpose of this package:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 ;; This package highlights matching parens (or whole sexps) for easier
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 ;; editing of source code, particularly lisp source code.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 ;; The `paren-highlight' hook function runs after each command and
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 ;; checks to see if the cursor is at a parenthesis. If so, then it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 ;; highlights, in one of several ways, the matching parenthesis.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 ;; Priority is given to matching parentheses right before the cursor because
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 ;; that's what makes sense when you're typing a lot of closed parentheses.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 ;; This is especially intuitive if you frequently use forward-sexp (M-C-f)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 ;; and backward-sexp (M-C-b) to maneuver around in source code.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 ;; Different faces are used for matching and mismatching parens so that it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48 ;; is easier to see mistakes as you type them. Audible feedback is optional.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 ;; If a (mis)matching paren is offscreen, then a message is sent to the modeline.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 ;; If paren-mode is `sexp', entire S-expressions are highlighted instead of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 ;; just matching parens.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 ;;; Code:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56
189
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
57 (defgroup paren-matching nil
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
58 "Highlight (un)matching of parens and expressions."
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
59 :prefix "paren-"
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
60 :group 'matching)
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
61
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
62
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
63 ;;;###autoload
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
64 (defcustom paren-mode nil
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
65 "*Sets the style of parenthesis highlighting.
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
66 Valid values are nil, `blink-paren', `paren', and `sexp'.
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
67 nil no parenthesis highlighting.
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
68 blink-paren causes the matching paren to blink.
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
69 paren causes the matching paren to be highlighted but not to blink.
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
70 sexp whole expression enclosed by the local paren at its mate.
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
71 nested (not yet implemented) use variable shading to see the
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
72 nesting of an expression. Also groks regular expressions
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
73 and shell quoting.
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
74
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
75 This variable is global by default, but you can make it buffer-local and
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
76 highlight parentheses differently in different major modes."
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
77 :type '(radio (const :tag "None (default)" nil)
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
78 (const :tag "Blinking Paren" blink-paren)
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
79 (const :tag "Highlighted Paren" paren)
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
80 (const :tag "Highlighted Expression" sexp))
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
81 :set (lambda (symbol value)
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
82 (paren-set-mode value))
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
83 :initialize 'custom-initialize-default
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
84 :require 'paren
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
85 :group 'paren-matching)
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
86
124
9b50b4588a93 Import from CVS: tag r20-1b15
cvs
parents: 108
diff changeset
87 (defcustom paren-message-offscreen t
9b50b4588a93 Import from CVS: tag r20-1b15
cvs
parents: 108
diff changeset
88 "*Display message if matching open paren is offscreen."
9b50b4588a93 Import from CVS: tag r20-1b15
cvs
parents: 108
diff changeset
89 :type 'boolean
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 124
diff changeset
90 :group 'paren-matching)
124
9b50b4588a93 Import from CVS: tag r20-1b15
cvs
parents: 108
diff changeset
91
9b50b4588a93 Import from CVS: tag r20-1b15
cvs
parents: 108
diff changeset
92 (defcustom paren-ding-unmatched nil
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 "*Make noise if the cursor is at an unmatched paren.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95 If T, then typing or passing over an unmatched paren will ring the bell
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 using the `paren' sound. If NIL, then the bell will not ring even if an
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 unmatched paren is typed. If neither T or NIL, then the bell will not ring
124
9b50b4588a93 Import from CVS: tag r20-1b15
cvs
parents: 108
diff changeset
98 when the cursor moves over unmatched parens but will ring if one is typed."
9b50b4588a93 Import from CVS: tag r20-1b15
cvs
parents: 108
diff changeset
99 :type '(choice (const :tag "off" nil)
9b50b4588a93 Import from CVS: tag r20-1b15
cvs
parents: 108
diff changeset
100 (const :tag "on" t)
9b50b4588a93 Import from CVS: tag r20-1b15
cvs
parents: 108
diff changeset
101 (const :tag "other" other))
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 124
diff changeset
102 :group 'paren-matching)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 (make-face 'paren-match)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 (or (face-differs-from-default-p 'paren-match)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 (copy-face 'highlight 'paren-match))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 (make-face 'paren-mismatch)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109 (cond ((face-differs-from-default-p 'paren-mismatch) nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 (t (let ((color-tag (list 'x 'color))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 (mono-tag (list 'x 'mono))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 (gray-tag (list 'x 'grayscale)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 (set-face-background 'paren-mismatch "DeepPink" 'global color-tag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 (set-face-reverse-p 'paren-mismatch t 'global 'tty)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 (set-face-background 'paren-mismatch [modeline background] 'global
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 mono-tag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117 (set-face-foreground 'paren-mismatch [modeline foreground] 'global
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 mono-tag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119 (set-face-background 'paren-mismatch [modeline background] 'global
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 gray-tag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 (set-face-foreground 'paren-mismatch [modeline foreground] 'global
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 gray-tag))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 (make-face 'paren-blink-off)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 (or (face-differs-from-default-p 'paren-blink-off)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 (set-face-foreground 'paren-blink-off (face-background 'default)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 ;; this is either paren-match or paren-mismatch...
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 (defvar paren-blink-on-face nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130
189
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
131 (defcustom paren-blink-interval 0.2
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 "*If the cursor is on a parenthesis, the matching parenthesis will blink.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 This variable controls how long each phase of the blink lasts in seconds.
189
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
134 This should be a fractional part of a second (a float.)"
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
135 :type 'number
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
136 :group 'paren-matching)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137
189
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
138 (defcustom paren-max-blinks (* 5 60 5) ; 5 minutes is plenty...
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 ;; idea from Eric Eide <eeide@jaguar.cs.utah.edu>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 "*Maximum number of times that a matching parenthesis will blink.
189
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
141 Set this to NIL if you want indefinite blinking."
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
142 :type 'number
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
143 :group 'paren-matching)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145 ;; timeout to blink the face
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146 (defvar paren-timeout-id nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 ;; Code:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 (defvar paren-n-blinks)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 (defvar paren-extent nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 ;; used to suppress messages from the same position so that other messages
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 ;; can be seen in the modeline.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 (make-variable-buffer-local
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 (defvar paren-message-suppress nil))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 (defsubst pos-visible-in-window-safe (pos)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 "safe version of pos-visible-in-window-p"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 (condition-case nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 ;; #### - is this needed in XEmacs???
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162 (pos-visible-in-window-p pos)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 (args-out-of-range nil)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 ;; called before a new command is executed in the pre-command-hook
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 ;; cleanup by removing the extent and the time-out
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 (defun paren-nuke-extent ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 (condition-case c ; don't ever signal an error in pre-command-hook!
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 (let ((inhibit-quit t))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 (if paren-timeout-id
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 (disable-timeout (prog1 paren-timeout-id
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 (setq paren-timeout-id nil))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 (if paren-extent
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 (delete-extent (prog1 paren-extent
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 (setq paren-extent nil)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 (error
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 (message "paren-nuke-extent error! %s" c))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 ;; callback for the timeout
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 ;; swap the face of the extent on the matching paren
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 (defun paren-blink-timeout (arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 ;; The extent could have been deleted for some reason and not point to a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183 ;; buffer anymore. So catch any error to remove the timeout.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 (condition-case ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 (if (and paren-max-blinks
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186 (> (setq paren-n-blinks (1+ paren-n-blinks)) paren-max-blinks))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187 (paren-nuke-extent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 (set-extent-face paren-extent
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 (if (eq (extent-face paren-extent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 paren-blink-on-face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 'paren-blink-off
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192 paren-blink-on-face)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193 (error (paren-nuke-extent))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 (defun paren-describe-match (pos mismatch)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 (or (window-minibuffer-p (selected-window))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 (goto-char pos)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 (message "%s %s"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 (if mismatch "MISMATCH:" "Matches")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 ;; if there's stuff on this line preceding the paren, then
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 ;; display text from beginning of line to paren.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 ;; If, however, the paren is at the beginning of a line, then
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 ;; skip whitespace forward and display text from paren to end
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 ;; of the next line containing nonspace text.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 ;; If paren-backwards-message gravity were implemented, then
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 ;; perhaps it would reverse this behavior and look to the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 ;; previous line for meaningful context.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212 (if (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 (skip-chars-backward " \t")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214 (not (bolp)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 (concat (buffer-substring
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 (progn (beginning-of-line) (point))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217 (1+ pos)) "...")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218 (buffer-substring
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 pos (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220 (forward-char 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221 (skip-chars-forward "\n \t")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 (end-of-line)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 (point))))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 (defun paren-maybe-ding ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226 (and (or (eq paren-ding-unmatched t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227 (and paren-ding-unmatched
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 (eq this-command 'self-insert-command)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230 (message "Unmatched parenthesis.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231 (ding nil 'paren))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233 ;; Find the place to show, if there is one,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 ;; and show it until input arrives.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 (defun paren-highlight ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 "This highlights matching parentheses.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238 See the variables:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239 paren-message-offscreen use modeline when matchingparen is offscreen?
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 paren-ding-unmatched make noise when passing over mismatched parens?
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241 paren-mode 'blink-paren, 'paren, or 'sexp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242 blink-matching-paren-distance maximum distance to search for parens.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 and the following faces:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245 paren-match, paren-mismatch, paren-blink-off"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247 ;; I suppose I could check here to see if a keyboard macro is executing,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 ;; but I did a quick empirical check and couldn't tell that there was any
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249 ;; difference in performance
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 (let ((oldpos (point))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252 (pface nil) ; face for paren...nil kills the overlay
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 (dir (and paren-mode
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 (not (input-pending-p))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 (not executing-kbd-macro)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256 (cond ((eq (char-syntax (preceding-char)) ?\))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
257 -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258 ((eq (char-syntax (following-char)) ?\()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259 1))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
260 pos mismatch)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
261
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263 (if (or (not dir)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
264 (not (save-restriction
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
265 ;; Determine the range within which to look for a match.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
266 (if blink-matching-paren-distance
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
267 (narrow-to-region
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268 (max (point-min)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
269 (- (point) blink-matching-paren-distance))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
270 (min (point-max)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
271 (+ (point) blink-matching-paren-distance))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
272
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
273 ;; Scan across one sexp within that range.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274 (condition-case nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
275 (setq pos (scan-sexps (point) dir))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
276 ;; NOTE - if blink-matching-paren-distance is set,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
277 ;; then we can have spurious unmatched parens.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
278 (error (paren-maybe-ding)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
279 nil)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
280
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
281 ;; do nothing if we didn't find a matching paren...
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
282 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
283
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
284 ;; See if the "matching" paren is the right kind of paren
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
285 ;; to match the one we started at.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
286 (let ((beg (min pos oldpos)) (end (max pos oldpos)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
287 (setq mismatch
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
288 (and (/= (char-syntax (char-after beg)) ?\\)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
289 (/= (char-syntax (char-after beg)) ?\$)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
290 ;; XEmacs change
100
4be1180a9e89 Import from CVS: tag r20-1b2
cvs
parents: 70
diff changeset
291 (matching-paren (char-after beg))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
292 (/= (char-after (1- end))
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents: 30
diff changeset
293 (matching-paren (char-after beg)))))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
294 (if (eq paren-mode 'sexp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
295 (setq paren-extent (make-extent beg end))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
296 (and mismatch
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
297 (paren-maybe-ding))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
298 (setq pface (if mismatch
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
299 'paren-mismatch
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
300 'paren-match))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
301 (and (memq paren-mode '(blink-paren paren))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
302 (setq paren-extent (make-extent (- pos dir) pos)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
303
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
304 (if (and paren-message-offscreen
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
305 (eq dir -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
306 (not (eq paren-message-suppress (point)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
307 (not (window-minibuffer-p (selected-window)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
308 (not (pos-visible-in-window-safe pos)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
309 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
310 (setq paren-message-suppress (point))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
311 (paren-describe-match pos mismatch))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
312 (setq paren-message-suppress nil))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
313
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
314 ;; put the right face on the extent
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
315 (cond (pface
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
316 (set-extent-face paren-extent pface)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
317 (set-extent-priority paren-extent 100) ; want this to be high
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
318 (and (eq paren-mode 'blink-paren)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
319 (setq paren-blink-on-face pface
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
320 paren-n-blinks 0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
321 paren-timeout-id
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
322 (and paren-blink-interval
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
323 (add-timeout paren-blink-interval
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
324 'paren-blink-timeout
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
325 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
326 paren-blink-interval))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
327 ))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
328
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
329
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
330 ;;;###autoload
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
331 (defun paren-set-mode (arg &optional quiet)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
332 "Cycles through possible values for `paren-mode', force off with negative arg.
108
360340f9fd5f Import from CVS: tag r20-1b6
cvs
parents: 100
diff changeset
333 When called from lisp, a symbolic value for `paren-mode' can be passed directly.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
334 See also `paren-mode' and `paren-highlight'."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
335 (interactive "P")
189
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
336 ;; kill off the competition, er, uh, eliminate redundancy...
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
337 (setq post-command-hook (delq 'show-paren-command-hook post-command-hook))
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
338 (setq pre-command-hook (delq 'blink-paren-pre-command pre-command-hook))
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
339 (setq post-command-hook (delq 'blink-paren-post-command post-command-hook))
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
340
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
341 (let* ((paren-modes '(blink-paren paren sexp))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
342 (paren-next-modes (cons nil (append paren-modes (list nil)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
343 (setq paren-mode (if (and (numberp arg) (< arg 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
344 nil ; turn paren highlighting off
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
345 (cond ((and arg (symbolp arg)) arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
346 ((and (numberp arg) (> arg 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
347 (nth (1- arg) paren-modes))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
348 ((numberp arg) nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
349 (t (car (cdr (memq paren-mode
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
350 paren-next-modes)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
351 )))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
352 (cond (paren-mode
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
353 (add-hook 'post-command-hook 'paren-highlight)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
354 (add-hook 'pre-command-hook 'paren-nuke-extent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
355 (setq blink-matching-paren nil))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
356 ((not (local-variable-p 'paren-mode (current-buffer)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
357 (remove-hook 'post-command-hook 'paren-highlight)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
358 (remove-hook 'pre-command-hook 'paren-nuke-extent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
359 (paren-nuke-extent) ; overkill
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
360 (setq blink-matching-paren t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
361 ))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
362 (or quiet (message "Paren mode is %s" (or paren-mode "OFF"))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
363
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
364 (eval-when-compile
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
365 ;; suppress compiler warning.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
366 (defvar highlight-paren-expression))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
367
189
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
368 ;; No no no!
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
369 ;(paren-set-mode (if (and (boundp 'highlight-paren-expression)
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
370 ; ;; bletcherous blink-paren no-naming-convention
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
371 ; highlight-paren-expression)
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
372 ; 'sexp
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
373 ; (if (eq 'x (device-type (selected-device)))
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
374 ; 'blink-paren
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
375 ; 'paren))
489f57a838ef Import from CVS: tag r20-3b21
cvs
parents: 126
diff changeset
376 ; t)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
377
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
378 ;;;###autoload
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
379 (make-obsolete 'blink-paren 'paren-set-mode)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
380
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
381 ;;;###autoload
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
382 (defun blink-paren (&optional arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
383 "Obsolete. Use `paren-set-mode' instead."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
384 (interactive "P")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
385 (paren-set-mode (if (and (numberp arg) (> arg 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
386 'blink-paren -1) t))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
387
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
388 (provide 'blink-paren)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
389 (provide 'paren)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
390
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
391 ;; Local Variables:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
392 ;; byte-optimize: t
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
393 ;; End:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
394
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
395 ;;; paren.el ends here