comparison lisp/progmodes/hideif.el @ 91367:c70e45a7acfd

Merge from emacs--devo--0 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-324
author Miles Bader <miles@gnu.org>
date Wed, 30 Jan 2008 07:57:28 +0000
parents 606f2d163a64 d3fad2e8cdfb
children
comparison
equal deleted inserted replaced
91366:86f3a8f0a3a6 91367:c70e45a7acfd
1 ;;; hideif.el --- hides selected code within ifdef 1 ;;; hideif.el --- hides selected code within ifdef
2 2
3 ;; Copyright (C) 1988, 1994, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 3 ;; Copyright (C) 1988, 1994, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
4 ;; Free Software Foundation, Inc. 4 ;; 2008 Free Software Foundation, Inc.
5 5
6 ;; Author: Daniel LaLiberte <liberte@holonexus.org> 6 ;; Author: Daniel LaLiberte <liberte@holonexus.org>
7 ;; Maintainer: FSF 7 ;; Maintainer: FSF
8 ;; Keywords: c, outlines 8 ;; Keywords: c, outlines
9 9
97 ;; may appear. "Ifdef" will appear when hide-ifdef-mode is active. "Hiding" 97 ;; may appear. "Ifdef" will appear when hide-ifdef-mode is active. "Hiding"
98 ;; will appear when text may be hidden ("hide-ifdef-hiding" is non-nil). 98 ;; will appear when text may be hidden ("hide-ifdef-hiding" is non-nil).
99 ;; 99 ;;
100 ;; Written by Brian Marick, at Gould, Computer Systems Division, Urbana IL. 100 ;; Written by Brian Marick, at Gould, Computer Systems Division, Urbana IL.
101 ;; Extensively modified by Daniel LaLiberte (while at Gould). 101 ;; Extensively modified by Daniel LaLiberte (while at Gould).
102 ;;
103 ;; You may freely modify and distribute this, but keep a record
104 ;; of modifications and send comments to:
105 ;; liberte@a.cs.uiuc.edu or ihnp4!uiucdcs!liberte
106 ;; I will continue to upgrade hide-ifdef-mode
107 ;; with your contributions.
108 102
109 ;;; Code: 103 ;;; Code:
110 104
111 (require 'cc-mode) 105 (require 'cc-mode)
112 106
113 (defgroup hide-ifdef nil 107 (defgroup hide-ifdef nil
114 "Hide selected code within `ifdef'." 108 "Hide selected code within `ifdef'."
115 :group 'c) 109 :group 'c)
110
111 (defcustom hide-ifdef-initially nil
112 "Non-nil means call `hide-ifdefs' when Hide-Ifdef mode is first activated."
113 :type 'boolean
114 :group 'hide-ifdef)
115
116 (defcustom hide-ifdef-read-only nil
117 "Set to non-nil if you want buffer to be read-only while hiding text."
118 :type 'boolean
119 :group 'hide-ifdef)
120
121 (defcustom hide-ifdef-lines nil
122 "Non-nil means hide the #ifX, #else, and #endif lines."
123 :type 'boolean
124 :group 'hide-ifdef)
125
126 (defcustom hide-ifdef-shadow nil
127 "Non-nil means shadow text instead of hiding it."
128 :type 'boolean
129 :group 'hide-ifdef
130 :version "23.1")
131
132 (defface hide-ifdef-shadow '((t (:inherit shadow)))
133 "Face for shadowing ifdef blocks."
134 :group 'hide-ifdef
135 :version "23.1")
136
116 137
117 (defvar hide-ifdef-mode-submap 138 (defvar hide-ifdef-mode-submap
118 ;; Set up the submap that goes after the prefix key. 139 ;; Set up the submap that goes after the prefix key.
119 (let ((map (make-sparse-keymap))) 140 (let ((map (make-sparse-keymap)))
120 (define-key map "d" 'hide-ifdef-define) 141 (define-key map "d" 'hide-ifdef-define)
126 (define-key map "s" 'show-ifdefs) 147 (define-key map "s" 'show-ifdefs)
127 (define-key map "\C-d" 'hide-ifdef-block) 148 (define-key map "\C-d" 'hide-ifdef-block)
128 (define-key map "\C-s" 'show-ifdef-block) 149 (define-key map "\C-s" 'show-ifdef-block)
129 150
130 (define-key map "\C-q" 'hide-ifdef-toggle-read-only) 151 (define-key map "\C-q" 'hide-ifdef-toggle-read-only)
152 (define-key map "\C-w" 'hide-ifdef-toggle-shadowing)
131 (substitute-key-definition 153 (substitute-key-definition
132 'toggle-read-only 'hide-ifdef-toggle-outside-read-only map) 154 'toggle-read-only 'hide-ifdef-toggle-outside-read-only map)
133 map) 155 map)
134 "Keymap used by `hide-ifdef-mode' under `hide-ifdef-mode-prefix-key'.") 156 "Keymap used by `hide-ifdef-mode' under `hide-ifdef-mode-prefix-key'.")
135 157
153 ["Define a variable" hide-ifdef-define t] 175 ["Define a variable" hide-ifdef-define t]
154 ["Define an alist" hide-ifdef-set-define-alist t] 176 ["Define an alist" hide-ifdef-set-define-alist t]
155 ["Use an alist" hide-ifdef-use-define-alist t] 177 ["Use an alist" hide-ifdef-use-define-alist t]
156 ["Undefine a variable" hide-ifdef-undef t] 178 ["Undefine a variable" hide-ifdef-undef t]
157 ["Toggle read only" hide-ifdef-toggle-read-only 179 ["Toggle read only" hide-ifdef-toggle-read-only
158 :style toggle :selected hide-ifdef-read-only])) 180 :style toggle :selected hide-ifdef-read-only]
181 ["Toggle shadowing" hide-ifdef-toggle-shadowing
182 :style toggle :selected hide-ifdef-shadow]))
159 183
160 (defvar hide-ifdef-hiding nil 184 (defvar hide-ifdef-hiding nil
161 "Non-nil when text may be hidden.") 185 "Non-nil when text may be hidden.")
162 186
163 (or (assq 'hide-ifdef-hiding minor-mode-alist) 187 (or (assq 'hide-ifdef-hiding minor-mode-alist)
254 (end-of-line) 278 (end-of-line)
255 (while (= (logand 1 (skip-chars-backward "\\\\")) 1) 279 (while (= (logand 1 (skip-chars-backward "\\\\")) 1)
256 (end-of-line 2))) 280 (end-of-line 2)))
257 281
258 (defun hide-ifdef-region-internal (start end) 282 (defun hide-ifdef-region-internal (start end)
259 (remove-overlays start end 'invisible 'hide-ifdef) 283 (remove-overlays start end 'hide-ifdef t)
260 (let ((o (make-overlay start end))) 284 (let ((o (make-overlay start end)))
261 (overlay-put o 'invisible 'hide-ifdef))) 285 (overlay-put o 'hide-ifdef t)
286 (if hide-ifdef-shadow
287 (overlay-put o 'face 'hide-ifdef-shadow)
288 (overlay-put o 'invisible 'hide-ifdef))))
262 289
263 (defun hide-ifdef-region (start end) 290 (defun hide-ifdef-region (start end)
264 "START is the start of a #if or #else form. END is the ending part. 291 "START is the start of a #if or #else form. END is the ending part.
265 Everything including these lines is made invisible." 292 Everything including these lines is made invisible."
266 (save-excursion 293 (save-excursion
268 (goto-char end) (hif-end-of-line) (setq end (point)) 295 (goto-char end) (hif-end-of-line) (setq end (point))
269 (hide-ifdef-region-internal start end))) 296 (hide-ifdef-region-internal start end)))
270 297
271 (defun hif-show-ifdef-region (start end) 298 (defun hif-show-ifdef-region (start end)
272 "Everything between START and END is made visible." 299 "Everything between START and END is made visible."
273 (remove-overlays start end 'invisible 'hide-ifdef)) 300 (remove-overlays start end 'hide-ifdef t))
274 301
275 302
276 ;;===%%SF%% evaluation (Start) === 303 ;;===%%SF%% evaluation (Start) ===
277 304
278 ;; It is not useful to set this to anything but `eval'. 305 ;; It is not useful to set this to anything but `eval'.
738 765
739 ;;; A bit slimy. 766 ;;; A bit slimy.
740 767
741 (defun hif-hide-line (point) 768 (defun hif-hide-line (point)
742 "Hide the line containing point. Does nothing if `hide-ifdef-lines' is nil." 769 "Hide the line containing point. Does nothing if `hide-ifdef-lines' is nil."
743 (if hide-ifdef-lines 770 (when hide-ifdef-lines
744 (save-excursion 771 (save-excursion
745 (goto-char point) 772 (goto-char point)
746 (hide-ifdef-region-internal (line-beginning-position) 773 (hide-ifdef-region-internal
747 (progn (hif-end-of-line) (point)))))) 774 (line-beginning-position) (progn (hif-end-of-line) (point))))))
748 775
749 776
750 ;;; Hif-Possibly-Hide 777 ;;; Hif-Possibly-Hide
751 ;;; There are four cases. The #ifX expression is "taken" if it 778 ;;; There are four cases. The #ifX expression is "taken" if it
752 ;;; the hide-ifdef-evaluator returns T. Presumably, this means the code 779 ;;; the hide-ifdef-evaluator returns T. Presumably, this means the code
825 ;;===%%SF%% hide-ifdef-hiding (End) === 852 ;;===%%SF%% hide-ifdef-hiding (End) ===
826 853
827 854
828 ;;===%%SF%% exports (Start) === 855 ;;===%%SF%% exports (Start) ===
829 856
830 ;;;###autoload
831 (defcustom hide-ifdef-initially nil
832 "*Non-nil means call `hide-ifdefs' when Hide-Ifdef mode is first activated."
833 :type 'boolean
834 :group 'hide-ifdef)
835
836 ;;;###autoload
837 (defcustom hide-ifdef-read-only nil
838 "*Set to non-nil if you want buffer to be read-only while hiding text."
839 :type 'boolean
840 :group 'hide-ifdef)
841
842 ;;;###autoload
843 (defcustom hide-ifdef-lines nil
844 "*Non-nil means hide the #ifX, #else, and #endif lines."
845 :type 'boolean
846 :group 'hide-ifdef)
847
848 (defun hide-ifdef-toggle-read-only () 857 (defun hide-ifdef-toggle-read-only ()
849 "Toggle `hide-ifdef-read-only'." 858 "Toggle `hide-ifdef-read-only'."
850 (interactive) 859 (interactive)
851 (setq hide-ifdef-read-only (not hide-ifdef-read-only)) 860 (setq hide-ifdef-read-only (not hide-ifdef-read-only))
852 (message "Hide-Read-Only %s" 861 (message "Hide-Read-Only %s"
864 (setq buffer-read-only 873 (setq buffer-read-only
865 (or (and hide-ifdef-hiding hide-ifdef-read-only) 874 (or (and hide-ifdef-hiding hide-ifdef-read-only)
866 hif-outside-read-only)) 875 hif-outside-read-only))
867 (force-mode-line-update)) 876 (force-mode-line-update))
868 877
878 (defun hide-ifdef-toggle-shadowing ()
879 "Toggle shadowing."
880 (interactive)
881 (set (make-local-variable 'hide-ifdef-shadow) (not hide-ifdef-shadow))
882 (message "Shadowing %s" (if hide-ifdef-shadow "ON" "OFF"))
883 (save-restriction
884 (widen)
885 (dolist (overlay (overlays-in (point-min) (point-max)))
886 (when (overlay-get overlay 'hide-ifdef)
887 (if hide-ifdef-shadow
888 (progn
889 (overlay-put overlay 'invisible nil)
890 (overlay-put overlay 'face 'hide-ifdef-shadow))
891 (overlay-put overlay 'face nil)
892 (overlay-put overlay 'invisible 'hide-ifdef))))))
869 893
870 (defun hide-ifdef-define (var) 894 (defun hide-ifdef-define (var)
871 "Define a VAR so that #ifdef VAR would be included." 895 "Define a VAR so that #ifdef VAR would be included."
872 (interactive "SDefine what? ") 896 (interactive "SDefine what? ")
873 (hif-set-var var 1) 897 (hif-set-var var 1)