(show-ifdefs, hide-ifdefs): Bind inhibit-read-only.
authorRichard M. Stallman <rms@gnu.org>
Wed, 4 May 1994 23:20:44 +0000 (23:20 +0000)
committerRichard M. Stallman <rms@gnu.org>
Wed, 4 May 1994 23:20:44 +0000 (23:20 +0000)
Set buffer-read-only directly.
(hide-ifdef-block): Likewise.
(show-ifdef-block): Bind inhibit-read-only; don't set buffer-read-only.

Delete bindings for C-c C-f, C-c C-b, C-c C-u, C-c C-d,
C-c C-p and C-c C-n.  Move C-c C-h to C-c C-d.
(define-hide-ifdef-mode-map): Remove this code
from a function and execute it at load time.
(hide-ifdef-mode-submap): New variable holds the list of commands.
(hide-ifdef-mode-map): Set this up with a prefix key
and put it in minor-mode-map-alist.
(hide-ifdef-mode-map-before): Variable deleted.
(hide-ifdef-mode): Use force-mode-line-update.
Delete the code to manipulate keymaps.

(define-hide-ifdef-mode-map):
Pass (keymap) as KEYMAP arg to where-is-internal.

lisp/progmodes/hideif.el

index a48e471..ee7ff90 100644 (file)
@@ -1,8 +1,9 @@
 ;;; hide-ifdef-mode.el --- hides selected code within ifdef.
 
-;;; Copyright (C) 1988 Free Software Foundation, Inc.
+;;; Copyright (C) 1988, 1994 Free Software Foundation, Inc.
 
 ;; Author: Dan LaLiberte <liberte@a.cs.uiuc.edu>
+;; Maintainer: FSF
 ;; Keywords: c
 
 ;; This file is part of GNU Emacs.
 
 ;;; Code:
 
+(defvar hide-ifdef-mode-submap nil
+  "Keymap used with Hide-Ifdef mode.")
+
 (defvar hide-ifdef-mode-map nil
-  "Keymap used with Hide-Ifdef mode")
+  "Keymap used with Hide-Ifdef mode.")
 
 (defconst hide-ifdef-mode-prefix-key "\C-c"
   "Prefix key for all Hide-Ifdef mode commands.")
 
-(defvar hide-ifdef-mode-map-before nil
-  "Buffer-local variable to store a copy of the local keymap
-before `hide-ifdef-mode' modifies it.")
-
-(defun define-hide-ifdef-mode-map ()
-  (if hide-ifdef-mode-map
-      ()                               ; dont redefine it.
-    (setq hide-ifdef-mode-map (make-sparse-keymap))
-    (define-key hide-ifdef-mode-map "\ed" 'hide-ifdef-define)
-    (define-key hide-ifdef-mode-map "\eu" 'hide-ifdef-undef)
-    (define-key hide-ifdef-mode-map "\eD" 'hide-ifdef-set-define-alist)
-    (define-key hide-ifdef-mode-map "\eU" 'hide-ifdef-use-define-alist)
-  
-    (define-key hide-ifdef-mode-map "\eh" 'hide-ifdefs)
-    (define-key hide-ifdef-mode-map "\es" 'show-ifdefs)
-    (define-key hide-ifdef-mode-map "\C-h" 'hide-ifdef-block)
-    (define-key hide-ifdef-mode-map "\C-s" 'show-ifdef-block)
-  
-    (define-key hide-ifdef-mode-map "\C-f" 'forward-ifdef)
-    (define-key hide-ifdef-mode-map "\C-b" 'backward-ifdef)
-    (define-key hide-ifdef-mode-map "\C-d" 'down-ifdef)
-    (define-key hide-ifdef-mode-map "\C-u" 'up-ifdef)
-    (define-key hide-ifdef-mode-map "\C-n" 'next-ifdef)
-    (define-key hide-ifdef-mode-map "\C-p" 'previous-ifdef)
-    (define-key hide-ifdef-mode-map "\C-q" 'hide-ifdef-toggle-read-only)
-    (let ((where (where-is-internal 'toggle-read-only nil nil t)))
-      (if where
-         (define-key hide-ifdef-mode-map
-           where
-           'hide-ifdef-toggle-outside-read-only)))
-    )
-  (fset 'hide-ifdef-mode-map hide-ifdef-mode-map)  ; the function is the map
+;; Set up the submap that goes after the prefix key.
+(if hide-ifdef-mode-submap
+    ()                         ; dont redefine it.
+  (setq hide-ifdef-mode-submap (make-sparse-keymap))
+  (define-key hide-ifdef-mode-submap "\ed" 'hide-ifdef-define)
+  (define-key hide-ifdef-mode-submap "\eu" 'hide-ifdef-undef)
+  (define-key hide-ifdef-mode-submap "\eD" 'hide-ifdef-set-define-alist)
+  (define-key hide-ifdef-mode-submap "\eU" 'hide-ifdef-use-define-alist)
+
+  (define-key hide-ifdef-mode-submap "\eh" 'hide-ifdefs)
+  (define-key hide-ifdef-mode-submap "\es" 'show-ifdefs)
+  (define-key hide-ifdef-mode-submap "\C-d" 'hide-ifdef-block)
+  (define-key hide-ifdef-mode-submap "\C-s" 'show-ifdef-block)
+
+  (define-key hide-ifdef-mode-submap "\C-q" 'hide-ifdef-toggle-read-only)
+  (let ((where (where-is-internal 'toggle-read-only '(keymap) t)))
+    (if where
+       (define-key hide-ifdef-mode-submap
+         where
+         'hide-ifdef-toggle-outside-read-only)))
   )
 
+;; Set up the mode's main map, which leads via the prefix key to the submap.
+(if hide-ifdef-mode-map
+    ()
+  (setq hide-ifdef-mode-map (make-sparse-keymap))
+  (define-key hide-ifdef-mode-map hide-ifdef-mode-prefix-key
+    hide-ifdef-mode-submap))
+
 (defun hif-update-mode-line ()
   "Update mode-line by setting buffer-modified to itself."
   (set-buffer-modified-p (buffer-modified-p)))
 
 (defvar hide-ifdef-mode nil
-  "non-nil when hide-ifdef-mode is activated.")
+  "Non-nil when hide-ifdef-mode is activated.")
 
 (defvar hide-ifdef-hiding nil
-  "non-nil when text may be hidden.")
+  "Non-nil when text may be hidden.")
+
+;; Arrange to use the mode's map when the mode is enabled.
+(or (assq 'hide-ifdef-mode minor-mode-map-alist)
+    (setq minor-mode-map-alist
+          (cons (cons hide-ifdef-mode hide-ifdef-mode-map)
+                minor-mode-map-alist)))
 
 (or (assq 'hide-ifdef-hiding minor-mode-alist)
     (setq minor-mode-alist
@@ -240,7 +245,7 @@ hide-ifdef-read-only
            (not hide-ifdef-mode)
          (> (prefix-numeric-value arg) 0)))
   
-  (hif-update-mode-line)
+  (force-mode-line-update)
 
   (if hide-ifdef-mode
       (progn
@@ -259,13 +264,6 @@ hide-ifdef-read-only
        (make-local-variable 'hif-outside-read-only)
        (setq hif-outside-read-only buffer-read-only)
 
-       (make-local-variable 'hide-ifdef-mode-map-before)
-       (setq hide-ifdef-mode-map-before (current-local-map))
-       (use-local-map (copy-keymap (current-local-map)))
-       (local-unset-key hide-ifdef-mode-prefix-key)
-       (local-set-key hide-ifdef-mode-prefix-key 'hide-ifdef-mode-map)
-       (define-hide-ifdef-mode-map)
-
        (run-hooks 'hide-ifdef-mode-hook)
 
        (if hide-ifdef-initially
@@ -276,7 +274,6 @@ hide-ifdef-read-only
      ; else end hide-ifdef-mode
     (if hide-ifdef-hiding
        (show-ifdefs))
-    (use-local-map hide-ifdef-mode-map-before)
     (message "Exit hide-ifdef-mode.")
     ))
   
@@ -922,23 +919,21 @@ Turn off hiding by calling `show-ifdef'."
       (hide-ifdef-mode 1)) ; turn on hide-ifdef-mode
   (if hide-ifdef-hiding
       (show-ifdefs))                   ; Otherwise, deep confusion.
