Mercurial > emacs
annotate lisp/paren.el @ 8624:2768933d85ad
(xmenu_show): Do nothing special for ButtonPress in the menu.
Call XtDispatchEvent for all ButtonRelease events.
xlwmenu.c now deals with posting the menu.
Check for events in subwidgets of the menu
when deciding whether to queue them for later handling.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Thu, 25 Aug 1994 05:05:50 +0000 |
parents | 30f91aa9b364 |
children | 6bf5b024dffb |
rev | line source |
---|---|
3912 | 1 ;;; paren.el --- highlight matching paren. |
3913 | 2 ;; Copyright (C) 1993 Free Software Foundation, Inc. |
3912 | 3 |
3977 | 4 ;; Author: rms@gnu.ai.mit.edu |
5 ;; Maintainer: FSF | |
6 ;; Keywords: languages, faces | |
3976 | 7 |
3912 | 8 ;; This file is part of GNU Emacs. |
9 | |
10 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
11 ;; it under the terms of the GNU General Public License as published by | |
12 ;; the Free Software Foundation; either version 2, or (at your option) | |
13 ;; any later version. | |
14 | |
15 ;; GNU Emacs is distributed in the hope that it will be useful, | |
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 ;; GNU General Public License for more details. | |
19 | |
20 ;; You should have received a copy of the GNU General Public License | |
21 ;; along with GNU Emacs; see the file COPYING. If not, write to | |
22 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | |
23 | |
24 ;;; Commentary: | |
25 | |
26 ;; Load this and it will display highlighting on whatever | |
27 ;; paren matches the one before or after point. | |
28 | |
29 ;;; Code: | |
30 | |
4123
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
31 ;; This is the overlay used to highlight the matching paren. |
3917 | 32 (defvar show-paren-overlay nil) |
4123
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
33 ;; This is the overlay used to highlight the closeparen |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
34 ;; right before point. |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
35 (defvar show-paren-overlay-1 nil) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
36 |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
37 (defvar show-paren-mismatch-face nil) |
3912 | 38 |
4183
a5f0a739d87d
(show-paren-face): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4123
diff
changeset
|
39 (defvar show-paren-face 'region |
a5f0a739d87d
(show-paren-face): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4123
diff
changeset
|
40 "*Name of face to use for showing the matching paren.") |
a5f0a739d87d
(show-paren-face): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4123
diff
changeset
|
41 |
3917 | 42 ;; Find the place to show, if there is one, |
43 ;; and show it until input arrives. | |
44 (defun show-paren-command-hook () | |
4582
7b665693054c
(show-paren-command-hook): Do nothing if input is pending.
Richard M. Stallman <rms@gnu.org>
parents:
4565
diff
changeset
|
45 ;; Do nothing if no window system to display results with. |
5623
d571ad3c796e
(show-paren-command-hook): Do nothing when in kbd macro.
Richard M. Stallman <rms@gnu.org>
parents:
4582
diff
changeset
|
46 ;; Do nothing if executing keyboard macro. |
4582
7b665693054c
(show-paren-command-hook): Do nothing if input is pending.
Richard M. Stallman <rms@gnu.org>
parents:
4565
diff
changeset
|
47 ;; Do nothing if input is pending. |
8050
bef2c11470f8
(show-paren-command-hook): Use matching-paren.
Richard M. Stallman <rms@gnu.org>
parents:
8022
diff
changeset
|
48 (if (and window-system (not executing-kbd-macro) (sit-for 0 100)) |
4059
66d33e1bf65b
(show-paren-command-hook): Do nothing if not window-system.
Richard M. Stallman <rms@gnu.org>
parents:
3977
diff
changeset
|
49 (let (pos dir mismatch (oldpos (point)) |
4183
a5f0a739d87d
(show-paren-face): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4123
diff
changeset
|
50 (face show-paren-face)) |
8022
fcf805b27bc5
(show-paren-command-hook): Handle close paren rather than open paren
Richard M. Stallman <rms@gnu.org>
parents:
8019
diff
changeset
|
51 (cond ((eq (char-syntax (preceding-char)) ?\)) |
fcf805b27bc5
(show-paren-command-hook): Handle close paren rather than open paren
Richard M. Stallman <rms@gnu.org>
parents:
8019
diff
changeset
|
52 (setq dir -1)) |
fcf805b27bc5
(show-paren-command-hook): Handle close paren rather than open paren
Richard M. Stallman <rms@gnu.org>
parents:
8019
diff
changeset
|
53 ((eq (char-syntax (following-char)) ?\() |
fcf805b27bc5
(show-paren-command-hook): Handle close paren rather than open paren
Richard M. Stallman <rms@gnu.org>
parents:
8019
diff
changeset
|
54 (setq dir 1))) |
4123
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
55 (if dir |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
56 (save-excursion |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
57 (save-restriction |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
58 ;; Determine the range within which to look for a match. |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
59 (if blink-matching-paren-distance |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
60 (narrow-to-region (max (point-min) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
61 (- (point) blink-matching-paren-distance)) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
62 (min (point-max) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
63 (+ (point) blink-matching-paren-distance)))) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
64 ;; Scan across one sexp within that range. |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
65 (condition-case () |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
66 (setq pos (scan-sexps (point) dir)) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
67 (error nil)) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
68 ;; See if the "matching" paren is the right kind of paren |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
69 ;; to match the one we started at. |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
70 (if pos |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
71 (let ((beg (min pos oldpos)) (end (max pos oldpos))) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
72 (and (/= (char-syntax (char-after beg)) ?\$) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
73 (setq mismatch |
8510
8903669537b0
(show-paren-command-hook): Cope if matching-paren gives nil.
Richard M. Stallman <rms@gnu.org>
parents:
8050
diff
changeset
|
74 (not (eq (char-after (1- end)) |
8903669537b0
(show-paren-command-hook): Cope if matching-paren gives nil.
Richard M. Stallman <rms@gnu.org>
parents:
8050
diff
changeset
|
75 ;; This can give nil. |
8903669537b0
(show-paren-command-hook): Cope if matching-paren gives nil.
Richard M. Stallman <rms@gnu.org>
parents:
8050
diff
changeset
|
76 (matching-paren (char-after beg)))))))) |
4123
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
77 ;; If they don't properly match, use a different face, |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
78 ;; or print a message. |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
79 (if mismatch |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
80 (progn |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
81 (and (null show-paren-mismatch-face) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
82 (x-display-color-p) |
7657
5d806a0a50bc
(show-paren-command-hook):
Richard M. Stallman <rms@gnu.org>
parents:
5623
diff
changeset
|
83 (or (internal-find-face 'paren-mismatch) |
4123
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
84 (progn |
4565
a97d23c71c95
(show-paren-command-hook): Don't use value of make-face.
Richard M. Stallman <rms@gnu.org>
parents:
4442
diff
changeset
|
85 (make-face 'paren-mismatch) |
4183
a5f0a739d87d
(show-paren-face): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4123
diff
changeset
|
86 (set-face-background 'paren-mismatch |
8019
cbab396695ab
(show-paren-command-hook): Set paren foreground to white.
Richard M. Stallman <rms@gnu.org>
parents:
7657
diff
changeset
|
87 "purple") |
cbab396695ab
(show-paren-command-hook): Set paren foreground to white.
Richard M. Stallman <rms@gnu.org>
parents:
7657
diff
changeset
|
88 (set-face-foreground 'paren-mismatch |
cbab396695ab
(show-paren-command-hook): Set paren foreground to white.
Richard M. Stallman <rms@gnu.org>
parents:
7657
diff
changeset
|
89 "white"))) |
7657
5d806a0a50bc
(show-paren-command-hook):
Richard M. Stallman <rms@gnu.org>
parents:
5623
diff
changeset
|
90 (setq show-paren-mismatch-face 'paren-mismatch)) |
4123
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
91 (if show-paren-mismatch-face |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
92 (setq face show-paren-mismatch-face) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
93 (message "Paren mismatch")))) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
94 ))) |
4059
66d33e1bf65b
(show-paren-command-hook): Do nothing if not window-system.
Richard M. Stallman <rms@gnu.org>
parents:
3977
diff
changeset
|
95 (cond (pos |
4123
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
96 (if (= dir -1) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
97 ;; If matching backwards, highlight the closeparen |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
98 ;; before point as well as its matching open. |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
99 (progn |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
100 (if show-paren-overlay-1 |
4353
d4e116f25030
(show-paren-command-hook): Specify buffer for move-overay.
Richard M. Stallman <rms@gnu.org>
parents:
4183
diff
changeset
|
101 (move-overlay show-paren-overlay-1 |
d4e116f25030
(show-paren-command-hook): Specify buffer for move-overay.
Richard M. Stallman <rms@gnu.org>
parents:
4183
diff
changeset
|
102 (+ (point) dir) (point) |
d4e116f25030
(show-paren-command-hook): Specify buffer for move-overay.
Richard M. Stallman <rms@gnu.org>
parents:
4183
diff
changeset
|
103 (current-buffer)) |
4123
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
104 (setq show-paren-overlay-1 |
8558
30f91aa9b364
(show-paren-command-hook): Set the face of an overlay
Richard M. Stallman <rms@gnu.org>
parents:
8510
diff
changeset
|
105 (make-overlay (- pos dir) pos))) |
30f91aa9b364
(show-paren-command-hook): Set the face of an overlay
Richard M. Stallman <rms@gnu.org>
parents:
8510
diff
changeset
|
106 ;; Always set the overlay face, since it varies. |
30f91aa9b364
(show-paren-command-hook): Set the face of an overlay
Richard M. Stallman <rms@gnu.org>
parents:
8510
diff
changeset
|
107 (overlay-put show-paren-overlay-1 'face face)) |
4123
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
108 ;; Otherwise, turn off any such highlighting. |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
109 (and show-paren-overlay-1 |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
110 (overlay-buffer show-paren-overlay-1) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
111 (delete-overlay show-paren-overlay-1))) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
112 ;; Turn on highlighting for the matching paren. |
4059
66d33e1bf65b
(show-paren-command-hook): Do nothing if not window-system.
Richard M. Stallman <rms@gnu.org>
parents:
3977
diff
changeset
|
113 (if show-paren-overlay |
4353
d4e116f25030
(show-paren-command-hook): Specify buffer for move-overay.
Richard M. Stallman <rms@gnu.org>
parents:
4183
diff
changeset
|
114 (move-overlay show-paren-overlay (- pos dir) pos |
d4e116f25030
(show-paren-command-hook): Specify buffer for move-overay.
Richard M. Stallman <rms@gnu.org>
parents:
4183
diff
changeset
|
115 (current-buffer)) |
4059
66d33e1bf65b
(show-paren-command-hook): Do nothing if not window-system.
Richard M. Stallman <rms@gnu.org>
parents:
3977
diff
changeset
|
116 (setq show-paren-overlay |
8558
30f91aa9b364
(show-paren-command-hook): Set the face of an overlay
Richard M. Stallman <rms@gnu.org>
parents:
8510
diff
changeset
|
117 (make-overlay (- pos dir) pos))) |
30f91aa9b364
(show-paren-command-hook): Set the face of an overlay
Richard M. Stallman <rms@gnu.org>
parents:
8510
diff
changeset
|
118 ;; Always set the overlay face, since it varies. |
30f91aa9b364
(show-paren-command-hook): Set the face of an overlay
Richard M. Stallman <rms@gnu.org>
parents:
8510
diff
changeset
|
119 (overlay-put show-paren-overlay 'face face)) |
4059
66d33e1bf65b
(show-paren-command-hook): Do nothing if not window-system.
Richard M. Stallman <rms@gnu.org>
parents:
3977
diff
changeset
|
120 (t |
4123
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
121 ;; If not at a paren that has a match, |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
122 ;; turn off any previous paren highlighting. |
4059
66d33e1bf65b
(show-paren-command-hook): Do nothing if not window-system.
Richard M. Stallman <rms@gnu.org>
parents:
3977
diff
changeset
|
123 (and show-paren-overlay (overlay-buffer show-paren-overlay) |
4123
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
124 (delete-overlay show-paren-overlay)) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
125 (and show-paren-overlay-1 (overlay-buffer show-paren-overlay-1) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
126 (delete-overlay show-paren-overlay-1))))))) |
3912 | 127 |
4123
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
128 (if window-system |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
129 (progn |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
130 (setq blink-paren-function nil) |
b05c50e08993
Enable the hook only if window-system.
Richard M. Stallman <rms@gnu.org>
parents:
4059
diff
changeset
|
131 (add-hook 'post-command-hook 'show-paren-command-hook))) |
4442
cb81eadd0df5
(window-setup-hook): Add hook function.
Richard M. Stallman <rms@gnu.org>
parents:
4353
diff
changeset
|
132 ;;; This is in case paren.el is preloaded. |
cb81eadd0df5
(window-setup-hook): Add hook function.
Richard M. Stallman <rms@gnu.org>
parents:
4353
diff
changeset
|
133 (add-hook 'window-setup-hook |
cb81eadd0df5
(window-setup-hook): Add hook function.
Richard M. Stallman <rms@gnu.org>
parents:
4353
diff
changeset
|
134 (function (lambda () |
cb81eadd0df5
(window-setup-hook): Add hook function.
Richard M. Stallman <rms@gnu.org>
parents:
4353
diff
changeset
|
135 (if window-system |
cb81eadd0df5
(window-setup-hook): Add hook function.
Richard M. Stallman <rms@gnu.org>
parents:
4353
diff
changeset
|
136 (progn |
cb81eadd0df5
(window-setup-hook): Add hook function.
Richard M. Stallman <rms@gnu.org>
parents:
4353
diff
changeset
|
137 (setq blink-paren-function nil) |
cb81eadd0df5
(window-setup-hook): Add hook function.
Richard M. Stallman <rms@gnu.org>
parents:
4353
diff
changeset
|
138 (add-hook 'post-command-hook |
cb81eadd0df5
(window-setup-hook): Add hook function.
Richard M. Stallman <rms@gnu.org>
parents:
4353
diff
changeset
|
139 'show-paren-command-hook)))))) |
3919 | 140 (provide 'paren) |
141 | |
142 ;;; paren.el ends here |