# HG changeset patch # User Richard M. Stallman # Date 769168133 0 # Node ID 1f09079e18c493c28bb686139543e1f6f627dd25 # Parent bf357bdc648e84b801c9c4e14c7a6f6deac75eb9 (outline-mode): Use outline-this-or-next-heading. (outline-this-or-next-heading): New function. (outline-mode): Fixed topic body reindentation scheme so programming code is not indented unless `outline-reindent-bodies' has value `force'. (outline-infer-reindent-bodies): Implement above. (outline-reindent-bodies): Doc fix. (outline-init): New user interface for control of outline-mode session setup. Sets up `outline-find-file-hook', `outline-layout', and `outline-auto-activation'. diff -r bf357bdc648e -r 1f09079e18c4 lisp/allout.el --- a/lisp/allout.el Tue May 17 09:46:59 1994 +0000 +++ b/lisp/allout.el Tue May 17 09:48:53 1994 +0000 @@ -1,11 +1,11 @@ ;;;_* allout.el - Extensive outline mode for use alone and with other modes. -;;;_* Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. +;; Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. ;; Author: Ken Manheimer ;; Maintainer: Ken Manheimer ;; Created: Dec 1991 - first release to usenet -;; Version: $Id: allout.el,v 1.7 1994/05/09 06:36:19 rms Exp rms $|| +;; Version: Id: allout.el,v 4.3 1994/05/12 17:43:08 klm Exp || ;; Keywords: outline mode ;; This file is part of GNU Emacs. @@ -383,11 +383,18 @@ (make-variable-buffer-local 'outline-use-hanging-indents) ;;;_ = outline-reindent-bodies -(defvar outline-reindent-bodies outline-use-hanging-indents +(defvar outline-reindent-bodies (if outline-use-hanging-indents + 'text) "*Non-nil enables auto-adjust of topic body hanging indent with depth shifts. -Indented hanging bodies are adjusted to remain even with \(or -right-indented from\) the beginning of heading text.") +When active, topic body lines that are indented even with or beyond +their topic header are reindented to correspond with depth shifts of +the header. + +A value of `t' enables reindent in non-programming-code buffers, ie +those that do not have the variable `comment-start' set. A value of +`force' enables reindent whether or not `comment-start' is set.") + (make-variable-buffer-local 'outline-reindent-bodies) ;;;_ = outline-inhibit-protection @@ -408,14 +415,13 @@ ;;;_ - Version ;;;_ = outline-version (defvar outline-version - (let ((rcs-rev "$Revision: 1.7 $")) + (let ((rcs-rev "Revision: 4.3")) (condition-case err (save-match-data - (string-match "\\$Revision: \\([0-9]+\\.[0-9]+\\)" rcs-rev) + (string-match "Revision: \\([0-9]+\\.[0-9]+\\)" rcs-rev) (substring rcs-rev (match-beginning 1) (match-end 1))) (error rcs-rev))) - "Revision number of currently loaded outline package. (Currently -specific to allout.el.)") + "Revision number of currently loaded outline package. \(allout.el)") ;;;_ > outline-version (defun outline-version (&optional here) "Return string describing the loaded outline version." @@ -468,14 +474,14 @@ (make-variable-buffer-local 'outline-plain-bullets-string-len) -;;;_ > outline-reset-header-lead (header-lead) +;;;_ X outline-reset-header-lead (header-lead) (defun outline-reset-header-lead (header-lead) "*Reset the leading string used to identify topic headers." (interactive "sNew lead string: ") (setq outline-header-prefix header-lead) (setq outline-header-subtraction (1- (length outline-header-prefix))) (set-outline-regexp)) -;;;_ > outline-lead-with-comment-string (header-lead) +;;;_ X outline-lead-with-comment-string (header-lead) (defun outline-lead-with-comment-string (&optional header-lead) "*Set the topic-header leading string to specified string. @@ -489,18 +495,19 @@ (setq outline-reindent-bodies nil) (outline-reset-header-lead header-lead) header-lead) -;;;_ > outline-infer-header-lead (&optional reset) -(defun outline-infer-header-lead (&optional set) +;;;_ > outline-infer-header-lead () +(defun outline-infer-header-lead () "Determine appropriate `outline-header-prefix'. Works according to settings of: + `comment-start' `outline-header-prefix' (default) `outline-use-mode-specific-leader' and `outline-mode-leaders'. -Optional arg SET means to do the processing to establish that prefix -for current outline processing, if it has changed from prior setting." +Apply this via \(re\)activation of `outline-mode', rather than +invoking it directly." (let* ((use-leader (and (boundp 'outline-use-mode-specific-leader) (if (or (stringp outline-use-mode-specific-leader) (memq outline-use-mode-specific-leader @@ -537,8 +544,18 @@ (if (string= leader outline-header-prefix) nil ; no change, nothing to do. (setq outline-header-prefix leader) - (if set (outline-reset-header-lead outline-header-prefix)) outline-header-prefix)))) +;;;_ > outline-infer-body-reindent () +(defun outline-infer-body-reindent () + "Determine proper setting for `outline-reindent-bodies'. + +Depends on default setting of `outline-reindent-bodies' \(which see) +and presence of setting for `comment-start', to tell whether the +file is programming code." + (if (and outline-reindent-bodies + comment-start + (not (eq 'force outline-reindent-bodies))) + (setq outline-reindent-bodies nil))) ;;;_ > set-outline-regexp () (defun set-outline-regexp () "Generate proper topic-header regexp form for outline functions. @@ -740,17 +757,19 @@ "Outline-mode was last deliberately deactived. So outline-post-command-business should not reactivate it...") (make-variable-buffer-local 'outline-explicitly-deactivated) -;;;_ > outline-init (mode) -(defun outline-init (mode) +;;;_ > outline-init (&optional mode) +(defun outline-init (&optional mode) "Prime outline-mode to enable/disable auto-activation, wrt `outline-layout'. -MODE is one of: - - - nil, for no auto-activation, - - `activation', for auto-activation only, - - `ask' for auto-activation and auto-layout on confirmation from user, - - anything else, for auto-activation and auto-layout, without any - confirmation check. +MODE is one of the following symbols: + + - nil \(or no argument) deactivate auto-activation/layou; + - 'activate', enable auto-activation only; + - 'ask', enable auto-activation, and enable auto-layout but with + confirmation for layout operation solicitated from user each time; + - 'report', just report and return the current auto-activation state; + - anything else \(eg, t) for auto-activation and auto-layout, without + any confirmation check. Use this function to setup your emacs session for automatic activation of allout outline mode, contingent to the buffer-specific setting of @@ -767,22 +786,52 @@ \(require 'allout) \(outline-init t)" - (if (not mode) + (interactive) + (if (interactive-p) (progn - (setq find-file-hooks (delq 'outline-find-file-hook find-file-hooks)) - (if (interactive-p) - (message "Allout outline mode auto-activation inhibited."))) - (add-hook 'find-file-hooks 'outline-find-file-hook) - (setq outline-auto-activation - (cond ((eq mode 'activation) - (message "Allout outline mode auto-activation enabled.") - 'activate) - ((eq mode 'ask) - (message "Allout outline mode auto-activation enabled.") - 'ask) - ((message - "Allout outline mode auto-activation and -layout enabled.") - t))))) + (setq mode + (completing-read + (concat "Select outline auto setup mode " + "(empty for report, ? for options) ") + '(("nil")("full")("activate")("deactivate") + ("ask") ("report") ("")) + nil + t)) + (if (string= mode "") + (setq mode 'report) + (setq mode (intern-soft mode))))) + (let + ;; convenience aliases, for consistent ref to respective vars: + ((hook 'outline-find-file-hook) + (curr-mode 'outline-auto-activation)) + + (cond ((not mode) + (setq find-file-hooks (delq hook find-file-hooks)) + (if (interactive-p) + (message "Allout outline mode auto-activation inhibited."))) + ((eq mode 'report) + (if (not (memq hook find-file-hooks)) + (outline-init nil) + ;; Just punt and use the reports from each of the modes: + (outline-init (symbol-value curr-mode)))) + (t (add-hook 'find-file-hooks hook) + (set curr-mode ; 'set', not 'setq'! + (cond ((eq mode 'activate) + (message + "Outline mode auto-activation enabled.") + 'activate) + ((eq mode 'report) + ;; Return the current mode setting: + (outline-init mode)) + ((eq mode 'ask) + (message + (concat "Outline mode auto-activation and " + "-layout \(upon confirmation) enabled.")) + 'ask) + ((message + "Outline mode auto-activation and -layout enabled.") + 'full))))))) + ;;;_ > outline-mode (&optional toggle) ;;;_ : Defun: (defun outline-mode (&optional toggle) @@ -1049,6 +1098,7 @@ (outline-resumptions 'outline-old-style-prefixes '(())))) (outline-infer-header-lead) + (outline-infer-body-reindent) (set-outline-regexp) @@ -1128,7 +1178,8 @@ (setq outline-mode t)) ;; Reactivation: - ((setq do-layout t)) + ((setq do-layout t) + (outline-infer-body-reindent)) ) ; cond (if (and do-layout @@ -1140,16 +1191,21 @@ (buffer-name) outline-layout)) t - (message "Not doing %s layout.") + (message "Skipped %s layout." (buffer-name)) nil) t))) (save-excursion (message "Adjusting '%s' exposure..." (buffer-name)) (goto-char 0) - (if (not (outline-goto-prefix)) - (outline-next-heading)) - (apply 'outline-expose-topic (list outline-layout)) - (message "Adjusting '%s' exposure... done." (buffer-name)))) + (outline-this-or-next-heading) + (condition-case err + (progn + (apply 'outline-expose-topic (list outline-layout)) + (message "Adjusting '%s' exposure... done." (buffer-name))) + ;; Problem applying exposure - notify user, but don't + ;; interrupt, eg, file visit: + (error (message "%s" (car (cdr err))) + (sit-for 1))))) outline-mode ) ; let* ) ; defun @@ -1313,6 +1369,12 @@ (goto-char (or (match-beginning 2) outline-recent-prefix-beginning)) (or (match-end 2) outline-recent-prefix-end))))) +;;;_ : outline-this-or-next-heading +(defun outline-this-or-next-heading () + "Position cursor on current or next heading." + ;; A throwaway non-macro that is defined after outline-next-heading + ;; and usable by outline-mode. + (if (not (outline-goto-prefix)) (outline-next-heading))) ;;;_ > outline-previous-heading () (defmacro outline-previous-heading () "Move to the prior \(possibly invisible) heading line. @@ -4277,4 +4339,3 @@ ;;;End: ;; allout.el ends here -