]> code.delx.au - gnu-emacs/blobdiff - lisp/textmodes/ooutline.el
(outline-minor-mode): Use force-mode-line-update.
[gnu-emacs] / lisp / textmodes / ooutline.el
index 0c60cfe30bda54921dfa467d67f4700ee5c6aa2f..e3752c6c75ce61aae71058cd689da86c13ec582a 100644 (file)
@@ -2,6 +2,7 @@
 ;; Copyright (C) 1986, 1993, 1994 Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
+;; Keywords: outlines
 
 ;; This file is part of GNU Emacs.
 
@@ -47,72 +48,85 @@ regexp is searched for.  The heading ends at the end of the match.
 The recommended way to set this is with a \"Local Variables:\" list
 in the file it applies to.")
 
-(defvar outline-mode-map nil "")
+(defvar outline-mode-prefix-map nil)
 
-(if outline-mode-map
+(if outline-mode-prefix-map
     nil
-  (setq outline-mode-map (nconc (make-sparse-keymap) text-mode-map))
-  (define-key outline-mode-map "\C-c\C-n" 'outline-next-visible-heading)
-  (define-key outline-mode-map "\C-c\C-p" 'outline-previous-visible-heading)
-  (define-key outline-mode-map "\C-c\C-i" 'show-children)
-  (define-key outline-mode-map "\C-c\C-s" 'show-subtree)
-  (define-key outline-mode-map "\C-c\C-d" 'hide-subtree)
-  (define-key outline-mode-map "\C-c\C-u" 'outline-up-heading)
-  (define-key outline-mode-map "\C-c\C-f" 'outline-forward-same-level)
-  (define-key outline-mode-map "\C-c\C-b" 'outline-backward-same-level)
-  (define-key outline-mode-map "\C-c\C-t" 'hide-body)
-  (define-key outline-mode-map "\C-c\C-a" 'show-all)
-  (define-key outline-mode-map "\C-c\C-c" 'hide-entry)
-  (define-key outline-mode-map "\C-c\C-e" 'show-entry)
-  (define-key outline-mode-map "\C-c\C-l" 'hide-leaves)
-  (define-key outline-mode-map "\C-c\C-k" 'show-branches)
-  (define-key outline-mode-map "\C-c\C-q" 'hide-sublevels)
-  (define-key outline-mode-map "\C-c\C-o" 'hide-other)
-
-  (define-key outline-mode-map [menu-bar hide]
+  (setq outline-mode-prefix-map (make-sparse-keymap))
+  (define-key outline-mode-prefix-map "\C-n" 'outline-next-visible-heading)
+  (define-key outline-mode-prefix-map "\C-p" 'outline-previous-visible-heading)
+  (define-key outline-mode-prefix-map "\C-i" 'show-children)
+  (define-key outline-mode-prefix-map "\C-s" 'show-subtree)
+  (define-key outline-mode-prefix-map "\C-d" 'hide-subtree)
+  (define-key outline-mode-prefix-map "\C-u" 'outline-up-heading)
+  (define-key outline-mode-prefix-map "\C-f" 'outline-forward-same-level)
+  (define-key outline-mode-prefix-map "\C-b" 'outline-backward-same-level)
+  (define-key outline-mode-prefix-map "\C-t" 'hide-body)
+  (define-key outline-mode-prefix-map "\C-a" 'show-all)
+  (define-key outline-mode-prefix-map "\C-c" 'hide-entry)
+  (define-key outline-mode-prefix-map "\C-e" 'show-entry)
+  (define-key outline-mode-prefix-map "\C-l" 'hide-leaves)
+  (define-key outline-mode-prefix-map "\C-k" 'show-branches)
+  (define-key outline-mode-prefix-map "\C-q" 'hide-sublevels)
+  (define-key outline-mode-prefix-map "\C-o" 'hide-other))
+
+(defvar outline-mode-menu-bar-map nil)
+(if outline-mode-menu-bar-map
+    nil
+  (setq outline-mode-menu-bar-map (make-sparse-keymap))
+
+  (define-key outline-mode-menu-bar-map [hide]
     (cons "Hide" (make-sparse-keymap "Hide")))
 
-  (define-key outline-mode-map [menu-bar hide hide-other]
+  (define-key outline-mode-menu-bar-map [hide hide-other]
     '("Hide Other" . hide-other))
-  (define-key outline-mode-map [menu-bar hide hide-sublevels]
+  (define-key outline-mode-menu-bar-map [hide hide-sublevels]
     '("Hide Sublevels" . hide-sublevels))
-  (define-key outline-mode-map [menu-bar hide hide-subtree]
+  (define-key outline-mode-menu-bar-map [hide hide-subtree]
     '("Hide Subtree" . hide-subtree))
-  (define-key outline-mode-map [menu-bar hide hide-entry]
+  (define-key outline-mode-menu-bar-map [hide hide-entry]
     '("Hide Entry" . hide-entry))
-  (define-key outline-mode-map [menu-bar hide hide-body]
+  (define-key outline-mode-menu-bar-map [hide hide-body]
     '("Hide Body" . hide-body))
-  (define-key outline-mode-map [menu-bar hide hide-leaves]
+  (define-key outline-mode-menu-bar-map [hide hide-leaves]
     '("Hide Leaves" . hide-leaves))
 
-  (define-key outline-mode-map [menu-bar show]
+  (define-key outline-mode-menu-bar-map [show]
     (cons "Show" (make-sparse-keymap "Show")))
 
-  (define-key outline-mode-map [menu-bar show show-subtree]
+  (define-key outline-mode-menu-bar-map [show show-subtree]
     '("Show Subtree" . show-subtree))
-  (define-key outline-mode-map [menu-bar show show-children]
+  (define-key outline-mode-menu-bar-map [show show-children]
     '("Show Children" . show-children))
-  (define-key outline-mode-map [menu-bar show show-branches]
+  (define-key outline-mode-menu-bar-map [show show-branches]
     '("Show Branches" . show-branches))
-  (define-key outline-mode-map [menu-bar show show-entry]
+  (define-key outline-mode-menu-bar-map [show show-entry]
     '("Show Entry" . show-entry))
-  (define-key outline-mode-map [menu-bar show show-all]
+  (define-key outline-mode-menu-bar-map [show show-all]
     '("Show All" . show-all))
 
-  (define-key outline-mode-map [menu-bar headings]
+  (define-key outline-mode-menu-bar-map [headings]
     (cons "Headings" (make-sparse-keymap "Headings")))
 
-  (define-key outline-mode-map [menu-bar headings outline-backward-same-level]
+  (define-key outline-mode-menu-bar-map [headings outline-backward-same-level]
     '("Previous Same Level" . outline-backward-same-level))
-  (define-key outline-mode-map [menu-bar headings outline-forward-same-level]
+  (define-key outline-mode-menu-bar-map [headings outline-forward-same-level]
     '("Next Same Level" . outline-forward-same-level))
-  (define-key outline-mode-map [menu-bar headings outline-previous-visible-heading]
+  (define-key outline-mode-menu-bar-map [headings outline-previous-visible-heading]
     '("Previous" . outline-previous-visible-heading))
-  (define-key outline-mode-map [menu-bar headings outline-next-visible-heading]
+  (define-key outline-mode-menu-bar-map [headings outline-next-visible-heading]
     '("Next" . outline-next-visible-heading))
-  (define-key outline-mode-map [menu-bar headings outline-up-heading]
+  (define-key outline-mode-menu-bar-map [headings outline-up-heading]
     '("Up" . outline-up-heading)))
 
+(defvar outline-mode-map nil "")
+
+(if outline-mode-map
+    nil
+  (setq outline-mode-map (nconc (make-sparse-keymap) text-mode-map))
+  (define-key outline-mode-map "\C-c" outline-mode-prefix-map)
+  (define-key outline-mode-map [menu-bar] outline-mode-menu-bar-map))
+
 (defvar outline-minor-mode nil
   "Non-nil if using Outline mode as a minor mode of some other mode.")
 (make-variable-buffer-local 'outline-minor-mode)
@@ -121,6 +135,20 @@ in the file it applies to.")
     (setq minor-mode-alist (append minor-mode-alist
                                   (list '(outline-minor-mode " Outl")))))
 
+(defvar outline-font-lock-keywords
+  '(;; Highlight headings according to the level.
+    ("^\\(\\*+\\)[ \t]*\\(.+\\)?[ \t]*$"
+     (1 font-lock-string-face)
+     (2 (let ((len (- (match-end 1) (match-beginning 1))))
+         (or (cdr (assq len '((1 . font-lock-function-name-face)
+                              (2 . font-lock-keyword-face)
+                              (3 . font-lock-comment-face))))
+             font-lock-variable-name-face))
+       nil t))
+    ;; Highight citations of the form [1] and [Mar94].
+    ("\\[\\([A-Z][A-Za-z]+\\)*[0-9]+\\]" . font-lock-type-face))
+  "Additional expressions to highlight in Outline mode.")
+
 ;;;###autoload
 (defun outline-mode ()
   "Set major mode for editing outlines with selective display.
@@ -171,29 +199,33 @@ Turning on outline mode calls the value of `text-mode-hook' and then of
   (setq local-abbrev-table text-mode-abbrev-table)
   (set-syntax-table text-mode-syntax-table)
   (make-local-variable 'paragraph-start)
-  (setq paragraph-start (concat paragraph-start "\\|^\\("
+  (setq paragraph-start (concat paragraph-start "\\|\\("
                                outline-regexp "\\)"))
   ;; Inhibit auto-filling of header lines.
   (make-local-variable 'auto-fill-inhibit-regexp)
   (setq auto-fill-inhibit-regexp outline-regexp)
   (make-local-variable 'paragraph-separate)
-  (setq paragraph-separate (concat paragraph-separate "\\|^\\("
+  (setq paragraph-separate (concat paragraph-separate "\\|\\("
                                   outline-regexp "\\)"))
+  (make-local-variable 'font-lock-defaults)
+  (setq font-lock-defaults '(outline-font-lock-keywords t))
   (make-local-variable 'change-major-mode-hook)
   (add-hook 'change-major-mode-hook 'show-all)
   (run-hooks 'text-mode-hook 'outline-mode-hook))
 
 (defvar outline-minor-mode-prefix "\C-c\C-o"
-  "*Prefix key to use for Outline commands in Outline minor mode.")
+  "*Prefix key to use for Outline commands in Outline minor mode.
+The value of this variable is checked as part of loading Outline mode.
+After that, changing the prefix key requires manipulating keymaps.")
 
 (defvar outline-minor-mode-map nil)
 (if outline-minor-mode-map
     nil
   (setq outline-minor-mode-map (make-sparse-keymap))
   (define-key outline-minor-mode-map [menu-bar]
-    (lookup-key outline-mode-map [menu-bar]))
+    outline-mode-menu-bar-map)
   (define-key outline-minor-mode-map outline-minor-mode-prefix
-    (lookup-key outline-mode-map "\C-c")))
+    outline-mode-prefix-map))
 
 (or (assq 'outline-minor-mode minor-mode-map-alist)
     (setq minor-mode-map-alist
@@ -217,7 +249,7 @@ See the command `outline-mode' for more information on this mode."
   ;; When turning off outline mode, get rid of any ^M's.
   (or outline-minor-mode
       (outline-flag-region (point-min) (point-max) ?\n))
-  (set-buffer-modified-p (buffer-modified-p)))
+  (force-mode-line-update))
 \f
 (defvar outline-level 'outline-level
   "Function of no args to compute a header's nesting level in an outline.
@@ -237,13 +269,14 @@ the number of characters that `outline-regexp' matches."
     (- (match-end 0) (match-beginning 0))))
 
 (defun outline-next-preface ()
-  "Skip forward to just before the next heading line."
+  "Skip forward to just before the next heading line.
+If there's no following heading line, stop before the newline
+at the end of the buffer."
   (if (re-search-forward (concat "[\n\^M]\\(" outline-regexp "\\)")
                         nil 'move)
-      (progn
-       (goto-char (match-beginning 0))
-       (if (memq (preceding-char) '(?\n ?\^M))
-           (forward-char -1)))))
+      (goto-char (match-beginning 0)))
+  (if (memq (preceding-char) '(?\n ?\^M))
+      (forward-char -1)))
 
 (defun outline-next-heading ()
   "Move to the next (possibly invisible) heading line."