X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/615a3b8d0d2c88cd664f1e0beb5a32b5b8e08f90..b3910f653938fc8625f4e0c970123e826bbf427e:/lisp/outline.el diff --git a/lisp/outline.el b/lisp/outline.el index b5bf829645..61ee7ff0f9 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -1,9 +1,9 @@ ;;; outline.el --- outline mode commands for Emacs -;; Copyright (C) 1986, 1993-1995, 1997, 2000-2011 -;; Free Software Foundation, Inc. +;; Copyright (C) 1986, 1993-1995, 1997, 2000-2014 Free Software +;; Foundation, Inc. -;; Maintainer: FSF +;; Maintainer: emacs-devel@gnu.org ;; Keywords: outlines ;; This file is part of GNU Emacs. @@ -43,25 +43,21 @@ :prefix "outline-" :group 'wp) -(defcustom outline-regexp "[*\^L]+" +(defvar outline-regexp "[*\^L]+" "Regular expression to match the beginning of a heading. Any line whose beginning matches this regexp is considered to start a heading. Note that Outline mode only checks this regexp at the start of a line, so the regexp need not (and usually does not) start with `^'. The recommended way to set this is with a Local Variables: list -in the file it applies to. See also `outline-heading-end-regexp'." - :type 'regexp - :group 'outlines) +in the file it applies to. See also `outline-heading-end-regexp'.") ;;;###autoload(put 'outline-regexp 'safe-local-variable 'stringp) -(defcustom outline-heading-end-regexp "\n" +(defvar outline-heading-end-regexp "\n" "Regular expression to match the end of a heading line. You can assume that point is at the beginning of a heading when this regexp is searched for. The heading ends at the end of the match. The recommended way to set this is with a `Local Variables:' list -in the file it applies to." - :type 'regexp - :group 'outlines) +in the file it applies to.") ;;;###autoload(put 'outline-heading-end-regexp 'safe-local-variable 'stringp) (defvar outline-mode-prefix-map @@ -284,10 +280,10 @@ in the file it applies to." "Normal hook to be run after outline visibility changes.") (defvar outline-mode-hook nil - "*This hook is run when outline mode starts.") + "This hook is run when outline mode starts.") (defvar outline-blank-line nil - "*Non-nil means to leave unhidden blank line before heading.") + "Non-nil means to leave unhidden blank line before heading.") ;;;###autoload (define-derived-mode outline-mode text-mode "Outline" @@ -380,7 +376,7 @@ See the command `outline-mode' for more information on this mode." (show-all))) (defvar outline-level 'outline-level - "*Function of no args to compute a header's nesting level in an outline. + "Function of no args to compute a header's nesting level in an outline. It can assume point is at the beginning of a header line and that the match data reflects the `outline-regexp'.") ;;;###autoload(put 'outline-level 'risky-local-variable t) @@ -653,27 +649,32 @@ the match data is set appropriately." 'outline-get-last-sibling)) (ins-point (make-marker)) (cnt (abs arg)) + ;; Make sure we can move forward to find the end of the + ;; subtree and the insertion point. + (maybe-forward-char (lambda () + (if (eq (char-after) ?\n) (forward-char 1) + (if (and (eobp) (not (bolp))) (insert "\n"))))) beg end folded) - ;; Select the tree + ;; Select the tree. (outline-back-to-heading) (setq beg (point)) (save-match-data (save-excursion (outline-end-of-heading) (setq folded (outline-invisible-p))) (outline-end-of-subtree)) - (if (= (char-after) ?\n) (forward-char 1)) + (funcall maybe-forward-char) (setq end (point)) - ;; Find insertion point, with error handling + ;; Find insertion point, with error handling. (goto-char beg) (while (> cnt 0) (or (funcall movfunc) (progn (goto-char beg) - (error "Cannot move past superior level"))) + (user-error "Cannot move past superior level"))) (setq cnt (1- cnt))) (if (> arg 0) - ;; Moving forward - still need to move over subtree + ;; Moving forward - still need to move over subtree. (progn (outline-end-of-subtree) - (if (= (char-after) ?\n) (forward-char 1)))) + (funcall maybe-forward-char))) (move-marker ins-point (point)) (insert (delete-and-extract-region beg end)) (goto-char ins-point) @@ -751,6 +752,7 @@ If FLAG is nil then text is shown, while if FLAG is t the text is hidden." ;; very end of the heading, before the newline, so text inserted at FROM ;; belongs to the heading rather than to the entry. (let ((o (make-overlay from to nil 'front-advance))) + (overlay-put o 'evaporate t) (overlay-put o 'invisible 'outline) (overlay-put o 'isearch-open-invisible (or outline-isearch-open-invisible-function