annotate lisp/outline.el @ 72863:526dc1f36b09

(produce_image_glyph): Automatically crop wide images at right window edge so we can draw the cursor on the same row to avoid confusing redisplay by placing the cursor outside the visible window area.
author Kim F. Storm <storm@cua.dk>
date Thu, 14 Sep 2006 09:37:44 +0000
parents 63b772bfba93
children 4bb58e866a28 a5812696f7bf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1 ;;; outline.el --- outline mode commands for Emacs
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
2
64762
41bb365f41c4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64091
diff changeset
3 ;; Copyright (C) 1986, 1993, 1994, 1995, 1997, 2000, 2001, 2002,
68651
3bd95f4f2941 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68279
diff changeset
4 ;; 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
5
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
6 ;; Maintainer: FSF
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
7 ;; Keywords: outlines
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
8
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
10
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
14 ;; any later version.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
15
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
19 ;; GNU General Public License for more details.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
20
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64091
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 64040
diff changeset
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 64040
diff changeset
24 ;; Boston, MA 02110-1301, USA.
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
25
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
26 ;;; Commentary:
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
27
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
28 ;; This package is a major mode for editing outline-format documents.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
29 ;; An outline can be `abstracted' to show headers at any given level,
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
30 ;; with all stuff below hidden. See the Emacs manual for details.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
31
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
32 ;;; Todo:
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
33
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
34 ;; - subtree-terminators
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
35 ;; - better handle comments before function bodies (i.e. heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
36 ;; - don't bother hiding whitespace
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
37
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
38 ;;; Code:
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
39
65294
ecfa88bd9638 (font-lock-warning-face): Add defvar.
Juanma Barranquero <lekktu@gmail.com>
parents: 65214
diff changeset
40 (defvar font-lock-warning-face)
ecfa88bd9638 (font-lock-warning-face): Add defvar.
Juanma Barranquero <lekktu@gmail.com>
parents: 65214
diff changeset
41
ecfa88bd9638 (font-lock-warning-face): Add defvar.
Juanma Barranquero <lekktu@gmail.com>
parents: 65214
diff changeset
42
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
43 (defgroup outlines nil
64040
44cf3ecee23f (outlines): Finish `defgroup' description with period.
Juanma Barranquero <lekktu@gmail.com>
parents: 62803
diff changeset
44 "Support for hierarchical outlining."
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
45 :prefix "outline-"
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
46 :group 'editing)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
47
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
48 (defcustom outline-regexp "[*\^L]+"
69297
c379d6c262b1 (hide-sublevels): Provide better interactive default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
49 "Regular expression to match the beginning of a heading.
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
50 Any line whose beginning matches this regexp is considered to start a heading.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
51 Note that Outline mode only checks this regexp at the start of a line,
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
52 so the regexp need not (and usually does not) start with `^'.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
53 The recommended way to set this is with a Local Variables: list
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
54 in the file it applies to. See also `outline-heading-end-regexp'."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
55 :type '(choice regexp (const nil))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
56 :group 'outlines)
70590
63b772bfba93 Move `safe-local-variable' declarations to the respective files.
Reiner Steib <Reiner.Steib@gmx.de>
parents: 69297
diff changeset
57 ;;;###autoload(put 'outline-regexp 'safe-local-variable 'string-or-null-p)
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
58
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
59 (defcustom outline-heading-end-regexp "\n"
69297
c379d6c262b1 (hide-sublevels): Provide better interactive default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
60 "Regular expression to match the end of a heading line.
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
61 You can assume that point is at the beginning of a heading when this
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
62 regexp is searched for. The heading ends at the end of the match.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
63 The recommended way to set this is with a `Local Variables:' list
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
64 in the file it applies to."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
65 :type 'regexp
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
66 :group 'outlines)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
67
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
68 (defvar outline-mode-prefix-map
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
69 (let ((map (make-sparse-keymap)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
70 (define-key map "@" 'outline-mark-subtree)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
71 (define-key map "\C-n" 'outline-next-visible-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
72 (define-key map "\C-p" 'outline-previous-visible-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
73 (define-key map "\C-i" 'show-children)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
74 (define-key map "\C-s" 'show-subtree)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
75 (define-key map "\C-d" 'hide-subtree)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
76 (define-key map "\C-u" 'outline-up-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
77 (define-key map "\C-f" 'outline-forward-same-level)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
78 (define-key map "\C-b" 'outline-backward-same-level)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
79 (define-key map "\C-t" 'hide-body)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
80 (define-key map "\C-a" 'show-all)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
81 (define-key map "\C-c" 'hide-entry)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
82 (define-key map "\C-e" 'show-entry)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
83 (define-key map "\C-l" 'hide-leaves)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
84 (define-key map "\C-k" 'show-branches)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
85 (define-key map "\C-q" 'hide-sublevels)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
86 (define-key map "\C-o" 'hide-other)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
87 (define-key map "\C-^" 'outline-move-subtree-up)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
88 (define-key map "\C-v" 'outline-move-subtree-down)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
89 (define-key map [(control ?<)] 'outline-promote)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
90 (define-key map [(control ?>)] 'outline-demote)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
91 (define-key map "\C-m" 'outline-insert-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
92 ;; Where to bind outline-cycle ?
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
93 map))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
94
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
95 (defvar outline-mode-menu-bar-map
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
96 (let ((map (make-sparse-keymap)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
97
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
98 (define-key map [hide] (cons "Hide" (make-sparse-keymap "Hide")))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
99
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
100 (define-key map [hide hide-other] '("Hide Other" . hide-other))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
101 (define-key map [hide hide-sublevels] '("Hide Sublevels" . hide-sublevels))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
102 (define-key map [hide hide-subtree] '("Hide Subtree" . hide-subtree))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
103 (define-key map [hide hide-entry] '("Hide Entry" . hide-entry))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
104 (define-key map [hide hide-body] '("Hide Body" . hide-body))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
105 (define-key map [hide hide-leaves] '("Hide Leaves" . hide-leaves))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
106
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
107 (define-key map [show] (cons "Show" (make-sparse-keymap "Show")))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
108
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
109 (define-key map [show show-subtree] '("Show Subtree" . show-subtree))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
110 (define-key map [show show-children] '("Show Children" . show-children))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
111 (define-key map [show show-branches] '("Show Branches" . show-branches))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
112 (define-key map [show show-entry] '("Show Entry" . show-entry))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
113 (define-key map [show show-all] '("Show All" . show-all))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
114
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
115 (define-key map [headings]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
116 (cons "Headings" (make-sparse-keymap "Headings")))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
117
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
118 (define-key map [headings demote-subtree]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
119 '(menu-item "Demote subtree" outline-demote))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
120 (define-key map [headings promote-subtree]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
121 '(menu-item "Promote subtree" outline-promote))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
122 (define-key map [headings move-subtree-down]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
123 '(menu-item "Move subtree down" outline-move-subtree-down))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
124 (define-key map [headings move-subtree-up]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
125 '(menu-item "Move subtree up" outline-move-subtree-up))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
126 (define-key map [headings copy]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
127 '(menu-item "Copy to kill ring" outline-headers-as-kill
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
128 :enable mark-active))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
129 (define-key map [headings outline-insert-heading]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
130 '("New heading" . outline-insert-heading))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
131 (define-key map [headings outline-backward-same-level]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
132 '("Previous Same Level" . outline-backward-same-level))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
133 (define-key map [headings outline-forward-same-level]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
134 '("Next Same Level" . outline-forward-same-level))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
135 (define-key map [headings outline-previous-visible-heading]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
136 '("Previous" . outline-previous-visible-heading))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
137 (define-key map [headings outline-next-visible-heading]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
138 '("Next" . outline-next-visible-heading))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
139 (define-key map [headings outline-up-heading]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
140 '("Up" . outline-up-heading))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
141 map))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
142
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
143 (defvar outline-minor-mode-menu-bar-map
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
144 (let ((map (make-sparse-keymap)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
145 (define-key map [outline]
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
146 (cons "Outline"
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
147 (nconc (make-sparse-keymap "Outline")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
148 ;; Remove extra separator
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
149 (cdr
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
150 ;; Flatten the major mode's menus into a single menu.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
151 (apply 'append
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
152 (mapcar (lambda (x)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
153 (if (consp x)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
154 ;; Add a separator between each
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
155 ;; part of the unified menu.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
156 (cons '(--- "---") (cdr x))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
157 outline-mode-menu-bar-map))))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
158 map))
52067
36323dc1a2ac (outline-mode-hook): Define it.
Juanma Barranquero <lekktu@gmail.com>
parents: 51347
diff changeset
159
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
160
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
161 (defvar outline-mode-map
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
162 (let ((map (make-sparse-keymap)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
163 (define-key map "\C-c" outline-mode-prefix-map)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
164 (define-key map [menu-bar] outline-mode-menu-bar-map)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
165 map))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
166
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
167 (defvar outline-font-lock-keywords
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
168 '(;;
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
169 ;; Highlight headings according to the level.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
170 (eval . (list (concat "^\\(?:" outline-regexp "\\).+")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
171 0 '(outline-font-lock-face) nil t)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
172 "Additional expressions to highlight in Outline mode.")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
173
62803
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
174 (defface outline-1
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
175 '((t :inherit font-lock-function-name-face))
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
176 "Level 1."
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
177 :group 'outlines)
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
178
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
179 (defface outline-2
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
180 '((t :inherit font-lock-variable-name-face))
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
181 "Level 2."
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
182 :group 'outlines)
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
183
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
184 (defface outline-3
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
185 '((t :inherit font-lock-keyword-face))
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
186 "Level 3."
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
187 :group 'outlines)
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
188
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
189 (defface outline-4
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
190 '((t :inherit font-lock-builtin-face))
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
191 "Level 4."
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
192 :group 'outlines)
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
193
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
194 (defface outline-5
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
195 '((t :inherit font-lock-comment-face))
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
196 "Level 5."
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
197 :group 'outlines)
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
198
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
199 (defface outline-6
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
200 '((t :inherit font-lock-constant-face))
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
201 "Level 6."
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
202 :group 'outlines)
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
203
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
204 (defface outline-7
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
205 '((t :inherit font-lock-type-face))
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
206 "Level 7."
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
207 :group 'outlines)
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
208
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
209 (defface outline-8
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
210 '((t :inherit font-lock-string-face))
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
211 "Level 8."
5a1fd32a61a2 (outline-1, outline-2, outline-3, outline-4)
Lute Kamstra <lute@gnu.org>
parents: 57974
diff changeset
212 :group 'outlines)
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
213
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
214 (defvar outline-font-lock-faces
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
215 [outline-1 outline-2 outline-3 outline-4
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
216 outline-5 outline-6 outline-7 outline-8])
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
217
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
218 (defvar outline-font-lock-levels nil)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
219 (make-variable-buffer-local 'outline-font-lock-levels)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
220
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
221 (defun outline-font-lock-face ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
222 ;; (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
223 ;; (outline-back-to-heading t)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
224 ;; (let* ((count 0)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
225 ;; (start-level (funcall outline-level))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
226 ;; (level start-level)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
227 ;; face-level)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
228 ;; (while (not (setq face-level
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
229 ;; (if (or (bobp) (eq level 1)) 0
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
230 ;; (cdr (assq level outline-font-lock-levels)))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
231 ;; (outline-up-heading 1 t)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
232 ;; (setq count (1+ count))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
233 ;; (setq level (funcall outline-level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
234 ;; ;; Remember for later.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
235 ;; (unless (zerop count)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
236 ;; (setq face-level (+ face-level count))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
237 ;; (push (cons start-level face-level) outline-font-lock-levels))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
238 ;; (condition-case nil
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
239 ;; (aref outline-font-lock-faces face-level)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
240 ;; (error font-lock-warning-face))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
241 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
242 (goto-char (match-beginning 0))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
243 (looking-at outline-regexp)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
244 (condition-case nil
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
245 (aref outline-font-lock-faces (1- (funcall outline-level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
246 (error font-lock-warning-face))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
247
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
248 (defvar outline-view-change-hook nil
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
249 "Normal hook to be run after outline visibility changes.")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
250
52067
36323dc1a2ac (outline-mode-hook): Define it.
Juanma Barranquero <lekktu@gmail.com>
parents: 51347
diff changeset
251 (defvar outline-mode-hook nil
36323dc1a2ac (outline-mode-hook): Define it.
Juanma Barranquero <lekktu@gmail.com>
parents: 51347
diff changeset
252 "*This hook is run when outline mode starts.")
36323dc1a2ac (outline-mode-hook): Define it.
Juanma Barranquero <lekktu@gmail.com>
parents: 51347
diff changeset
253
55273
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
254 (defvar outline-blank-line nil
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
255 "*Non-nil means to leave unhidden blank line before heading.")
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
256
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
257 ;;;###autoload
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
258 (define-derived-mode outline-mode text-mode "Outline"
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
259 "Set major mode for editing outlines with selective display.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
260 Headings are lines which start with asterisks: one for major headings,
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
261 two for subheadings, etc. Lines not starting with asterisks are body lines.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
262
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
263 Body text or subheadings under a heading can be made temporarily
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
264 invisible, or visible again. Invisible lines are attached to the end
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
265 of the heading, so they move with it, if the line is killed and yanked
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
266 back. A heading with text hidden under it is marked with an ellipsis (...).
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
267
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
268 Commands:\\<outline-mode-map>
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
269 \\[outline-next-visible-heading] outline-next-visible-heading move by visible headings
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
270 \\[outline-previous-visible-heading] outline-previous-visible-heading
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
271 \\[outline-forward-same-level] outline-forward-same-level similar but skip subheadings
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
272 \\[outline-backward-same-level] outline-backward-same-level
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
273 \\[outline-up-heading] outline-up-heading move from subheading to heading
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
274
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
275 \\[hide-body] make all text invisible (not headings).
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
276 \\[show-all] make everything in buffer visible.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
277 \\[hide-sublevels] make only the first N levels of headers visible.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
278
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
279 The remaining commands are used when point is on a heading line.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
280 They apply to some of the body or subheadings of that heading.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
281 \\[hide-subtree] hide-subtree make body and subheadings invisible.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
282 \\[show-subtree] show-subtree make body and subheadings visible.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
283 \\[show-children] show-children make direct subheadings visible.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
284 No effect on body, or subheadings 2 or more levels down.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
285 With arg N, affects subheadings N levels down.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
286 \\[hide-entry] make immediately following body invisible.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
287 \\[show-entry] make it visible.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
288 \\[hide-leaves] make body under heading and under its subheadings invisible.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
289 The subheadings remain visible.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
290 \\[show-branches] make all subheadings at all levels visible.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
291
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
292 The variable `outline-regexp' can be changed to control what is a heading.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
293 A line is a heading if `outline-regexp' matches something at the
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
294 beginning of the line. The longer the match, the deeper the level.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
295
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
296 Turning on outline mode calls the value of `text-mode-hook' and then of
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
297 `outline-mode-hook', if they are non-nil."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
298 (make-local-variable 'line-move-ignore-invisible)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
299 (setq line-move-ignore-invisible t)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
300 ;; Cause use of ellipses for invisible text.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
301 (add-to-invisibility-spec '(outline . t))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
302 (set (make-local-variable 'paragraph-start)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
303 (concat paragraph-start "\\|\\(?:" outline-regexp "\\)"))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
304 ;; Inhibit auto-filling of header lines.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
305 (set (make-local-variable 'auto-fill-inhibit-regexp) outline-regexp)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
306 (set (make-local-variable 'paragraph-separate)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
307 (concat paragraph-separate "\\|\\(?:" outline-regexp "\\)"))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
308 (set (make-local-variable 'font-lock-defaults)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
309 '(outline-font-lock-keywords t nil nil backward-paragraph))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
310 (setq imenu-generic-expression
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
311 (list (list nil (concat "^\\(?:" outline-regexp "\\).*$") 0)))
52070
318ea3203ba5 (outline-mode): Revert part of last patch (outline-mode already runs the hook).
Juanma Barranquero <lekktu@gmail.com>
parents: 52067
diff changeset
312 (add-hook 'change-major-mode-hook 'show-all nil t))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
313
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
314 (defcustom outline-minor-mode-prefix "\C-c@"
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
315 "*Prefix key to use for Outline commands in Outline minor mode.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
316 The value of this variable is checked as part of loading Outline mode.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
317 After that, changing the prefix key requires manipulating keymaps."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
318 :type 'string
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
319 :group 'outlines)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
320
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
321 ;;;###autoload
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
322 (define-minor-mode outline-minor-mode
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
323 "Toggle Outline minor mode.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
324 With arg, turn Outline minor mode on if arg is positive, off otherwise.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
325 See the command `outline-mode' for more information on this mode."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
326 nil " Outl" (list (cons [menu-bar] outline-minor-mode-menu-bar-map)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
327 (cons outline-minor-mode-prefix outline-mode-prefix-map))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
328 :group 'outlines
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
329 (if outline-minor-mode
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
330 (progn
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
331 ;; Turn off this mode if we change major modes.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
332 (add-hook 'change-major-mode-hook
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
333 (lambda () (outline-minor-mode -1))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
334 nil t)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
335 (set (make-local-variable 'line-move-ignore-invisible) t)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
336 ;; Cause use of ellipses for invisible text.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
337 (add-to-invisibility-spec '(outline . t)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
338 (setq line-move-ignore-invisible nil)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
339 ;; Cause use of ellipses for invisible text.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
340 (remove-from-invisibility-spec '(outline . t))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
341 ;; When turning off outline mode, get rid of any outline hiding.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
342 (show-all)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
343
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
344 (defvar outline-level 'outline-level
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
345 "*Function of no args to compute a header's nesting level in an outline.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
346 It can assume point is at the beginning of a header line and that the match
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
347 data reflects the `outline-regexp'.")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
348
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
349 (defvar outline-heading-alist ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
350 "Alist associating a heading for every possible level.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
351 Each entry is of the form (HEADING . LEVEL).
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
352 This alist is used two ways: to find the heading corresponding to
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
353 a given level and to find the level of a given heading.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
354 If a mode or document needs several sets of outline headings (for example
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
355 numbered and unnumbered sections), list them set by set and sorted by level
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
356 within each set. For example in texinfo mode:
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
357
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
358 (setq outline-heading-alist
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
359 '((\"@chapter\" . 2) (\"@section\" . 3) (\"@subsection\" . 4)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
360 (\"@subsubsection\" . 5)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
361 (\"@unnumbered\" . 2) (\"@unnumberedsec\" . 3)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
362 (\"@unnumberedsubsec\" . 4) (\"@unnumberedsubsubsec\" . 5)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
363 (\"@appendix\" . 2) (\"@appendixsec\" . 3)...
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
364 (\"@appendixsubsec\" . 4) (\"@appendixsubsubsec\" . 5) ..))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
365
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
366 Instead of sorting the entries in each set, you can also separate the
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
367 sets with nil.")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
368 (make-variable-buffer-local 'outline-heading-alist)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
369
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
370 ;; This used to count columns rather than characters, but that made ^L
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
371 ;; appear to be at level 2 instead of 1. Columns would be better for
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
372 ;; tab handling, but the default regexp doesn't use tabs, and anyone
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
373 ;; who changes the regexp can also redefine the outline-level variable
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
374 ;; as appropriate.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
375 (defun outline-level ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
376 "Return the depth to which a statement is nested in the outline.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
377 Point must be at the beginning of a header line.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
378 This is actually either the level specified in `outline-heading-alist'
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
379 or else the number of characters matched by `outline-regexp'."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
380 (or (cdr (assoc (match-string 0) outline-heading-alist))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
381 (- (match-end 0) (match-beginning 0))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
382
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
383 (defun outline-next-preface ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
384 "Skip forward to just before the next heading line.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
385 If there's no following heading line, stop before the newline
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
386 at the end of the buffer."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
387 (if (re-search-forward (concat "\n\\(?:" outline-regexp "\\)")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
388 nil 'move)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
389 (goto-char (match-beginning 0)))
55273
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
390 (if (and (bolp) (or outline-blank-line (eobp)) (not (bobp)))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
391 (forward-char -1)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
392
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
393 (defun outline-next-heading ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
394 "Move to the next (possibly invisible) heading line."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
395 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
396 ;; Make sure we don't match the heading we're at.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
397 (if (and (bolp) (not (eobp))) (forward-char 1))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
398 (if (re-search-forward (concat "^\\(?:" outline-regexp "\\)")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
399 nil 'move)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
400 (goto-char (match-beginning 0))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
401
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
402 (defun outline-previous-heading ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
403 "Move to the previous (possibly invisible) heading line."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
404 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
405 (re-search-backward (concat "^\\(?:" outline-regexp "\\)")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
406 nil 'move))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
407
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
408 (defsubst outline-invisible-p (&optional pos)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
409 "Non-nil if the character after point is invisible."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
410 (get-char-property (or pos (point)) 'invisible))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
411
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
412 (defun outline-visible ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
413 (not (outline-invisible-p)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
414 (make-obsolete 'outline-visible 'outline-invisible-p)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
415
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
416 (defun outline-back-to-heading (&optional invisible-ok)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
417 "Move to previous heading line, or beg of this line if it's a heading.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
418 Only visible heading lines are considered, unless INVISIBLE-OK is non-nil."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
419 (beginning-of-line)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
420 (or (outline-on-heading-p invisible-ok)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
421 (let (found)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
422 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
423 (while (not found)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
424 (or (re-search-backward (concat "^\\(?:" outline-regexp "\\)")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
425 nil t)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
426 (error "before first heading"))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
427 (setq found (and (or invisible-ok (not (outline-invisible-p)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
428 (point)))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
429 (goto-char found)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
430 found)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
431
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
432 (defun outline-on-heading-p (&optional invisible-ok)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
433 "Return t if point is on a (visible) heading line.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
434 If INVISIBLE-OK is non-nil, an invisible heading line is ok too."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
435 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
436 (beginning-of-line)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
437 (and (bolp) (or invisible-ok (not (outline-invisible-p)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
438 (looking-at outline-regexp))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
439
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
440 (defun outline-insert-heading ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
441 "Insert a new heading at same depth at point."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
442 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
443 (let ((head (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
444 (condition-case nil
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
445 (outline-back-to-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
446 (error (outline-next-heading)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
447 (if (eobp)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
448 (or (caar outline-heading-alist) "")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
449 (match-string 0)))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
450 (unless (or (string-match "[ \t]\\'" head)
53648
cb1748b5a52b (outline-insert-heading): Tighten up match.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
451 (not (string-match (concat "\\`\\(?:" outline-regexp "\\)")
cb1748b5a52b (outline-insert-heading): Tighten up match.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
452 (concat head " "))))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
453 (setq head (concat head " ")))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
454 (unless (bolp) (end-of-line) (newline))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
455 (insert head)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
456 (unless (eolp)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
457 (save-excursion (newline-and-indent)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
458 (run-hooks 'outline-insert-heading-hook)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
459
65158
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
460 (defun outline-invent-heading (head up)
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
461 (save-match-data
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
462 ;; Let's try to invent one by repeating or deleting the last char.
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
463 (let ((new-head (if up (substring head 0 -1)
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
464 (concat head (substring head -1)))))
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
465 (if (string-match (concat "\\`\\(?:" outline-regexp "\\)")
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
466 new-head)
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
467 ;; Why bother checking that it is indeed higher/lower level ?
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
468 new-head
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
469 ;; Didn't work, so ask what to do.
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
470 (read-string (format "%s heading for `%s': "
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
471 (if up "Parent" "Demoted") head)
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
472 head nil nil t)))))
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
473
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
474 (defun outline-promote (&optional children)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
475 "Promote headings higher up the tree.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
476 If prefix argument CHILDREN is given, promote also all the children.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
477 If the region is active in `transient-mark-mode', promote all headings
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
478 in the region."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
479 (interactive
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
480 (list (if (and transient-mark-mode mark-active) 'region
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
481 (outline-back-to-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
482 (if current-prefix-arg nil 'subtree))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
483 (cond
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
484 ((eq children 'region)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
485 (outline-map-region 'outline-promote (region-beginning) (region-end)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
486 (children
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
487 (outline-map-region 'outline-promote
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
488 (point)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
489 (save-excursion (outline-get-next-sibling) (point))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
490 (t
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
491 (outline-back-to-heading t)
65147
c5c1bf7f3c59 (outline-promote): Try shortening the heading.
Richard M. Stallman <rms@gnu.org>
parents: 64762
diff changeset
492 (let* ((head (match-string-no-properties 0))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
493 (level (save-match-data (funcall outline-level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
494 (up-head (or (outline-head-from-level (1- level) head)
65147
c5c1bf7f3c59 (outline-promote): Try shortening the heading.
Richard M. Stallman <rms@gnu.org>
parents: 64762
diff changeset
495 ;; Use the parent heading, if it is really
c5c1bf7f3c59 (outline-promote): Try shortening the heading.
Richard M. Stallman <rms@gnu.org>
parents: 64762
diff changeset
496 ;; one level less.
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
497 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
498 (save-match-data
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
499 (outline-up-heading 1 t)
65147
c5c1bf7f3c59 (outline-promote): Try shortening the heading.
Richard M. Stallman <rms@gnu.org>
parents: 64762
diff changeset
500 (and (= (1- level) (funcall outline-level))
c5c1bf7f3c59 (outline-promote): Try shortening the heading.
Richard M. Stallman <rms@gnu.org>
parents: 64762
diff changeset
501 (match-string-no-properties 0))))
65158
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
502 ;; Bummer!! There is no lower level heading.
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
503 (outline-invent-heading head 'up))))
52067
36323dc1a2ac (outline-mode-hook): Define it.
Juanma Barranquero <lekktu@gmail.com>
parents: 51347
diff changeset
504
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
505 (unless (rassoc level outline-heading-alist)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
506 (push (cons head level) outline-heading-alist))
52067
36323dc1a2ac (outline-mode-hook): Define it.
Juanma Barranquero <lekktu@gmail.com>
parents: 51347
diff changeset
507
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
508 (replace-match up-head nil t)))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
509
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
510 (defun outline-demote (&optional children)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
511 "Demote headings lower down the tree.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
512 If prefix argument CHILDREN is given, demote also all the children.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
513 If the region is active in `transient-mark-mode', demote all headings
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
514 in the region."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
515 (interactive
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
516 (list (if (and transient-mark-mode mark-active) 'region
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
517 (outline-back-to-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
518 (if current-prefix-arg nil 'subtree))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
519 (cond
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
520 ((eq children 'region)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
521 (outline-map-region 'outline-demote (region-beginning) (region-end)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
522 (children
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
523 (outline-map-region 'outline-demote
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
524 (point)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
525 (save-excursion (outline-get-next-sibling) (point))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
526 (t
65147
c5c1bf7f3c59 (outline-promote): Try shortening the heading.
Richard M. Stallman <rms@gnu.org>
parents: 64762
diff changeset
527 (let* ((head (match-string-no-properties 0))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
528 (level (save-match-data (funcall outline-level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
529 (down-head
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
530 (or (outline-head-from-level (1+ level) head)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
531 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
532 (save-match-data
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
533 (while (and (progn (outline-next-heading) (not (eobp)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
534 (<= (funcall outline-level) level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
535 (when (eobp)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
536 ;; Try again from the beginning of the buffer.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
537 (goto-char (point-min))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
538 (while (and (progn (outline-next-heading) (not (eobp)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
539 (<= (funcall outline-level) level))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
540 (unless (eobp)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
541 (looking-at outline-regexp)
65147
c5c1bf7f3c59 (outline-promote): Try shortening the heading.
Richard M. Stallman <rms@gnu.org>
parents: 64762
diff changeset
542 (match-string-no-properties 0))))
65158
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
543 ;; Bummer!! There is no higher-level heading in the buffer.
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
544 (outline-invent-heading head nil))))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
545
65147
c5c1bf7f3c59 (outline-promote): Try shortening the heading.
Richard M. Stallman <rms@gnu.org>
parents: 64762
diff changeset
546 (unless (rassoc level outline-heading-alist)
c5c1bf7f3c59 (outline-promote): Try shortening the heading.
Richard M. Stallman <rms@gnu.org>
parents: 64762
diff changeset
547 (push (cons head level) outline-heading-alist))
c5c1bf7f3c59 (outline-promote): Try shortening the heading.
Richard M. Stallman <rms@gnu.org>
parents: 64762
diff changeset
548 (replace-match down-head nil t)))))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
549
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
550 (defun outline-head-from-level (level head &optional alist)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
551 "Get new heading with level LEVEL from ALIST.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
552 If there are no such entries, return nil.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
553 ALIST defaults to `outline-heading-alist'.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
554 Similar to (car (rassoc LEVEL ALIST)).
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
555 If there are several different entries with same new level, choose
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
556 the one with the smallest distance to the assocation of HEAD in the alist.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
557 This makes it possible for promotion to work in modes with several
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
558 independent sets of headings (numbered, unnumbered, appendix...)"
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
559 (unless alist (setq alist outline-heading-alist))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
560 (let ((l (rassoc level alist))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
561 ll h hl l2 l2l)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
562 (cond
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
563 ((null l) nil)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
564 ;; If there's no HEAD after L, any other entry for LEVEL after L
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
565 ;; can't be much better than L.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
566 ((null (setq h (assoc head (setq ll (memq l alist))))) (car l))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
567 ;; If there's no other entry for LEVEL, just keep L.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
568 ((null (setq l2 (rassoc level (cdr ll)))) (car l))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
569 ;; Now we have L, L2, and H: see if L2 seems better than L.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
570 ;; If H is after L2, L2 is better.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
571 ((memq h (setq l2l (memq l2 (cdr ll))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
572 (outline-head-from-level level head l2l))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
573 ;; Now we have H between L and L2.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
574 ;; If there's a separator between L and H, prefer L2.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
575 ((memq h (memq nil ll))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
576 (outline-head-from-level level head l2l))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
577 ;; If there's a separator between L2 and H, prefer L.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
578 ((memq l2 (memq nil (setq hl (memq h ll)))) (car l))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
579 ;; No separator between L and L2, check the distance.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
580 ((< (* 2 (length hl)) (+ (length ll) (length l2l)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
581 (outline-head-from-level level head l2l))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
582 ;; If all else fails, just keep L.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
583 (t (car l)))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
584
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
585 (defun outline-map-region (fun beg end)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
586 "Call FUN for every heading between BEG and END.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
587 When FUN is called, point is at the beginning of the heading and
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
588 the match data is set appropriately."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
589 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
590 (setq end (copy-marker end))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
591 (goto-char beg)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
592 (when (re-search-forward (concat "^\\(?:" outline-regexp "\\)") end t)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
593 (goto-char (match-beginning 0))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
594 (funcall fun)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
595 (while (and (progn
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
596 (outline-next-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
597 (< (point) end))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
598 (not (eobp)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
599 (funcall fun)))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
600
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
601 ;; Vertical tree motion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
602
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
603 (defun outline-move-subtree-up (&optional arg)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
604 "Move the currrent subtree up past ARG headlines of the same level."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
605 (interactive "p")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
606 (outline-move-subtree-down (- arg)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
607
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
608 (defun outline-move-subtree-down (&optional arg)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
609 "Move the currrent subtree down past ARG headlines of the same level."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
610 (interactive "p")
65158
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
611 (let ((movfunc (if (> arg 0) 'outline-get-next-sibling
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
612 'outline-get-last-sibling))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
613 (ins-point (make-marker))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
614 (cnt (abs arg))
65158
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
615 beg end folded)
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
616 ;; Select the tree
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
617 (outline-back-to-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
618 (setq beg (point))
52067
36323dc1a2ac (outline-mode-hook): Define it.
Juanma Barranquero <lekktu@gmail.com>
parents: 51347
diff changeset
619 (save-match-data
36323dc1a2ac (outline-mode-hook): Define it.
Juanma Barranquero <lekktu@gmail.com>
parents: 51347
diff changeset
620 (save-excursion (outline-end-of-heading)
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
621 (setq folded (outline-invisible-p)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
622 (outline-end-of-subtree))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
623 (if (= (char-after) ?\n) (forward-char 1))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
624 (setq end (point))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
625 ;; Find insertion point, with error handling
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
626 (goto-char beg)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
627 (while (> cnt 0)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
628 (or (funcall movfunc)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
629 (progn (goto-char beg)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
630 (error "Cannot move past superior level")))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
631 (setq cnt (1- cnt)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
632 (if (> arg 0)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
633 ;; Moving forward - still need to move over subtree
52067
36323dc1a2ac (outline-mode-hook): Define it.
Juanma Barranquero <lekktu@gmail.com>
parents: 51347
diff changeset
634 (progn (outline-end-of-subtree)
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
635 (if (= (char-after) ?\n) (forward-char 1))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
636 (move-marker ins-point (point))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
637 (insert (delete-and-extract-region beg end))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
638 (goto-char ins-point)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
639 (if folded (hide-subtree))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
640 (move-marker ins-point nil)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
641
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
642 (defun outline-end-of-heading ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
643 (if (re-search-forward outline-heading-end-regexp nil 'move)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
644 (forward-char -1)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
645
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
646 (defun outline-next-visible-heading (arg)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
647 "Move to the next visible heading line.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
648 With argument, repeats or can move backward if negative.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
649 A heading line is one that starts with a `*' (or that
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
650 `outline-regexp' matches)."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
651 (interactive "p")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
652 (if (< arg 0)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
653 (beginning-of-line)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
654 (end-of-line))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
655 (while (and (not (bobp)) (< arg 0))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
656 (while (and (not (bobp))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
657 (re-search-backward (concat "^\\(?:" outline-regexp "\\)")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
658 nil 'move)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
659 (outline-invisible-p)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
660 (setq arg (1+ arg)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
661 (while (and (not (eobp)) (> arg 0))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
662 (while (and (not (eobp))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
663 (re-search-forward (concat "^\\(?:" outline-regexp "\\)")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
664 nil 'move)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
665 (outline-invisible-p (match-beginning 0))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
666 (setq arg (1- arg)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
667 (beginning-of-line))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
668
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
669 (defun outline-previous-visible-heading (arg)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
670 "Move to the previous heading line.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
671 With argument, repeats or can move forward if negative.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
672 A heading line is one that starts with a `*' (or that
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
673 `outline-regexp' matches)."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
674 (interactive "p")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
675 (outline-next-visible-heading (- arg)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
676
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
677 (defun outline-mark-subtree ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
678 "Mark the current subtree in an outlined document.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
679 This puts point at the start of the current subtree, and mark at the end."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
680 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
681 (let ((beg))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
682 (if (outline-on-heading-p)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
683 ;; we are already looking at a heading
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
684 (beginning-of-line)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
685 ;; else go back to previous heading
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
686 (outline-previous-visible-heading 1))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
687 (setq beg (point))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
688 (outline-end-of-subtree)
65842
6b4c115f4d14 (outline-mark-subtree): Activate the mark.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65294
diff changeset
689 (push-mark (point) nil t)
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
690 (goto-char beg)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
691
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
692
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
693 (put 'outline 'reveal-toggle-invisible 'outline-reveal-toggle-invisible)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
694 (defun outline-flag-region (from to flag)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
695 "Hide or show lines from FROM to TO, according to FLAG.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
696 If FLAG is nil then text is shown, while if FLAG is t the text is hidden."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
697 (remove-overlays from to 'invisible 'outline)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
698 (when flag
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
699 (let ((o (make-overlay from to)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
700 (overlay-put o 'invisible 'outline)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
701 (overlay-put o 'isearch-open-invisible 'outline-isearch-open-invisible)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
702 ;; Seems only used by lazy-lock. I.e. obsolete.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
703 (run-hooks 'outline-view-change-hook))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
704
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
705 (defun outline-reveal-toggle-invisible (o hidep)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
706 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
707 (goto-char (overlay-start o))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
708 (if hidep
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
709 ;; When hiding the area again, we could just clean it up and let
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
710 ;; reveal do the rest, by simply doing:
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
711 ;; (remove-overlays (overlay-start o) (overlay-end o)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
712 ;; 'invisible 'outline)
52067
36323dc1a2ac (outline-mode-hook): Define it.
Juanma Barranquero <lekktu@gmail.com>
parents: 51347
diff changeset
713 ;;
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
714 ;; That works fine as long as everything is in sync, but if the
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
715 ;; structure of the document is changed while revealing parts of it,
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
716 ;; the resulting behavior can be ugly. I.e. we need to make
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
717 ;; sure that we hide exactly a subtree.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
718 (progn
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
719 (let ((end (overlay-end o)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
720 (delete-overlay o)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
721 (while (progn
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
722 (hide-subtree)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
723 (outline-next-visible-heading 1)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
724 (and (not (eobp)) (< (point) end))))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
725
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
726 ;; When revealing, we just need to reveal sublevels. If point is
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
727 ;; inside one of the sublevels, reveal will call us again.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
728 ;; But we need to preserve the original overlay.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
729 (let ((o1 (copy-overlay o)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
730 (overlay-put o 'invisible nil) ;Show (most of) the text.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
731 (while (progn
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
732 (show-entry)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
733 (show-children)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
734 ;; Normally just the above is needed.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
735 ;; But in odd cases, the above might fail to show anything.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
736 ;; To avoid an infinite loop, we have to make sure that
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
737 ;; *something* gets shown.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
738 (and (equal (overlay-start o) (overlay-start o1))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
739 (< (point) (overlay-end o))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
740 (= 0 (forward-line 1)))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
741 ;; If still nothing was shown, just kill the damn thing.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
742 (when (equal (overlay-start o) (overlay-start o1))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
743 ;; I've seen it happen at the end of buffer.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
744 (delete-overlay o1))))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
745
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
746 ;; Function to be set as an outline-isearch-open-invisible' property
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
747 ;; to the overlay that makes the outline invisible (see
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
748 ;; `outline-flag-region').
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
749 (defun outline-isearch-open-invisible (overlay)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
750 ;; We rely on the fact that isearch places point on the matched text.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
751 (show-entry))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
752
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
753 (defun hide-entry ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
754 "Hide the body directly following this heading."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
755 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
756 (save-excursion
65214
aefa34357e06 (hide-entry, hide-leaves, outline-toggle-children):
Juri Linkov <juri@jurta.org>
parents: 65158
diff changeset
757 (outline-back-to-heading)
55228
53c5c7a2f4a8 (outline-next-preface, outline-show-heading): Don't leave unhidden blank line before heading.
Juri Linkov <juri@jurta.org>
parents: 53648
diff changeset
758 (outline-end-of-heading)
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
759 (outline-flag-region (point) (progn (outline-next-preface) (point)) t)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
760
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
761 (defun show-entry ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
762 "Show the body directly following this heading.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
763 Show the heading too, if it is currently invisible."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
764 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
765 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
766 (outline-back-to-heading t)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
767 (outline-flag-region (1- (point))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
768 (progn (outline-next-preface) (point)) nil)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
769
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
770 (defun hide-body ()
57974
be8ba6e58a49 (hide-body): Don't hide lines at the top of the file
Eli Zaretskii <eliz@gnu.org>
parents: 57527
diff changeset
771 "Hide all body lines in buffer, leaving all headings visible."
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
772 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
773 (hide-region-body (point-min) (point-max)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
774
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
775 (defun hide-region-body (start end)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
776 "Hide all body lines in the region, but not headings."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
777 ;; Nullify the hook to avoid repeated calls to `outline-flag-region'
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
778 ;; wasting lots of time running `lazy-lock-fontify-after-outline'
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
779 ;; and run the hook finally.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
780 (let (outline-view-change-hook)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
781 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
782 (save-restriction
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
783 (narrow-to-region start end)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
784 (goto-char (point-min))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
785 (if (outline-on-heading-p)
57974
be8ba6e58a49 (hide-body): Don't hide lines at the top of the file
Eli Zaretskii <eliz@gnu.org>
parents: 57527
diff changeset
786 (outline-end-of-heading)
be8ba6e58a49 (hide-body): Don't hide lines at the top of the file
Eli Zaretskii <eliz@gnu.org>
parents: 57527
diff changeset
787 (outline-next-preface))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
788 (while (not (eobp))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
789 (outline-flag-region (point)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
790 (progn (outline-next-preface) (point)) t)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
791 (unless (eobp)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
792 (forward-char (if (looking-at "\n\n") 2 1))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
793 (outline-end-of-heading))))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
794 (run-hooks 'outline-view-change-hook))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
795
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
796 (defun show-all ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
797 "Show all of the text in the buffer."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
798 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
799 (outline-flag-region (point-min) (point-max) nil))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
800
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
801 (defun hide-subtree ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
802 "Hide everything after this heading at deeper levels."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
803 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
804 (outline-flag-subtree t))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
805
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
806 (defun hide-leaves ()
68269
4747977f1afa (hide-leaves): Don't call outline-end-of-heading.
Richard M. Stallman <rms@gnu.org>
parents: 65842
diff changeset
807 "Hide the body after this heading and at deeper levels."
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
808 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
809 (save-excursion
65214
aefa34357e06 (hide-entry, hide-leaves, outline-toggle-children):
Juri Linkov <juri@jurta.org>
parents: 65158
diff changeset
810 (outline-back-to-heading)
68279
fae5d0cc2b1d Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 68269
diff changeset
811 ;; Turned off to fix bug reported by Otto Maddox on 22 Nov 2005.
68269
4747977f1afa (hide-leaves): Don't call outline-end-of-heading.
Richard M. Stallman <rms@gnu.org>
parents: 65842
diff changeset
812 ;; (outline-end-of-heading)
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
813 (hide-region-body (point) (progn (outline-end-of-subtree) (point)))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
814
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
815 (defun show-subtree ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
816 "Show everything after this heading at deeper levels."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
817 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
818 (outline-flag-subtree nil))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
819
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
820 (defun outline-show-heading ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
821 "Show the current heading and move to its end."
55273
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
822 (outline-flag-region (- (point)
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
823 (if (bobp) 0
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
824 (if (and outline-blank-line
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
825 (eq (char-before (1- (point))) ?\n))
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
826 2 1)))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
827 (progn (outline-end-of-heading) (point))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
828 nil))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
829
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
830 (defun hide-sublevels (levels)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
831 "Hide everything but the top LEVELS levels of headers, in whole buffer."
69297
c379d6c262b1 (hide-sublevels): Provide better interactive default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
832 (interactive (list
c379d6c262b1 (hide-sublevels): Provide better interactive default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
833 (cond
c379d6c262b1 (hide-sublevels): Provide better interactive default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
834 (current-prefix-arg (prefix-numeric-value current-prefix-arg))
c379d6c262b1 (hide-sublevels): Provide better interactive default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
835 ((save-excursion (beginning-of-line)
c379d6c262b1 (hide-sublevels): Provide better interactive default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
836 (looking-at outline-regexp))
c379d6c262b1 (hide-sublevels): Provide better interactive default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
837 (funcall outline-level))
c379d6c262b1 (hide-sublevels): Provide better interactive default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
838 (t 1))))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
839 (if (< levels 1)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
840 (error "Must keep at least one level of headers"))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
841 (let (outline-view-change-hook)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
842 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
843 (goto-char (point-min))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
844 ;; Skip the prelude, if any.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
845 (unless (outline-on-heading-p t) (outline-next-heading))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
846 ;; First hide everything.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
847 (outline-flag-region (point) (point-max) t)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
848 ;; Then unhide the top level headers.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
849 (outline-map-region
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
850 (lambda ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
851 (if (<= (funcall outline-level) levels)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
852 (outline-show-heading)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
853 (point) (point-max))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
854 (run-hooks 'outline-view-change-hook))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
855
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
856 (defun hide-other ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
857 "Hide everything except current body and parent and top-level headings."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
858 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
859 (hide-sublevels 1)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
860 (let (outline-view-change-hook)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
861 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
862 (outline-back-to-heading t)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
863 (show-entry)
57527
21785c190853 (hide-other): Call outline-up-heading with INVISIBLE-OK=t.
Richard M. Stallman <rms@gnu.org>
parents: 55273
diff changeset
864 (while (condition-case nil (progn (outline-up-heading 1 t) (not (bobp)))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
865 (error nil))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
866 (outline-flag-region (1- (point))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
867 (save-excursion (forward-line 1) (point))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
868 nil))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
869 (run-hooks 'outline-view-change-hook))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
870
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
871 (defun outline-toggle-children ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
872 "Show or hide the current subtree depending on its current state."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
873 (interactive)
65214
aefa34357e06 (hide-entry, hide-leaves, outline-toggle-children):
Juri Linkov <juri@jurta.org>
parents: 65158
diff changeset
874 (save-excursion
aefa34357e06 (hide-entry, hide-leaves, outline-toggle-children):
Juri Linkov <juri@jurta.org>
parents: 65158
diff changeset
875 (outline-back-to-heading)
aefa34357e06 (hide-entry, hide-leaves, outline-toggle-children):
Juri Linkov <juri@jurta.org>
parents: 65158
diff changeset
876 (if (not (outline-invisible-p (line-end-position)))
aefa34357e06 (hide-entry, hide-leaves, outline-toggle-children):
Juri Linkov <juri@jurta.org>
parents: 65158
diff changeset
877 (hide-subtree)
aefa34357e06 (hide-entry, hide-leaves, outline-toggle-children):
Juri Linkov <juri@jurta.org>
parents: 65158
diff changeset
878 (show-children)
aefa34357e06 (hide-entry, hide-leaves, outline-toggle-children):
Juri Linkov <juri@jurta.org>
parents: 65158
diff changeset
879 (show-entry))))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
880
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
881 (defun outline-flag-subtree (flag)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
882 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
883 (outline-back-to-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
884 (outline-end-of-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
885 (outline-flag-region (point)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
886 (progn (outline-end-of-subtree) (point))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
887 flag)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
888
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
889 (defun outline-end-of-subtree ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
890 (outline-back-to-heading)
65158
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
891 (let ((first t)
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
892 (level (funcall outline-level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
893 (while (and (not (eobp))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
894 (or first (> (funcall outline-level) level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
895 (setq first nil)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
896 (outline-next-heading))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
897 (if (bolp)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
898 (progn
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
899 ;; Go to end of line before heading
55273
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
900 (forward-char -1)
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
901 (if (and outline-blank-line (bolp))
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
902 ;; leave blank line before heading
8362eef794e3 (outline-blank-line): New var.
Juri Linkov <juri@jurta.org>
parents: 55228
diff changeset
903 (forward-char -1))))))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
904
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
905 (defun show-branches ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
906 "Show all subheadings of this heading, but not their bodies."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
907 (interactive)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
908 (show-children 1000))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
909
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
910 (defun show-children (&optional level)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
911 "Show all direct subheadings of this heading.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
912 Prefix arg LEVEL is how many levels below the current level should be shown.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
913 Default is enough to cause the following heading to appear."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
914 (interactive "P")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
915 (setq level
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
916 (if level (prefix-numeric-value level)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
917 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
918 (outline-back-to-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
919 (let ((start-level (funcall outline-level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
920 (outline-next-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
921 (if (eobp)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
922 1
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
923 (max 1 (- (funcall outline-level) start-level)))))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
924 (let (outline-view-change-hook)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
925 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
926 (outline-back-to-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
927 (setq level (+ level (funcall outline-level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
928 (outline-map-region
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
929 (lambda ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
930 (if (<= (funcall outline-level) level)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
931 (outline-show-heading)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
932 (point)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
933 (progn (outline-end-of-subtree)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
934 (if (eobp) (point-max) (1+ (point)))))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
935 (run-hooks 'outline-view-change-hook))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
936
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
937
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
938
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
939 (defun outline-up-heading (arg &optional invisible-ok)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
940 "Move to the visible heading line of which the present line is a subheading.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
941 With argument, move up ARG levels.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
942 If INVISIBLE-OK is non-nil, also consider invisible lines."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
943 (interactive "p")
55228
53c5c7a2f4a8 (outline-next-preface, outline-show-heading): Don't leave unhidden blank line before heading.
Juri Linkov <juri@jurta.org>
parents: 53648
diff changeset
944 (and (eq this-command 'outline-up-heading)
53c5c7a2f4a8 (outline-next-preface, outline-show-heading): Don't leave unhidden blank line before heading.
Juri Linkov <juri@jurta.org>
parents: 53648
diff changeset
945 (or (eq last-command 'outline-up-heading) (push-mark)))
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
946 (outline-back-to-heading invisible-ok)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
947 (let ((start-level (funcall outline-level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
948 (if (eq start-level 1)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
949 (error "Already at top level of the outline"))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
950 (while (and (> start-level 1) (> arg 0) (not (bobp)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
951 (let ((level start-level))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
952 (while (not (or (< level start-level) (bobp)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
953 (if invisible-ok
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
954 (outline-previous-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
955 (outline-previous-visible-heading 1))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
956 (setq level (funcall outline-level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
957 (setq start-level level))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
958 (setq arg (- arg 1))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
959 (looking-at outline-regexp))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
960
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
961 (defun outline-forward-same-level (arg)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
962 "Move forward to the ARG'th subheading at same level as this one.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
963 Stop at the first and last subheadings of a superior heading."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
964 (interactive "p")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
965 (outline-back-to-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
966 (while (> arg 0)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
967 (let ((point-to-move-to (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
968 (outline-get-next-sibling))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
969 (if point-to-move-to
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
970 (progn
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
971 (goto-char point-to-move-to)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
972 (setq arg (1- arg)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
973 (progn
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
974 (setq arg 0)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
975 (error "No following same-level heading"))))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
976
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
977 (defun outline-get-next-sibling ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
978 "Move to next heading of the same level, and return point or nil if none."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
979 (let ((level (funcall outline-level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
980 (outline-next-visible-heading 1)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
981 (while (and (not (eobp)) (> (funcall outline-level) level))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
982 (outline-next-visible-heading 1))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
983 (if (or (eobp) (< (funcall outline-level) level))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
984 nil
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
985 (point))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
986
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
987 (defun outline-backward-same-level (arg)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
988 "Move backward to the ARG'th subheading at same level as this one.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
989 Stop at the first and last subheadings of a superior heading."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
990 (interactive "p")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
991 (outline-back-to-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
992 (while (> arg 0)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
993 (let ((point-to-move-to (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
994 (outline-get-last-sibling))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
995 (if point-to-move-to
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
996 (progn
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
997 (goto-char point-to-move-to)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
998 (setq arg (1- arg)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
999 (progn
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1000 (setq arg 0)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1001 (error "No previous same-level heading"))))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1002
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1003 (defun outline-get-last-sibling ()
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1004 "Move to previous heading of the same level, and return point or nil if none."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1005 (let ((level (funcall outline-level)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1006 (outline-previous-visible-heading 1)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1007 (while (and (> (funcall outline-level) level)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1008 (not (bobp)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1009 (outline-previous-visible-heading 1))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1010 (if (< (funcall outline-level) level)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1011 nil
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1012 (point))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1013
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1014 (defun outline-headers-as-kill (beg end)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1015 "Save the visible outline headers in region at the start of the kill ring.
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1016
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1017 Text shown between the headers isn't copied. Two newlines are
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1018 inserted between saved headers. Yanking the result may be a
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1019 convenient way to make a table of contents of the buffer."
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1020 (interactive "r")
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1021 (save-excursion
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1022 (save-restriction
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1023 (narrow-to-region beg end)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1024 (goto-char (point-min))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1025 (let ((buffer (current-buffer))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1026 start end)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1027 (with-temp-buffer
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1028 (with-current-buffer buffer
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1029 ;; Boundary condition: starting on heading:
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1030 (when (outline-on-heading-p)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1031 (outline-back-to-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1032 (setq start (point)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1033 end (progn (outline-end-of-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1034 (point)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1035 (insert-buffer-substring buffer start end)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1036 (insert "\n\n")))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1037 (let ((temp-buffer (current-buffer)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1038 (with-current-buffer buffer
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1039 (while (outline-next-heading)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1040 (unless (outline-invisible-p)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1041 (setq start (point)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1042 end (progn (outline-end-of-heading) (point)))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1043 (with-current-buffer temp-buffer
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1044 (insert-buffer-substring buffer start end)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1045 (insert "\n\n"))))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1046 (kill-new (buffer-string)))))))
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1047
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1048 (provide 'outline)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1049 (provide 'noutline)
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1050
65158
1dc0c9b5d66a (outline-invent-heading): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 65147
diff changeset
1051 ;; arch-tag: 1724410e-7d4d-4f46-b801-49e18171e874
51347
b21cc59624cf Moved from textmodes/.
Juanma Barranquero <lekktu@gmail.com>
parents:
diff changeset
1052 ;;; outline.el ends here