X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/0b6db30be256ae75dcfe13058d18fe0780dff984..2c3d59853173258cd84dab5b12c239705dd8fc02:/lisp/foldout.el diff --git a/lisp/foldout.el b/lisp/foldout.el index c43c295e25..cf337e7e7e 100644 --- a/lisp/foldout.el +++ b/lisp/foldout.el @@ -4,8 +4,8 @@ ;; Author: Kevin Broadey ;; Created: 27 Jan 1994 -;; Version: foldout.el 1.8 dated 94/03/15 at 13:30:59 -;; Keywords: folding, outline +;; Version: foldout.el 1.10 dated 94/05/19 at 17:09:12 +;; Keywords: folding, outlines ;; This file is part of GNU Emacs. @@ -20,8 +20,9 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. ;;; Commentary: @@ -120,7 +121,19 @@ ;;; ChangeLog: -;; 1.8 15-Mar-94 +;; 1.10 21-Mar-94 +;; foldout.el is now part of the GNU Emacs distribution!! +;; Put in changes made by RMS to version 1.8 to keep the diffs to a minimum. +;; bugfix: numeric arg to foldout-exit-fold wasn't working - looks like I don't +;; know how to use the Common LISP `loop' macro after all, so use `while' +;; instead. + +;; 1.9 15-Mar-94 +;; Didn't test that very well, did I? The change to foldout-zoom-subtree +;; affected foldout-mouse-zoom: if the heading under the `level n' one clicked +;; on was at `level n+2' then it didn't get exposed. Sorry about that! + +;; 1.8 15-Mar-94 ;; Changed meaning of prefix arg to foldout-zoom-subtree. arg > 0 now means ;; "expose that many children" instead of just "expose children" so it is more ;; like `show-children' (C-c C-i). Arg of C-u on its own only shows one level @@ -223,6 +236,15 @@ An end marker of NIL means the fold ends after (point-max).") ;; slip our fold announcement into the list (setcdr outl-entry (nconc foldout-entry (cdr outl-entry))) )) + +;; outline-flag-region has different `flag' values in outline.el and +;; noutline.el for hiding and showing text. + +(defconst foldout-hide-flag + (if (featurep 'noutline) t ?\^M)) + +(defconst foldout-show-flag + (if (featurep 'noutline) nil ?\n)) (defun foldout-zoom-subtree (&optional exposure) @@ -308,59 +330,56 @@ exited and text is left visible." ;; exit the folds (widen) - (loop - always (progn - ;; get the fold at the top of the stack - (setq start-marker (car (car foldout-fold-list)) - end-marker (cdr (car foldout-fold-list)) - foldout-fold-list (cdr foldout-fold-list) - num-folds (1- num-folds)) - - ;; Make sure there is a newline at the end of this fold, - ;; otherwise the following heading will get joined to the body - ;; text. - (if end-marker - (progn - (goto-char end-marker) - (forward-char -1) - (or (memq (preceding-char) '(?\n ?\^M)) - (insert ?\n)))) - - ;; If this is the last fold to exit, hide the text unless we've - ;; been told not to. Note that at the moment point is at the - ;; beginning of the following heading if there is one. - - ;; Also, make sure that the newline before the following heading - ;; is \n otherwise it will be hidden. If there is a newline - ;; before this one, make it visible too so we do the same as - ;; outline.el and leave a blank line before the heading. - (if (zerop num-folds) - (let ((beginning-of-heading (point)) - (end-of-subtree (if end-marker - (progn - (forward-char -1) - (if (memq (preceding-char) - '(?\n ?\^M)) - (forward-char -1)) - (point)) - (point-max)))) - ;; hide the subtree - (if hide-fold - (outline-flag-region start-marker end-of-subtree ?\^M)) - - ;; make sure the next heading is exposed - (if end-marker - (outline-flag-region end-of-subtree - beginning-of-heading ?\n)) - )) - - ;; zap the markers so they don't slow down editing - (set-marker start-marker nil) - (if end-marker (set-marker end-marker nil)) - ) - - ;; have we exited enough folds? - until (zerop num-folds)) + (while (not (zerop num-folds)) + ;; get the fold at the top of the stack + (setq start-marker (car (car foldout-fold-list)) + end-marker (cdr (car foldout-fold-list)) + foldout-fold-list (cdr foldout-fold-list) + num-folds (1- num-folds)) + + ;; Make sure there is a newline at the end of this fold, + ;; otherwise the following heading will get joined to the body + ;; text. + (if end-marker + (progn + (goto-char end-marker) + (forward-char -1) + (or (memq (preceding-char) '(?\n ?\^M)) + (insert ?\n)))) + + ;; If this is the last fold to exit, hide the text unless we've + ;; been told not to. Note that at the moment point is at the + ;; beginning of the following heading if there is one. + + ;; Also, make sure that the newline before the following heading + ;; is \n otherwise it will be hidden. If there is a newline + ;; before this one, make it visible too so we do the same as + ;; outline.el and leave a blank line before the heading. + (if (zerop num-folds) + (let ((beginning-of-heading (point)) + (end-of-subtree (if end-marker + (progn + (forward-char -1) + (if (memq (preceding-char) + '(?\n ?\^M)) + (forward-char -1)) + (point)) + (point-max)))) + ;; hide the subtree + (if hide-fold + (outline-flag-region start-marker end-of-subtree + foldout-hide-flag)) + + ;; make sure the next heading is exposed + (if end-marker + (outline-flag-region end-of-subtree beginning-of-heading + foldout-show-flag)) + )) + + ;; zap the markers so they don't slow down editing + (set-marker start-marker nil) + (if end-marker (set-marker end-marker nil)) + ) ;; narrow to the enclosing fold if there is one (if foldout-fold-list @@ -420,7 +439,7 @@ How much is exposed by the zoom depends on the number of mouse clicks:- (let ((nclicks (event-click-count event))) (cond ((= nclicks 1) -1) ; body only - ((= nclicks 2) +1) ; subheadings only + ((= nclicks 2) '(1)) ; subheadings only ((= nclicks 3) nil) ; body and subheadings (t 0))))) ; entire subtree @@ -548,3 +567,4 @@ Valid modifiers are shift, control, meta, alt, hyper and super.") (provide 'foldout) ;;; foldout.el ends here +