Mercurial > emacs
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) |