-  (if buffer-read-only (toggle-read-only)) ; make it writable temporarily
-  (setq selective-display t)
-  (setq hide-ifdef-hiding t)
-  (hide-ifdef-guts)
-  (if (or hide-ifdef-read-only hif-outside-read-only)
-      (toggle-read-only)) ; make it read only
+  (let ((inhibit-read-only t))
+    (setq selective-display t)
+    (setq hide-ifdef-hiding t)
+    (hide-ifdef-guts))
+  (setq buffer-read-only (or hide-ifdef-read-only hif-outside-read-only))
   (message "Hiding done"))
 
 
 (defun show-ifdefs ()
   "Cancel the effects of `hide-ifdef'.  The contents of all #ifdefs is shown."
   (interactive)
-  (if buffer-read-only (toggle-read-only)) ; make it writable temporarily
+  (setq buffer-read-only hif-outside-read-only)
   (setq selective-display nil) ; defaults
-  (hif-show-all)
-  (if hif-outside-read-only
-      (toggle-read-only)) ; make it read only
+  (let ((inhibit-read-only t))
+    (hif-show-all))
   (setq hide-ifdef-hiding nil))
 
 
@@ -969,9 +964,8 @@ Set top and bottom of ifdef block."
   (interactive)
   (if (not hide-ifdef-mode)
       (hide-ifdef-mode 1))
-  (if buffer-read-only (toggle-read-only))
   (setq selective-display t)
-  (let (top bottom)
+  (let (top bottom (inhibit-read-only t))
     (hif-find-ifdef-block) ; set top and bottom - dynamic scoping
     (hide-ifdef-region top bottom)
     (if hide-ifdef-lines
@@ -979,15 +973,13 @@ Set top and bottom of ifdef block."
          (hif-hide-line top)
          (hif-hide-line (1+ bottom))))
     (setq hide-ifdef-hiding t))
-  (if (or hide-ifdef-read-only hif-outside-read-only)
-      (toggle-read-only)))
+  (setq buffer-read-only (or hide-ifdef-read-only hif-outside-read-only)))
 
 
 (defun show-ifdef-block ()
   "Show the ifdef block (true or false part) enclosing or before the cursor."
   (interactive)
-  (let ((old-read-only buffer-read-only))
-    (if old-read-only (toggle-read-only))
+  (let ((inhibit-read-only t))
     (if hide-ifdef-lines
        (save-excursion
          (beginning-of-line)
@@ -995,11 +987,7 @@ Set top and bottom of ifdef block."
 
       (let (top bottom)
        (hif-find-ifdef-block)
-       (hif-show-ifdef-region (1- top) bottom))
-      )
-
-    ; restore read only status since we dont know if all is shown.
-    (if old-read-only (toggle-read-only))))
+       (hif-show-ifdef-region (1- top) bottom)))))
 
 
 ;;;  definition alist support