Mercurial > emacs
annotate lisp/progmodes/hideif.el @ 110410:f2e111723c3a
Merge changes made in Gnus trunk.
Reimplement nnimap, and do tweaks to the rest of the code to support that.
* gnus-int.el (gnus-finish-retrieve-group-infos)
(gnus-retrieve-group-data-early): New functions.
* gnus-range.el (gnus-range-nconcat): New function.
* gnus-start.el (gnus-get-unread-articles): Support early retrieval of
data.
(gnus-read-active-for-groups): Support finishing the early retrieval of
data.
* gnus-sum.el (gnus-summary-move-article): Pass the move-to group name
if the move is internal, so that nnimap can do fast internal moves.
* gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for
nnimap usage.
* nnimap.el: Rewritten.
* nnmail.el (nnmail-inhibit-default-split-group): New internal variable
to allow the mail splitting to not return a default group. This is
useful for nnimap, which will leave unmatched mail in the inbox.
* utf7.el (utf7-encode): Autoload.
Implement shell connection.
* nnimap.el (nnimap-open-shell-stream): New function.
(nnimap-open-connection): Use it.
Get the number of lines by using BODYSTRUCTURE.
(nnimap-transform-headers): Get the number of lines in each message.
(nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the
number of lines.
Not all servers return UIDNEXT. Work past this problem.
Remove junk from end of file.
Fix typo in "bogus" section.
Make capabilties be case-insensitive.
Require cl when compiling.
Don't bug out if the LIST command doesn't have any parameters.
2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change)
* nnimap.el (nnimap-get-groups): Don't bug out if the LIST command
doesn't have any parameters.
(mm-text-html-renderer): Document gnus-article-html.
2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix)
* mm-decode.el (mm-text-html-renderer): Document gnus-article-html.
* dgnushack.el: Define netrc-credentials.
If the user doesn't have a /etc/services, supply some sensible port defaults.
Have `unseen-or-unread' select an unread unseen article first.
(nntp-open-server): Return whether the open was successful or not.
Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ).
Save result so that it doesn't say "failed" all the time.
Add ~/.authinfo to the default, since that's probably most useful for users.
Don't use the "finish" method when we're reading from the agent.
Add some more nnimap-relevant agent stuff to nnagent.el.
* nnimap.el (nnimap-with-process-buffer): Removed.
Revert one line that was changed by mistake in the last checkin.
(nnimap-open-connection): Don't error out when we can't make a connection
nnimap-related changes to avoid bugging out if we can't contact a server.
* gnus-start.el (gnus-get-unread-articles): Don't try to scan groups
from methods that are denied.
* nnimap.el (nnimap-possibly-change-group): Return nil if we can't log
in.
(nnimap-finish-retrieve-group-infos): Make sure we're not waiting for
nothing.
* gnus-sum.el (gnus-select-newsgroup): Indent.
author | Katsumi Yamaoka <yamaoka@jpl.org> |
---|---|
date | Sat, 18 Sep 2010 10:02:19 +0000 |
parents | 1d1d5d9bd884 |
children | 249a1455856a 376148b31b5e |
rev | line source |
---|---|
38412
253f761ad37b
Some fixes to follow coding conventions in files maintained by FSF.
Pavel Janík <Pavel@Janik.cz>
parents:
30805
diff
changeset
|
1 ;;; hideif.el --- hides selected code within ifdef |
793
6fb68a1460a6
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
660
diff
changeset
|
2 |
87873
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
3 ;; Copyright (C) 1988, 1994, 2001, 2002, 2003, 2004, 2005, 2006, 2007, |
106815 | 4 ;; 2008, 2009, 2010 Free Software Foundation, Inc. |
846
20674ae6bf52
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
811
diff
changeset
|
5 |
101104
43975095e687
Comment (add Marick as co-author, based on ack.texi and authors.el and
Glenn Morris <rgm@gnu.org>
parents:
100908
diff
changeset
|
6 ;; Author: Brian Marick |
43975095e687
Comment (add Marick as co-author, based on ack.texi and authors.el and
Glenn Morris <rgm@gnu.org>
parents:
100908
diff
changeset
|
7 ;; Daniel LaLiberte <liberte@holonexus.org> |
7324
7e78d145539b
(show-ifdefs, hide-ifdefs): Bind inhibit-read-only.
Richard M. Stallman <rms@gnu.org>
parents:
5560
diff
changeset
|
8 ;; Maintainer: FSF |
11455 | 9 ;; Keywords: c, outlines |
793
6fb68a1460a6
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
660
diff
changeset
|
10 |
895
81e6b85a9261
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
11 ;; This file is part of GNU Emacs. |
81e6b85a9261
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
12 |
94673
52b7a8c22af5
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94206
diff
changeset
|
13 ;; GNU Emacs is free software: you can redistribute it and/or modify |
895
81e6b85a9261
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
14 ;; it under the terms of the GNU General Public License as published by |
94673
52b7a8c22af5
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94206
diff
changeset
|
15 ;; the Free Software Foundation, either version 3 of the License, or |
52b7a8c22af5
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94206
diff
changeset
|
16 ;; (at your option) any later version. |
895
81e6b85a9261
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
17 |
81e6b85a9261
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
18 ;; GNU Emacs is distributed in the hope that it will be useful, |
81e6b85a9261
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
81e6b85a9261
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
81e6b85a9261
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
21 ;; GNU General Public License for more details. |
81e6b85a9261
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
22 |
81e6b85a9261
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
23 ;; You should have received a copy of the GNU General Public License |
94673
52b7a8c22af5
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94206
diff
changeset
|
24 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
895
81e6b85a9261
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
25 |
793
6fb68a1460a6
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
660
diff
changeset
|
26 ;;; Commentary: |
6fb68a1460a6
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
660
diff
changeset
|
27 |
14169 | 28 ;; To initialize, toggle the hide-ifdef minor mode with |
29 ;; | |
30 ;; M-x hide-ifdef-mode | |
31 ;; | |
32 ;; This will set up key bindings and call hide-ifdef-mode-hook if it | |
33 ;; has a value. To explicitly hide ifdefs using a buffer-local | |
34 ;; define list (default empty), type | |
35 ;; | |
36 ;; M-x hide-ifdefs or C-c @ h | |
37 ;; | |
38 ;; Hide-ifdef suppresses the display of code that the preprocessor wouldn't | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
39 ;; pass through. The support of constant expressions in #if lines is |
14169 | 40 ;; limited to identifiers, parens, and the operators: &&, ||, !, and |
41 ;; "defined". Please extend this. | |
42 ;; | |
43 ;; The hidden code is marked by ellipses (...). Be | |
44 ;; cautious when editing near ellipses, since the hidden text is | |
45 ;; still in the buffer, and you can move the point into it and modify | |
41619 | 46 ;; text unawares. |
14169 | 47 ;; You can make your buffer read-only while hide-ifdef-hiding by setting |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
48 ;; hide-ifdef-read-only to a non-nil value. You can toggle this |
14169 | 49 ;; variable with hide-ifdef-toggle-read-only (C-c @ C-q). |
50 ;; | |
51 ;; You can undo the effect of hide-ifdefs by typing | |
52 ;; | |
53 ;; M-x show-ifdefs or C-c @ s | |
54 ;; | |
55 ;; Use M-x hide-ifdef-define (C-c @ d) to define a symbol. | |
56 ;; Use M-x hide-ifdef-undef (C-c @ u) to undefine a symbol. | |
57 ;; | |
58 ;; If you define or undefine a symbol while hide-ifdef-mode is in effect, | |
59 ;; the display will be updated. Only the define list for the current | |
60 ;; buffer will be affected. You can save changes to the local define | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
61 ;; list with hide-ifdef-set-define-alist. This adds entries |
14169 | 62 ;; to hide-ifdef-define-alist. |
63 ;; | |
64 ;; If you have defined a hide-ifdef-mode-hook, you can set | |
65 ;; up a list of symbols that may be used by hide-ifdefs as in the | |
66 ;; following example: | |
67 ;; | |
41619 | 68 ;; (add-hook 'hide-ifdef-mode-hook |
29588
0cf06902af64
(hif-compress-define-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
26519
diff
changeset
|
69 ;; (lambda () |
41619 | 70 ;; (unless hide-ifdef-define-alist |
71 ;; (setq hide-ifdef-define-alist | |
72 ;; '((list1 ONE TWO) | |
73 ;; (list2 TWO THREE)))) | |
74 ;; (hide-ifdef-use-define-alist 'list2))) ; use list2 by default | |
14169 | 75 ;; |
30327
09b01c9914a6
Correct author's email address. Fix typo in comment.
Gerd Moellmann <gerd@gnu.org>
parents:
29588
diff
changeset
|
76 ;; You can call hide-ifdef-use-define-alist (C-c @ U) at any time to specify |
14169 | 77 ;; another list to use. |
78 ;; | |
79 ;; To cause ifdefs to be hidden as soon as hide-ifdef-mode is called, | |
80 ;; set hide-ifdef-initially to non-nil. | |
81 ;; | |
82 ;; If you set hide-ifdef-lines to t, hide-ifdefs hides all the #ifdef lines. | |
83 ;; In the absence of highlighting, that might be a bad idea. If you set | |
84 ;; hide-ifdef-lines to nil (the default), the surrounding preprocessor | |
85 ;; lines will be displayed. That can be confusing in its own | |
86 ;; right. Other variations on display are possible, but not much | |
87 ;; better. | |
88 ;; | |
89 ;; You can explicitly hide or show individual ifdef blocks irrespective | |
90 ;; of the define list by using hide-ifdef-block and show-ifdef-block. | |
91 ;; | |
92 ;; You can move the point between ifdefs with forward-ifdef, backward-ifdef, | |
93 ;; up-ifdef, down-ifdef, next-ifdef, and previous-ifdef. | |
94 ;; | |
95 ;; If you have minor-mode-alist in your mode line (the default) two labels | |
96 ;; may appear. "Ifdef" will appear when hide-ifdef-mode is active. "Hiding" | |
97 ;; will appear when text may be hidden ("hide-ifdef-hiding" is non-nil). | |
98 ;; | |
99 ;; Written by Brian Marick, at Gould, Computer Systems Division, Urbana IL. | |
100 ;; Extensively modified by Daniel LaLiberte (while at Gould). | |
31 | 101 |
793
6fb68a1460a6
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
660
diff
changeset
|
102 ;;; Code: |
31 | 103 |
13297
9699410bf8bf
Provide hideif; require cc-mode.
Richard M. Stallman <rms@gnu.org>
parents:
12954
diff
changeset
|
104 (require 'cc-mode) |
9699410bf8bf
Provide hideif; require cc-mode.
Richard M. Stallman <rms@gnu.org>
parents:
12954
diff
changeset
|
105 |
20781 | 106 (defgroup hide-ifdef nil |
107 "Hide selected code within `ifdef'." | |
108 :group 'c) | |
109 | |
87873
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
110 (defcustom hide-ifdef-initially nil |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
111 "Non-nil means call `hide-ifdefs' when Hide-Ifdef mode is first activated." |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
112 :type 'boolean |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
113 :group 'hide-ifdef) |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
114 |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
115 (defcustom hide-ifdef-read-only nil |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
116 "Set to non-nil if you want buffer to be read-only while hiding text." |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
117 :type 'boolean |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
118 :group 'hide-ifdef) |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
119 |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
120 (defcustom hide-ifdef-lines nil |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
121 "Non-nil means hide the #ifX, #else, and #endif lines." |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
122 :type 'boolean |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
123 :group 'hide-ifdef) |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
124 |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
125 (defcustom hide-ifdef-shadow nil |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
126 "Non-nil means shadow text instead of hiding it." |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
127 :type 'boolean |
87916
0ed1c2a3adc0
(hide-ifdef-shadow): Add version number for defcustom.
Martin Rudalics <rudalics@gmx.at>
parents:
87895
diff
changeset
|
128 :group 'hide-ifdef |
0ed1c2a3adc0
(hide-ifdef-shadow): Add version number for defcustom.
Martin Rudalics <rudalics@gmx.at>
parents:
87895
diff
changeset
|
129 :version "23.1") |
87873
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
130 |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
131 (defface hide-ifdef-shadow '((t (:inherit shadow))) |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
132 "Face for shadowing ifdef blocks." |
87916
0ed1c2a3adc0
(hide-ifdef-shadow): Add version number for defcustom.
Martin Rudalics <rudalics@gmx.at>
parents:
87895
diff
changeset
|
133 :group 'hide-ifdef |
0ed1c2a3adc0
(hide-ifdef-shadow): Add version number for defcustom.
Martin Rudalics <rudalics@gmx.at>
parents:
87895
diff
changeset
|
134 :version "23.1") |
87873
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
135 |
adc70c059607
Move defcustoms and defface to start of file.
Glenn Morris <rgm@gnu.org>
parents:
87851
diff
changeset
|
136 |
41619 | 137 (defvar hide-ifdef-mode-submap |
138 ;; Set up the submap that goes after the prefix key. | |
139 (let ((map (make-sparse-keymap))) | |
140 (define-key map "d" 'hide-ifdef-define) | |
141 (define-key map "u" 'hide-ifdef-undef) | |
142 (define-key map "D" 'hide-ifdef-set-define-alist) | |
143 (define-key map "U" 'hide-ifdef-use-define-alist) | |
7324
7e78d145539b
(show-ifdefs, hide-ifdefs): Bind inhibit-read-only.
Richard M. Stallman <rms@gnu.org>
parents:
5560
diff
changeset
|
144 |
41619 | 145 (define-key map "h" 'hide-ifdefs) |
146 (define-key map "s" 'show-ifdefs) | |
147 (define-key map "\C-d" 'hide-ifdef-block) | |
148 (define-key map "\C-s" 'show-ifdef-block) | |
149 | |
150 (define-key map "\C-q" 'hide-ifdef-toggle-read-only) | |
87851
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
151 (define-key map "\C-w" 'hide-ifdef-toggle-shadowing) |
41619 | 152 (substitute-key-definition |
153 'toggle-read-only 'hide-ifdef-toggle-outside-read-only map) | |
154 map) | |
155 "Keymap used by `hide-ifdef-mode' under `hide-ifdef-mode-prefix-key'.") | |
31 | 156 |
11652
1162093d885c
(hide-ifdef-mode-prefix-key): Change to C-c @.
Richard M. Stallman <rms@gnu.org>
parents:
11581
diff
changeset
|
157 (defconst hide-ifdef-mode-prefix-key "\C-c@" |
210 | 158 "Prefix key for all Hide-Ifdef mode commands.") |
31 | 159 |
41619 | 160 (defvar hide-ifdef-mode-map |
161 ;; Set up the mode's main map, which leads via the prefix key to the submap. | |
162 (let ((map (make-sparse-keymap))) | |
163 (define-key map hide-ifdef-mode-prefix-key hide-ifdef-mode-submap) | |
164 map) | |
165 "Keymap used with `hide-ifdef-mode'.") | |
31 | 166 |
79699
1ad384d8d37a
(hide-ifdef-mode-menu): Put hide-ifdef commands
Nick Roberts <nickrob@snap.net.nz>
parents:
78234
diff
changeset
|
167 (easy-menu-define hide-ifdef-mode-menu hide-ifdef-mode-map |
1ad384d8d37a
(hide-ifdef-mode-menu): Put hide-ifdef commands
Nick Roberts <nickrob@snap.net.nz>
parents:
78234
diff
changeset
|
168 "Menu for `hide-ifdef-mode'." |
1ad384d8d37a
(hide-ifdef-mode-menu): Put hide-ifdef commands
Nick Roberts <nickrob@snap.net.nz>
parents:
78234
diff
changeset
|
169 '("Hide-Ifdef" |
94206
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
170 ["Hide some ifdefs" hide-ifdefs |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
171 :help "Hide the contents of some #ifdefs"] |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
172 ["Show all ifdefs" show-ifdefs |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
173 :help "Cancel the effects of `hide-ifdef': show the contents of all #ifdefs"] |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
174 ["Hide ifdef block" hide-ifdef-block |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
175 :help "Hide the ifdef block (true or false part) enclosing or before the cursor"] |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
176 ["Show ifdef block" show-ifdef-block |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
177 :help "Show the ifdef block (true or false part) enclosing or before the cursor"] |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
178 ["Define a variable..." hide-ifdef-define |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
179 :help "Define a VAR so that #ifdef VAR would be included"] |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
180 ["Undefine a variable..." hide-ifdef-undef |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
181 :help "Undefine a VAR so that #ifdef VAR would not be included"] |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
182 ["Define an alist..." hide-ifdef-set-define-alist |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
183 :help "Set the association for NAME to `hide-ifdef-env'"] |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
184 ["Use an alist..." hide-ifdef-use-define-alist |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
185 :help "Set `hide-ifdef-env' to the define list specified by NAME"] |
79699
1ad384d8d37a
(hide-ifdef-mode-menu): Put hide-ifdef commands
Nick Roberts <nickrob@snap.net.nz>
parents:
78234
diff
changeset
|
186 ["Toggle read only" hide-ifdef-toggle-read-only |
94206
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
187 :style toggle :selected hide-ifdef-read-only |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
188 :help "Buffer should be read-only while hiding text"] |
87851
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
189 ["Toggle shadowing" hide-ifdef-toggle-shadowing |
94206
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
190 :style toggle :selected hide-ifdef-shadow |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
191 :help "Text should be shadowed instead of hidden"])) |
79699
1ad384d8d37a
(hide-ifdef-mode-menu): Put hide-ifdef commands
Nick Roberts <nickrob@snap.net.nz>
parents:
78234
diff
changeset
|
192 |
31 | 193 (defvar hide-ifdef-hiding nil |
7324
7e78d145539b
(show-ifdefs, hide-ifdefs): Bind inhibit-read-only.
Richard M. Stallman <rms@gnu.org>
parents:
5560
diff
changeset
|
194 "Non-nil when text may be hidden.") |
7e78d145539b
(show-ifdefs, hide-ifdefs): Bind inhibit-read-only.
Richard M. Stallman <rms@gnu.org>
parents:
5560
diff
changeset
|
195 |
31 | 196 (or (assq 'hide-ifdef-hiding minor-mode-alist) |
197 (setq minor-mode-alist | |
198 (cons '(hide-ifdef-hiding " Hiding") | |
199 minor-mode-alist))) | |
200 | |
7379
822429149720
(hide-ifdef-syntax-table): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
7324
diff
changeset
|
201 ;; fix c-mode syntax table so we can recognize whole symbols. |
822429149720
(hide-ifdef-syntax-table): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
7324
diff
changeset
|
202 (defvar hide-ifdef-syntax-table |
41619 | 203 (let ((st (copy-syntax-table c-mode-syntax-table))) |
204 (modify-syntax-entry ?_ "w" st) | |
205 (modify-syntax-entry ?& "." st) | |
206 (modify-syntax-entry ?\| "." st) | |
207 st) | |
7379
822429149720
(hide-ifdef-syntax-table): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
7324
diff
changeset
|
208 "Syntax table used for tokenizing #if expressions.") |
822429149720
(hide-ifdef-syntax-table): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
7324
diff
changeset
|
209 |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
210 (defvar hide-ifdef-env nil |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
211 "An alist of defined symbols and their values.") |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
212 |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
213 (defvar hif-outside-read-only nil |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
214 "Internal variable. Saves the value of `buffer-read-only' while hiding.") |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
215 |
998 | 216 ;;;###autoload |
41619 | 217 (define-minor-mode hide-ifdef-mode |
210 | 218 "Toggle Hide-Ifdef mode. This is a minor mode, albeit a large one. |
15166
83258eb2ede5
(hide-ifdef-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
219 With ARG, turn Hide-Ifdef mode on if arg is positive, off otherwise. |
210 | 220 In Hide-Ifdef mode, code within #ifdef constructs that the C preprocessor |
31 | 221 would eliminate may be hidden from view. Several variables affect |
222 how the hiding is done: | |
223 | |
41619 | 224 `hide-ifdef-env' |
31 | 225 An association list of defined and undefined symbols for the |
210 | 226 current buffer. Initially, the global value of `hide-ifdef-env' |
227 is used. | |
31 | 228 |
41619 | 229 `hide-ifdef-define-alist' |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
230 An association list of defined symbol lists. |
210 | 231 Use `hide-ifdef-set-define-alist' to save the current `hide-ifdef-env' |
232 and `hide-ifdef-use-define-alist' to set the current `hide-ifdef-env' | |
233 from one of the lists in `hide-ifdef-define-alist'. | |
31 | 234 |
41619 | 235 `hide-ifdef-lines' |
31 | 236 Set to non-nil to not show #if, #ifdef, #ifndef, #else, and |
237 #endif lines when hiding. | |
238 | |
41619 | 239 `hide-ifdef-initially' |
210 | 240 Indicates whether `hide-ifdefs' should be called when Hide-Ifdef mode |
31 | 241 is activated. |
242 | |
41619 | 243 `hide-ifdef-read-only' |
31 | 244 Set to non-nil if you want to make buffers read only while hiding. |
210 | 245 After `show-ifdefs', read-only status is restored to previous value. |
31 | 246 |
247 \\{hide-ifdef-mode-map}" | |
61286
e85dd7fe4004
(hide-ifdef-mode): Specify :group.
Lute Kamstra <lute@gnu.org>
parents:
60213
diff
changeset
|
248 :group 'hide-ifdef :lighter " Ifdef" |
31 | 249 (if hide-ifdef-mode |
250 (progn | |
41619 | 251 ;; inherit global values |
252 (set (make-local-variable 'hide-ifdef-env) | |
253 (default-value 'hide-ifdef-env)) | |
254 (set (make-local-variable 'hide-ifdef-hiding) | |
255 (default-value 'hide-ifdef-hiding)) | |
256 (set (make-local-variable 'hif-outside-read-only) buffer-read-only) | |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
257 (set (make-local-variable 'line-move-ignore-invisible) t) |
41712
c2b7b74ef973
(hide-ifdef-mode): Only modify
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41645
diff
changeset
|
258 (add-hook 'change-major-mode-hook |
c2b7b74ef973
(hide-ifdef-mode): Only modify
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41645
diff
changeset
|
259 (lambda () (hide-ifdef-mode -1)) nil t) |
31 | 260 |
41619 | 261 (add-to-invisibility-spec '(hide-ifdef . t)) |
31 | 262 |
263 (if hide-ifdef-initially | |
264 (hide-ifdefs) | |
41619 | 265 (show-ifdefs))) |
266 ;; else end hide-ifdef-mode | |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
267 (kill-local-variable 'line-move-ignore-invisible) |
41712
c2b7b74ef973
(hide-ifdef-mode): Only modify
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41645
diff
changeset
|
268 (remove-from-invisibility-spec '(hide-ifdef . t)) |
94206
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
269 (when hide-ifdef-hiding |
10db3330138c
* progmodes/asm-mode.el (asm-mode-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
94036
diff
changeset
|
270 (show-ifdefs)))) |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
271 |
31 | 272 |
273 (defun hif-show-all () | |
274 "Show all of the text in the current buffer." | |
275 (interactive) | |
41619 | 276 (hif-show-ifdef-region (point-min) (point-max))) |
31 | 277 |
13855 | 278 ;; By putting this on after-revert-hook, we arrange that it only |
279 ;; does anything when revert-buffer avoids turning off the mode. | |
280 ;; (That can happen in VC.) | |
41619 | 281 (defun hif-after-revert-function () |
13855 | 282 (and hide-ifdef-mode hide-ifdef-hiding |
283 (hide-ifdefs t))) | |
41619 | 284 (add-hook 'after-revert-hook 'hif-after-revert-function) |
13855 | 285 |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
286 (defun hif-end-of-line () |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
287 (end-of-line) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
288 (while (= (logand 1 (skip-chars-backward "\\\\")) 1) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
289 (end-of-line 2))) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
290 |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
291 (defun hide-ifdef-region-internal (start end) |
87851
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
292 (remove-overlays start end 'hide-ifdef t) |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
293 (let ((o (make-overlay start end))) |
87851
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
294 (overlay-put o 'hide-ifdef t) |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
295 (if hide-ifdef-shadow |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
296 (overlay-put o 'face 'hide-ifdef-shadow) |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
297 (overlay-put o 'invisible 'hide-ifdef)))) |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
298 |
31 | 299 (defun hide-ifdef-region (start end) |
300 "START is the start of a #if or #else form. END is the ending part. | |
301 Everything including these lines is made invisible." | |
41619 | 302 (save-excursion |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
303 (goto-char start) (hif-end-of-line) (setq start (point)) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
304 (goto-char end) (hif-end-of-line) (setq end (point)) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
305 (hide-ifdef-region-internal start end))) |
31 | 306 |
307 (defun hif-show-ifdef-region (start end) | |
308 "Everything between START and END is made visible." | |
87851
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
309 (remove-overlays start end 'hide-ifdef t)) |
31 | 310 |
311 | |
41619 | 312 ;;===%%SF%% evaluation (Start) === |
31 | 313 |
13855 | 314 ;; It is not useful to set this to anything but `eval'. |
315 ;; In fact, the variable might as well be eliminated. | |
31 | 316 (defvar hide-ifdef-evaluator 'eval |
13855 | 317 "The function to use to evaluate a form. |
318 The evaluator is given a canonical form and returns t if text under | |
31 | 319 that form should be displayed.") |
320 | |
321 (defvar hif-undefined-symbol nil | |
322 "...is by default considered to be false.") | |
323 | |
324 | |
325 (defun hif-set-var (var value) | |
326 "Prepend (var value) pair to hide-ifdef-env." | |
327 (setq hide-ifdef-env (cons (cons var value) hide-ifdef-env))) | |
328 | |
329 | |
330 (defun hif-lookup (var) | |
41619 | 331 ;; (message "hif-lookup %s" var) |
31 | 332 (let ((val (assoc var hide-ifdef-env))) |
333 (if val | |
334 (cdr val) | |
335 hif-undefined-symbol))) | |
336 | |
337 (defun hif-defined (var) | |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
338 (if (assoc var hide-ifdef-env) 1 0)) |
31 | 339 |
41619 | 340 ;;===%%SF%% evaluation (End) === |
31 | 341 |
342 | |
343 | |
41619 | 344 ;;===%%SF%% parsing (Start) === |
31 | 345 ;;; The code that understands what ifs and ifdef in files look like. |
346 | |
347 (defconst hif-cpp-prefix "\\(^\\|\r\\)[ \t]*#[ \t]*") | |
348 (defconst hif-ifndef-regexp (concat hif-cpp-prefix "ifndef")) | |
349 (defconst hif-ifx-regexp (concat hif-cpp-prefix "if\\(n?def\\)?[ \t]+")) | |
350 (defconst hif-else-regexp (concat hif-cpp-prefix "else")) | |
351 (defconst hif-endif-regexp (concat hif-cpp-prefix "endif")) | |
352 (defconst hif-ifx-else-endif-regexp | |
353 (concat hif-ifx-regexp "\\|" hif-else-regexp "\\|" hif-endif-regexp)) | |
354 | |
41619 | 355 ;; Used to store the current token and the whole token list during parsing. |
356 ;; Only bound dynamically. | |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
357 (defvar hif-token) |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
358 (defvar hif-token-list) |
31 | 359 |
93681
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
360 (defconst hif-token-alist |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
361 '(("||" . or) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
362 ("&&" . and) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
363 ("|" . hif-logior) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
364 ("&" . hif-logand) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
365 ("==" . equal) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
366 ("!=" . hif-notequal) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
367 ("!" . not) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
368 ("(" . lparen) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
369 (")" . rparen) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
370 (">" . hif-greater) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
371 ("<" . hif-less) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
372 (">=" . hif-greater-equal) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
373 ("<=" . hif-less-equal) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
374 ("+" . hif-plus) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
375 ("-" . hif-minus) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
376 ("?" . hif-conditional) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
377 (":" . hif-colon))) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
378 |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
379 (defconst hif-token-regexp |
93681
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
380 (concat (regexp-opt (mapcar 'car hif-token-alist)) "\\|\\w+")) |
31 | 381 |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
382 (defun hif-tokenize (start end) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
383 "Separate string between START and END into a list of tokens." |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
384 (let ((token-list nil)) |
41619 | 385 (with-syntax-table hide-ifdef-syntax-table |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
386 (save-excursion |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
387 (goto-char start) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
388 (while (progn (forward-comment (point-max)) (< (point) end)) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
389 ;; (message "expr-start = %d" expr-start) (sit-for 1) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
390 (cond |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
391 ((looking-at "\\\\\n") |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
392 (forward-char 2)) |
31 | 393 |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
394 ((looking-at hif-token-regexp) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
395 (let ((token (buffer-substring (point) (match-end 0)))) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
396 (goto-char (match-end 0)) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
397 ;; (message "token: %s" token) (sit-for 1) |
93681
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
398 (push (or (cdr (assoc token hif-token-alist)) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
399 (if (string-equal token "defined") 'hif-defined) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
400 (if (string-match "\\`[0-9]*\\'" token) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
401 (string-to-number token)) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
402 (intern token)) |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
403 token-list))) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
404 (t (error "Bad #if expression: %s" (buffer-string))))))) |
7379
822429149720
(hide-ifdef-syntax-table): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
7324
diff
changeset
|
405 (nreverse token-list))) |
31 | 406 |
407 ;;;----------------------------------------------------------------- | |
408 ;;; Translate C preprocessor #if expressions using recursive descent. | |
409 ;;; This parser is limited to the operators &&, ||, !, and "defined". | |
8914 | 410 ;;; Added ==, !=, +, and -. Gary Oberbrunner, garyo@avs.com, 8/9/94 |
31 | 411 |
41753
bf8b35f0db41
(hif-nexttoken): Move to before first def.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41712
diff
changeset
|
412 (defsubst hif-nexttoken () |
bf8b35f0db41
(hif-nexttoken): Move to before first def.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41712
diff
changeset
|
413 "Pop the next token from token-list into the let variable \"hif-token\"." |
bf8b35f0db41
(hif-nexttoken): Move to before first def.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41712
diff
changeset
|
414 (setq hif-token (pop hif-token-list))) |
bf8b35f0db41
(hif-nexttoken): Move to before first def.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41712
diff
changeset
|
415 |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
416 (defun hif-parse-if-exp (hif-token-list) |
31 | 417 "Parse the TOKEN-LIST. Return translated list in prefix form." |
418 (hif-nexttoken) | |
419 (prog1 | |
420 (hif-expr) | |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
421 (if hif-token ; is there still a token? |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
422 (error "Error: unexpected token: %s" hif-token)))) |
31 | 423 |
424 (defun hif-expr () | |
13855 | 425 "Parse an expression as found in #if. |
43747
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
426 expr : or-expr | or-expr '?' expr ':' expr." |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
427 (let ((result (hif-or-expr)) |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
428 middle) |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
429 (while (eq hif-token 'hif-conditional) |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
430 (hif-nexttoken) |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
431 (setq middle (hif-expr)) |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
432 (if (eq hif-token 'hif-colon) |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
433 (progn |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
434 (hif-nexttoken) |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
435 (setq result (list 'hif-conditional result middle (hif-expr)))) |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
436 (error "Error: unexpected token: %s" hif-token))) |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
437 result)) |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
438 |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
439 (defun hif-or-expr () |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
440 "Parse n or-expr : and-expr | or-expr '||' and-expr." |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
441 (let ((result (hif-and-expr))) |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
442 (while (eq hif-token 'or) |
31 | 443 (hif-nexttoken) |
43747
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
444 (setq result (list 'hif-or result (hif-and-expr)))) |
210 | 445 result)) |
31 | 446 |
43747
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
447 (defun hif-and-expr () |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
448 "Parse an and-expr : eq-expr | and-expr '&&' eq-expr." |
8914 | 449 (let ((result (hif-eq-expr))) |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
450 (while (eq hif-token 'and) |
31 | 451 (hif-nexttoken) |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
452 (setq result (list 'hif-and result (hif-eq-expr)))) |
210 | 453 result)) |
31 | 454 |
8914 | 455 (defun hif-eq-expr () |
19528
8fc9b5fc7633
(hif-greater, hif-less, hif-greater-equal)
Richard M. Stallman <rms@gnu.org>
parents:
16182
diff
changeset
|
456 "Parse an eq-expr : math | eq-expr `=='|`!='|`<'|`>'|`>='|`<=' math." |
8914 | 457 (let ((result (hif-math)) |
458 (eq-token nil)) | |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
459 (while (memq hif-token '(equal hif-notequal hif-greater hif-less |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
460 hif-greater-equal hif-less-equal)) |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
461 (setq eq-token hif-token) |
8914 | 462 (hif-nexttoken) |
463 (setq result (list eq-token result (hif-math)))) | |
464 result)) | |
465 | |
466 (defun hif-math () | |
13855 | 467 "Parse an expression with + or - and simpler things. |
8914 | 468 math : factor | math '+|-' factor." |
469 (let ((result (hif-factor)) | |
470 (math-op nil)) | |
93681
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
471 (while (memq hif-token '(hif-plus hif-minus hif-logior hif-logand)) |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
472 (setq math-op hif-token) |
8914 | 473 (hif-nexttoken) |
474 (setq result (list math-op result (hif-factor)))) | |
475 result)) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
476 |
31 | 477 (defun hif-factor () |
13855 | 478 "Parse a factor: '!' factor | '(' expr ')' | 'defined(' id ')' | id." |
31 | 479 (cond |
26519 | 480 ((eq hif-token 'not) |
481 (hif-nexttoken) | |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
482 (list 'hif-not (hif-factor))) |
31 | 483 |
26519 | 484 ((eq hif-token 'lparen) |
485 (hif-nexttoken) | |
486 (let ((result (hif-expr))) | |
487 (if (not (eq hif-token 'rparen)) | |
488 (error "Bad token in parenthesized expression: %s" hif-token) | |
489 (hif-nexttoken) | |
490 result))) | |
31 | 491 |
26519 | 492 ((eq hif-token 'hif-defined) |
493 (hif-nexttoken) | |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
494 (let ((paren (when (eq hif-token 'lparen) (hif-nexttoken) t)) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
495 (ident hif-token)) |
26519 | 496 (if (memq hif-token '(or and not hif-defined lparen rparen)) |
497 (error "Error: unexpected token: %s" hif-token)) | |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
498 (when paren |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
499 (hif-nexttoken) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
500 (unless (eq hif-token 'rparen) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
501 (error "Error: expected \")\" after identifier"))) |
26519 | 502 (hif-nexttoken) |
41619 | 503 `(hif-defined (quote ,ident)))) |
31 | 504 |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
505 ((numberp hif-token) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
506 (prog1 hif-token (hif-nexttoken))) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
507 |
94036
d669760bc2f0
(hif-factor): Handle unary minus.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93681
diff
changeset
|
508 ;; Unary plus/minus. |
d669760bc2f0
(hif-factor): Handle unary minus.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93681
diff
changeset
|
509 ((memq hif-token '(hif-minus hif-plus)) |
d669760bc2f0
(hif-factor): Handle unary minus.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93681
diff
changeset
|
510 (list (prog1 hif-token (hif-nexttoken)) 0 (hif-factor))) |
d669760bc2f0
(hif-factor): Handle unary minus.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93681
diff
changeset
|
511 |
26519 | 512 (t ; identifier |
513 (let ((ident hif-token)) | |
514 (if (memq ident '(or and)) | |
515 (error "Error: missing identifier")) | |
516 (hif-nexttoken) | |
41619 | 517 `(hif-lookup (quote ,ident)))))) |
31 | 518 |
8914 | 519 (defun hif-mathify (val) |
520 "Treat VAL as a number: if it's t or nil, use 1 or 0." | |
41619 | 521 (cond ((eq val t) 1) |
522 ((null val) 0) | |
8914 | 523 (t val))) |
524 | |
43747
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
525 (defun hif-conditional (a b c) |
91939e9a62ec
Augment expression parser to handle conditional expressions.
Andreas Schwab <schwab@suse.de>
parents:
41753
diff
changeset
|
526 (if (not (zerop (hif-mathify a))) (hif-mathify b) (hif-mathify c))) |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
527 (defun hif-and (a b) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
528 (and (not (zerop (hif-mathify a))) (not (zerop (hif-mathify b))))) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
529 (defun hif-or (a b) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
530 (or (not (zerop (hif-mathify a))) (not (zerop (hif-mathify b))))) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
531 (defun hif-not (a) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
532 (zerop (hif-mathify a))) |
93681
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
533 |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
534 (defmacro hif-mathify-binop (fun) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
535 `(lambda (a b) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
536 ,(format "Like `%s' but treat t and nil as 1 and 0." fun) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
537 (,fun (hif-mathify a) (hif-mathify b)))) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
538 |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
539 (defalias 'hif-plus (hif-mathify-binop +)) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
540 (defalias 'hif-minus (hif-mathify-binop -)) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
541 (defalias 'hif-notequal (hif-mathify-binop /=)) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
542 (defalias 'hif-greater (hif-mathify-binop >)) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
543 (defalias 'hif-less (hif-mathify-binop <)) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
544 (defalias 'hif-greater-equal (hif-mathify-binop >=)) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
545 (defalias 'hif-less-equal (hif-mathify-binop <=)) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
546 (defalias 'hif-logior (hif-mathify-binop logior)) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
547 (defalias 'hif-logand (hif-mathify-binop logand)) |
c9b42189e94f
(hif-token-alist): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87923
diff
changeset
|
548 |
31 | 549 ;;;----------- end of parser ----------------------- |
550 | |
551 | |
552 (defun hif-canonicalize () | |
41619 | 553 "When at beginning of #ifX, return a Lisp expression for its condition." |
31 | 554 (save-excursion |
555 (let ((negate (looking-at hif-ifndef-regexp))) | |
556 (re-search-forward hif-ifx-regexp) | |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
557 (let* ((tokens (hif-tokenize (point) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
558 (progn (hif-end-of-line) (point)))) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
559 (expr (hif-parse-if-exp tokens))) |
41619 | 560 ;; (message "hif-canonicalized: %s" expr) |
31 | 561 (if negate |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
562 (list 'hif-not expr) |
31 | 563 expr))))) |
564 | |
565 | |
566 (defun hif-find-any-ifX () | |
13855 | 567 "Move to next #if..., or #ifndef, at point or after." |
41619 | 568 ;; (message "find ifX at %d" (point)) |
31 | 569 (prog1 |
570 (re-search-forward hif-ifx-regexp (point-max) t) | |
571 (beginning-of-line))) | |
572 | |
573 | |
574 (defun hif-find-next-relevant () | |
13855 | 575 "Move to next #if..., #else, or #endif, after the current line." |
41619 | 576 ;; (message "hif-find-next-relevant at %d" (point)) |
31 | 577 (end-of-line) |
41619 | 578 ;; avoid infinite recursion by only going to beginning of line if match found |
31 | 579 (if (re-search-forward hif-ifx-else-endif-regexp (point-max) t) |
210 | 580 (beginning-of-line))) |
31 | 581 |
582 (defun hif-find-previous-relevant () | |
13855 | 583 "Move to previous #if..., #else, or #endif, before the current line." |
41619 | 584 ;; (message "hif-find-previous-relevant at %d" (point)) |
31 | 585 (beginning-of-line) |
41619 | 586 ;; avoid infinite recursion by only going to beginning of line if match found |
31 | 587 (if (re-search-backward hif-ifx-else-endif-regexp (point-min) t) |
210 | 588 (beginning-of-line))) |
31 | 589 |
590 | |
591 (defun hif-looking-at-ifX () ;; Should eventually see #if | |
592 (looking-at hif-ifx-regexp)) | |
593 (defun hif-looking-at-endif () | |
594 (looking-at hif-endif-regexp)) | |
595 (defun hif-looking-at-else () | |
596 (looking-at hif-else-regexp)) | |
597 | |
598 | |
599 | |
600 (defun hif-ifdef-to-endif () | |
601 "If positioned at #ifX or #else form, skip to corresponding #endif." | |
41619 | 602 ;; (message "hif-ifdef-to-endif at %d" (point)) (sit-for 1) |
31 | 603 (hif-find-next-relevant) |
604 (cond ((hif-looking-at-ifX) | |
605 (hif-ifdef-to-endif) ; find endif of nested if | |
606 (hif-ifdef-to-endif)) ; find outer endif or else | |
607 ((hif-looking-at-else) | |
608 (hif-ifdef-to-endif)) ; find endif following else | |
609 ((hif-looking-at-endif) | |
610 'done) | |
611 (t | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3457
diff
changeset
|
612 (error "Mismatched #ifdef #endif pair")))) |
31 | 613 |
614 | |
615 (defun hif-endif-to-ifdef () | |
616 "If positioned at #endif form, skip backward to corresponding #ifX." | |
41619 | 617 ;; (message "hif-endif-to-ifdef at %d" (point)) |
31 | 618 (let ((start (point))) |
619 (hif-find-previous-relevant) | |
620 (if (= start (point)) | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3457
diff
changeset
|
621 (error "Mismatched #ifdef #endif pair"))) |
31 | 622 (cond ((hif-looking-at-endif) |
623 (hif-endif-to-ifdef) ; find beginning of nested if | |
624 (hif-endif-to-ifdef)) ; find beginning of outer if or else | |
625 ((hif-looking-at-else) | |
626 (hif-endif-to-ifdef)) | |
627 ((hif-looking-at-ifX) | |
628 'done) | |
922 | 629 (t))) ; never gets here |
31 | 630 |
631 | |
632 (defun forward-ifdef (&optional arg) | |
633 "Move point to beginning of line of the next ifdef-endif. | |
210 | 634 With argument, do this that many times." |
31 | 635 (interactive "p") |
636 (or arg (setq arg 1)) | |
41619 | 637 (if (< arg 0) (backward-ifdef (- arg)) |
638 (while (< 0 arg) | |
639 (setq arg (- arg)) | |
640 (let ((start (point))) | |
641 (unless (hif-looking-at-ifX) | |
31 | 642 (hif-find-next-relevant)) |
41619 | 643 (if (hif-looking-at-ifX) |
644 (hif-ifdef-to-endif) | |
645 (goto-char start) | |
646 (error "No following #ifdef")))))) | |
31 | 647 |
648 | |
649 (defun backward-ifdef (&optional arg) | |
650 "Move point to beginning of the previous ifdef-endif. | |
210 | 651 With argument, do this that many times." |
31 | 652 (interactive "p") |
653 (or arg (setq arg 1)) | |
41619 | 654 (if (< arg 0) (forward-ifdef (- arg)) |
655 (while (< 0 arg) | |
656 (setq arg (1- arg)) | |
657 (beginning-of-line) | |
658 (let ((start (point))) | |
659 (unless (hif-looking-at-endif) | |
31 | 660 (hif-find-previous-relevant)) |
41619 | 661 (if (hif-looking-at-endif) |
662 (hif-endif-to-ifdef) | |
663 (goto-char start) | |
664 (error "No previous #ifdef")))))) | |
31 | 665 |
666 | |
667 (defun down-ifdef () | |
668 "Move point to beginning of nested ifdef or else-part." | |
669 (interactive) | |
670 (let ((start (point))) | |
671 (hif-find-next-relevant) | |
672 (if (or (hif-looking-at-ifX) (hif-looking-at-else)) | |
673 () | |
674 (goto-char start) | |
210 | 675 (error "No following #ifdef")))) |
31 | 676 |
677 | |
678 (defun up-ifdef () | |
679 "Move point to beginning of enclosing ifdef or else-part." | |
680 (interactive) | |
681 (beginning-of-line) | |
682 (let ((start (point))) | |
41619 | 683 (unless (hif-looking-at-endif) |
684 (hif-find-previous-relevant)) | |
31 | 685 (if (hif-looking-at-endif) |
686 (hif-endif-to-ifdef)) | |
687 (if (= start (point)) | |
210 | 688 (error "No previous #ifdef")))) |
31 | 689 |
690 (defun next-ifdef (&optional arg) | |
691 "Move to the beginning of the next #ifX, #else, or #endif. | |
210 | 692 With argument, do this that many times." |
31 | 693 (interactive "p") |
694 (or arg (setq arg 1)) | |
41619 | 695 (if (< arg 0) (previous-ifdef (- arg)) |
696 (while (< 0 arg) | |
697 (setq arg (1- arg)) | |
698 (hif-find-next-relevant) | |
699 (when (eolp) | |
700 (beginning-of-line) | |
701 (error "No following #ifdefs, #elses, or #endifs"))))) | |
31 | 702 |
703 (defun previous-ifdef (&optional arg) | |
704 "Move to the beginning of the previous #ifX, #else, or #endif. | |
210 | 705 With argument, do this that many times." |
31 | 706 (interactive "p") |
707 (or arg (setq arg 1)) | |
41619 | 708 (if (< arg 0) (next-ifdef (- arg)) |
709 (while (< 0 arg) | |
710 (setq arg (1- arg)) | |
711 (let ((start (point))) | |
712 (hif-find-previous-relevant) | |
713 (if (= start (point)) | |
714 (error "No previous #ifdefs, #elses, or #endifs")))))) | |
31 | 715 |
716 | |
41619 | 717 ;;===%%SF%% parsing (End) === |
31 | 718 |
719 | |
41619 | 720 ;;===%%SF%% hide-ifdef-hiding (Start) === |
31 | 721 |
722 | |
723 ;;; A range is a structure with four components: | |
724 ;;; ELSE-P True if there was an else clause for the ifdef. | |
725 ;;; START The start of the range. (beginning of line) | |
726 ;;; ELSE The else marker (beginning of line) | |
727 ;;; Only valid if ELSE-P is true. | |
728 ;;; END The end of the range. (beginning of line) | |
729 | |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
730 (defsubst hif-make-range (start end &optional else) |
41619 | 731 (list start else end)) |
31 | 732 |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
733 (defsubst hif-range-start (range) (elt range 0)) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
734 (defsubst hif-range-else (range) (elt range 1)) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
735 (defsubst hif-range-end (range) (elt range 2)) |
31 | 736 |
737 | |
738 | |
739 ;;; Find-Range | |
740 ;;; The workhorse, it delimits the #if region. Reasonably simple: | |
741 ;;; Skip until an #else or #endif is found, remembering positions. If | |
742 ;;; an #else was found, skip some more, looking for the true #endif. | |
743 | |
744 (defun hif-find-range () | |
41619 | 745 "Return a Range structure describing the current #if region. |
31 | 746 Point is left unchanged." |
41619 | 747 ;; (message "hif-find-range at %d" (point)) |
31 | 748 (save-excursion |
749 (beginning-of-line) | |
750 (let ((start (point)) | |
751 (else nil) | |
752 (end nil)) | |
753 ;; Part one. Look for either #endif or #else. | |
754 ;; This loop-and-a-half dedicated to E. Dijkstra. | |
41619 | 755 (while (progn |
756 (hif-find-next-relevant) | |
757 (hif-looking-at-ifX)) ; Skip nested ifdef | |
758 (hif-ifdef-to-endif)) | |
31 | 759 ;; Found either a #else or an #endif. |
760 (cond ((hif-looking-at-else) | |
761 (setq else (point))) | |
762 (t | |
41619 | 763 (setq end (point)))) ; (save-excursion (end-of-line) (point)) |
31 | 764 ;; If found #else, look for #endif. |
41619 | 765 (when else |
766 (while (progn | |
767 (hif-find-next-relevant) | |
768 (hif-looking-at-ifX)) ; Skip nested ifdef | |
769 (hif-ifdef-to-endif)) | |
770 (if (hif-looking-at-else) | |
771 (error "Found two elses in a row? Broken!")) | |
772 (setq end (point))) ; (save-excursion (end-of-line) (point)) | |
773 (hif-make-range start end else)))) | |
31 | 774 |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
775 |
31 | 776 ;;; A bit slimy. |
777 | |
778 (defun hif-hide-line (point) | |
210 | 779 "Hide the line containing point. Does nothing if `hide-ifdef-lines' is nil." |
87851
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
780 (when hide-ifdef-lines |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
781 (save-excursion |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
782 (goto-char point) |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
783 (hide-ifdef-region-internal |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
784 (line-beginning-position) (progn (hif-end-of-line) (point)))))) |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
785 |
31 | 786 |
787 ;;; Hif-Possibly-Hide | |
788 ;;; There are four cases. The #ifX expression is "taken" if it | |
789 ;;; the hide-ifdef-evaluator returns T. Presumably, this means the code | |
790 ;;; inside the #ifdef would be included when the program was | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
791 ;;; compiled. |
31 | 792 ;;; |
793 ;;; Case 1: #ifX taken, and there's an #else. | |
794 ;;; The #else part must be hidden. The #if (then) part must be | |
795 ;;; processed for nested #ifX's. | |
796 ;;; Case 2: #ifX taken, and there's no #else. | |
797 ;;; The #if part must be processed for nested #ifX's. | |
798 ;;; Case 3: #ifX not taken, and there's an #else. | |
799 ;;; The #if part must be hidden. The #else part must be processed | |
800 ;;; for nested #ifs. | |
801 ;;; Case 4: #ifX not taken, and there's no #else. | |
802 ;;; The #ifX part must be hidden. | |
803 ;;; | |
804 ;;; Further processing is done by narrowing to the relevant region | |
805 ;;; and just recursively calling hide-ifdef-guts. | |
806 ;;; | |
807 ;;; When hif-possibly-hide returns, point is at the end of the | |
808 ;;; possibly-hidden range. | |
809 | |
810 (defun hif-recurse-on (start end) | |
210 | 811 "Call `hide-ifdef-guts' after narrowing to end of START line and END line." |
31 | 812 (save-excursion |
813 (save-restriction | |
814 (goto-char start) | |
815 (end-of-line) | |
816 (narrow-to-region (point) end) | |
817 (hide-ifdef-guts)))) | |
818 | |
819 (defun hif-possibly-hide () | |
13855 | 820 "Called at #ifX expression, this hides those parts that should be hidden. |
821 It uses the judgement of `hide-ifdef-evaluator'." | |
41619 | 822 ;; (message "hif-possibly-hide") (sit-for 1) |
823 (let ((test (hif-canonicalize)) | |
824 (range (hif-find-range))) | |
825 ;; (message "test = %s" test) (sit-for 1) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
826 |
41619 | 827 (hif-hide-line (hif-range-end range)) |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
828 (if (not (hif-not (funcall hide-ifdef-evaluator test))) |
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
829 (cond ((hif-range-else range) ; case 1 |
31 | 830 (hif-hide-line (hif-range-else range)) |
41644
6546efdc0288
(hif-end-of-line): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
41619
diff
changeset
|
831 (hide-ifdef-region (hif-range-else range) |
41619 | 832 (1- (hif-range-end range))) |
833 (hif-recurse-on (hif-range-start range) | |
834 (hif-range-else range))) | |
835 (t ; case 2 | |
836 (hif-recurse-on (hif-range-start range) | |
837 (hif-range-end range)))) | |
838 (cond ((hif-range-else range) ; case 3 | |
839 (hif-hide-line (hif-range-else range)) | |
840 (hide-ifdef-region (hif-range-start range) | |
841 (1- (hif-range-else range))) | |
842 (hif-recurse-on (hif-range-else range) | |
843 (hif-range-end range))) | |
844 (t ; case 4 | |
845 (hide-ifdef-region (point) | |
846 (1- (hif-range-end range)))))) | |
847 (hif-hide-line (hif-range-start range)) ; Always hide start. | |
848 (goto-char (hif-range-end range)) | |
849 (end-of-line))) | |
31 | 850 |
851 | |
852 | |
853 (defun hide-ifdef-guts () | |
13855 | 854 "Does most of the work of `hide-ifdefs'. |
855 It does not do the work that's pointless to redo on a recursive entry." | |
41619 | 856 ;; (message "hide-ifdef-guts") |
31 | 857 (save-excursion |
858 (goto-char (point-min)) | |
859 (while (hif-find-any-ifX) | |
860 (hif-possibly-hide)))) | |
861 | |
41619 | 862 ;;===%%SF%% hide-ifdef-hiding (End) === |
31 | 863 |
864 | |
41619 | 865 ;;===%%SF%% exports (Start) === |
31 | 866 |
867 (defun hide-ifdef-toggle-read-only () | |
41619 | 868 "Toggle `hide-ifdef-read-only'." |
31 | 869 (interactive) |
870 (setq hide-ifdef-read-only (not hide-ifdef-read-only)) | |
871 (message "Hide-Read-Only %s" | |
872 (if hide-ifdef-read-only "ON" "OFF")) | |
873 (if hide-ifdef-hiding | |
874 (setq buffer-read-only (or hide-ifdef-read-only hif-outside-read-only))) | |
11581
e21661a78292
(hide-ifdef-toggle-read-only): Use force-mode-line-update.
Karl Heuer <kwzh@gnu.org>
parents:
11455
diff
changeset
|
875 (force-mode-line-update)) |
31 | 876 |
877 (defun hide-ifdef-toggle-outside-read-only () | |
13855 | 878 "Replacement for `toggle-read-only' within Hide-Ifdef mode." |
31 | 879 (interactive) |
880 (setq hif-outside-read-only (not hif-outside-read-only)) | |
881 (message "Read only %s" | |
882 (if hif-outside-read-only "ON" "OFF")) | |
883 (setq buffer-read-only | |
884 (or (and hide-ifdef-hiding hide-ifdef-read-only) | |
41619 | 885 hif-outside-read-only)) |
11581
e21661a78292
(hide-ifdef-toggle-read-only): Use force-mode-line-update.
Karl Heuer <kwzh@gnu.org>
parents:
11455
diff
changeset
|
886 (force-mode-line-update)) |
31 | 887 |
87851
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
888 (defun hide-ifdef-toggle-shadowing () |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
889 "Toggle shadowing." |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
890 (interactive) |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
891 (set (make-local-variable 'hide-ifdef-shadow) (not hide-ifdef-shadow)) |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
892 (message "Shadowing %s" (if hide-ifdef-shadow "ON" "OFF")) |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
893 (save-restriction |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
894 (widen) |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
895 (dolist (overlay (overlays-in (point-min) (point-max))) |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
896 (when (overlay-get overlay 'hide-ifdef) |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
897 (if hide-ifdef-shadow |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
898 (progn |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
899 (overlay-put overlay 'invisible nil) |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
900 (overlay-put overlay 'face 'hide-ifdef-shadow)) |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
901 (overlay-put overlay 'face nil) |
6e4b2a69d875
(hide-ifdef-shadow): New option.
Martin Rudalics <rudalics@gmx.at>
parents:
79717
diff
changeset
|
902 (overlay-put overlay 'invisible 'hide-ifdef)))))) |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
903 |
31 | 904 (defun hide-ifdef-define (var) |
905 "Define a VAR so that #ifdef VAR would be included." | |
906 (interactive "SDefine what? ") | |
8914 | 907 (hif-set-var var 1) |
31 | 908 (if hide-ifdef-hiding (hide-ifdefs))) |
909 | |
910 (defun hide-ifdef-undef (var) | |
911 "Undefine a VAR so that #ifdef VAR would not be included." | |
912 (interactive "SUndefine what? ") | |
913 (hif-set-var var nil) | |
914 (if hide-ifdef-hiding (hide-ifdefs))) | |
915 | |
916 | |
13855 | 917 (defun hide-ifdefs (&optional nomsg) |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
918 "Hide the contents of some #ifdefs. |
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43747
diff
changeset
|
919 Assume that defined symbols have been added to `hide-ifdef-env'. |
1476 | 920 The text hidden is the text that would not be included by the C |
921 preprocessor if it were given the file with those symbols defined. | |
31 | 922 |
8375 | 923 Turn off hiding by calling `show-ifdefs'." |
31 | 924 |
925 (interactive) | |
926 (message "Hiding...") | |
13856
8046a1616264
(hide-ifdefs): Set hif-outside-read-only here.
Richard M. Stallman <rms@gnu.org>
parents:
13855
diff
changeset
|
927 (setq hif-outside-read-only buffer-read-only) |
41619 | 928 (unless hide-ifdef-mode (hide-ifdef-mode 1)) ; turn on hide-ifdef-mode |
31 | 929 (if hide-ifdef-hiding |
930 (show-ifdefs)) ; Otherwise, deep confusion. | |
41619 | 931 (setq hide-ifdef-hiding t) |
932 (hide-ifdef-guts) | |
7324
7e78d145539b
(show-ifdefs, hide-ifdefs): Bind inhibit-read-only.
Richard M. Stallman <rms@gnu.org>
parents:
5560
diff
changeset
|
933 (setq buffer-read-only (or hide-ifdef-read-only hif-outside-read-only)) |
13855 | 934 (or nomsg |
935 (message "Hiding done"))) | |
31 | 936 |
937 | |
938 (defun show-ifdefs () | |
13855 | 939 "Cancel the effects of `hide-ifdef': show the contents of all #ifdefs." |
31 | 940 (interactive) |
7324
7e78d145539b
(show-ifdefs, hide-ifdefs): Bind inhibit-read-only.
Richard M. Stallman <rms@gnu.org>
parents:
5560
diff
changeset
|
941 (setq buffer-read-only hif-outside-read-only) |
41619 | 942 (hif-show-all) |
210 | 943 (setq hide-ifdef-hiding nil)) |
31 | 944 |
945 | |
946 (defun hif-find-ifdef-block () | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3457
diff
changeset
|
947 "Utility for hide and show `ifdef-block'. |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
948 Return as (TOP . BOTTOM) the extent of ifdef block." |
31 | 949 (let (max-bottom) |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
950 (cons (save-excursion |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
951 (beginning-of-line) |
41619 | 952 (unless (or (hif-looking-at-else) (hif-looking-at-ifX)) |
953 (up-ifdef)) | |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
954 (prog1 (point) |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
955 (hif-ifdef-to-endif) |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
956 (setq max-bottom (1- (point))))) |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
957 (save-excursion |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
958 (beginning-of-line) |
41619 | 959 (unless (hif-looking-at-endif) |
960 (hif-find-next-relevant)) | |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
961 (while (hif-looking-at-ifX) |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
962 (hif-ifdef-to-endif) |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
963 (hif-find-next-relevant)) |
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
964 (min max-bottom (1- (point))))))) |
31 | 965 |
966 | |
967 (defun hide-ifdef-block () | |
968 "Hide the ifdef block (true or false part) enclosing or before the cursor." | |
969 (interactive) | |
41619 | 970 (unless hide-ifdef-mode (hide-ifdef-mode 1)) |
971 (let ((top-bottom (hif-find-ifdef-block))) | |
23440
21dd0dd62240
(hide-ifdef-env, hif-outside-read-only):
Andreas Schwab <schwab@suse.de>
parents:
20781
diff
changeset
|
972 (hide-ifdef-region (car top-bottom) (cdr top-bottom)) |
41619 | 973 (when hide-ifdef-lines |
974 (hif-hide-line (car top-bottom)) | |
975 (hif-hide-line (1+ (cdr top-bottom)))) | |
210 | 976 (setq hide-ifdef-hiding t)) |
7324
7e78d145539b
(show-ifdefs, hide-ifdefs): Bind inhibit-read-only.
Richard M. Stallman <rms@gnu.org>
parents:
5560
diff
changeset
|
977 (setq buffer-read-only (or hide-ifdef-read-only hif-outside-read-only))) |
31 | 978 |
979 (defun show-ifdef-block () | |
980 "Show the ifdef block (true or false part) enclosing or before the cursor." | |
981 (interactive) | |
70769
c1396ff7810f
(show-ifdef-block): Fix bug where parts of a hidden block remained hidden if
Eli Zaretskii <eliz@gnu.org>
parents:
68773
diff
changeset
|
982 (let ((top-bottom (hif-find-ifdef-block))) |
c1396ff7810f
(show-ifdef-block): Fix bug where parts of a hidden block remained hidden if
Eli Zaretskii <eliz@gnu.org>
parents:
68773
diff
changeset
|
983 (if hide-ifdef-lines |
c1396ff7810f
(show-ifdef-block): Fix bug where parts of a hidden block remained hidden if
Eli Zaretskii <eliz@gnu.org>
parents:
68773
diff
changeset
|
984 (hif-show-ifdef-region |
c1396ff7810f
(show-ifdef-block): Fix bug where parts of a hidden block remained hidden if
Eli Zaretskii <eliz@gnu.org>
parents:
68773
diff
changeset
|
985 (save-excursion |
c1396ff7810f
(show-ifdef-block): Fix bug where parts of a hidden block remained hidden if
Eli Zaretskii <eliz@gnu.org>
parents:
68773
diff
changeset
|
986 (goto-char (car top-bottom)) (line-beginning-position)) |
c1396ff7810f
(show-ifdef-block): Fix bug where parts of a hidden block remained hidden if
Eli Zaretskii <eliz@gnu.org>
parents:
68773
diff
changeset
|
987 (save-excursion |
c1396ff7810f
(show-ifdef-block): Fix bug where parts of a hidden block remained hidden if
Eli Zaretskii <eliz@gnu.org>
parents:
68773
diff
changeset
|
988 (goto-char (1+ (cdr top-bottom))) |
c1396ff7810f
(show-ifdef-block): Fix bug where parts of a hidden block remained hidden if
Eli Zaretskii <eliz@gnu.org>
parents:
68773
diff
changeset
|
989 (hif-end-of-line) (point))) |
41619 | 990 (hif-show-ifdef-region (1- (car top-bottom)) (cdr top-bottom))))) |
31 | 991 |
992 | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3457
diff
changeset
|
993 ;;; definition alist support |
31 | 994 |
995 (defvar hide-ifdef-define-alist nil | |
41619 | 996 "A global assoc list of pre-defined symbol lists.") |
31 | 997 |
998 (defun hif-compress-define-list (env) | |
999 "Compress the define list ENV into a list of defined symbols only." | |
41619 | 1000 (let ((new-defs nil)) |
1001 (dolist (def env new-defs) | |
1002 (if (hif-lookup (car def)) (push (car env) new-defs))))) | |
31 | 1003 |
1004 (defun hide-ifdef-set-define-alist (name) | |
1476 | 1005 "Set the association for NAME to `hide-ifdef-env'." |
31 | 1006 (interactive "SSet define list: ") |
41619 | 1007 (push (cons name (hif-compress-define-list hide-ifdef-env)) |
1008 hide-ifdef-define-alist)) | |
31 | 1009 |
1010 (defun hide-ifdef-use-define-alist (name) | |
1476 | 1011 "Set `hide-ifdef-env' to the define list specified by NAME." |
60213
de939ef4dd88
(hide-ifdef-use-define-alist): Use
Kim F. Storm <storm@cua.dk>
parents:
52401
diff
changeset
|
1012 (interactive |
de939ef4dd88
(hide-ifdef-use-define-alist): Use
Kim F. Storm <storm@cua.dk>
parents:
52401
diff
changeset
|
1013 (list (completing-read "Use define list: " |
64119
b83cb76e940c
(hide-ifdef-use-define-alist): Pass a list of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64085
diff
changeset
|
1014 (mapcar (lambda (x) (symbol-name (car x))) |
b83cb76e940c
(hide-ifdef-use-define-alist): Pass a list of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64085
diff
changeset
|
1015 hide-ifdef-define-alist) |
b83cb76e940c
(hide-ifdef-use-define-alist): Pass a list of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64085
diff
changeset
|
1016 nil t))) |
60213
de939ef4dd88
(hide-ifdef-use-define-alist): Use
Kim F. Storm <storm@cua.dk>
parents:
52401
diff
changeset
|
1017 (if (stringp name) (setq name (intern name))) |
31 | 1018 (let ((define-list (assoc name hide-ifdef-define-alist))) |
1019 (if define-list | |
1020 (setq hide-ifdef-env | |
29588
0cf06902af64
(hif-compress-define-list)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
26519
diff
changeset
|
1021 (mapcar (lambda (arg) (cons arg t)) |
31 | 1022 (cdr define-list))) |
1023 (error "No define list for %s" name)) | |
210 | 1024 (if hide-ifdef-hiding (hide-ifdefs)))) |
31 | 1025 |
13297
9699410bf8bf
Provide hideif; require cc-mode.
Richard M. Stallman <rms@gnu.org>
parents:
12954
diff
changeset
|
1026 (provide 'hideif) |
9699410bf8bf
Provide hideif; require cc-mode.
Richard M. Stallman <rms@gnu.org>
parents:
12954
diff
changeset
|
1027 |
64119
b83cb76e940c
(hide-ifdef-use-define-alist): Pass a list of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64085
diff
changeset
|
1028 ;; arch-tag: c6381d17-a59a-483a-b945-658f22277981 |
660
08eb386dd0f3
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
210
diff
changeset
|
1029 ;;; hideif.el ends here |