annotate lisp/outline.el @ 56905:661d52db56de

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