Trailing whitespace deleted.
[bpt/emacs.git] / lisp / textmodes / text-mode.el
index 6277d34..1d92b26 100644 (file)
@@ -1,8 +1,9 @@
-;;; text-mode.el --- text mode, and its idiosyncratic commands.
+;;; text-mode.el --- text mode, and its idiosyncratic commands
 
 ;; Copyright (C) 1985, 1992, 1994 Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
+;; Keywords: wp
 
 ;; This file is part of GNU Emacs.
 
 (defcustom text-mode-hook nil
   "Normal hook run when entering Text mode and many related modes."
   :type 'hook
-  :options '(turn-on-auto-fill)
+  :options '(turn-on-auto-fill flyspell-mode)
   :group 'data)
 
 (defvar text-mode-variant nil
-  "Non-nil if this buffer's major mode is a variant of Text mode.")
-
-(defvar text-mode-syntax-table nil
-  "Syntax table used while in text mode.")
-
-(defvar text-mode-abbrev-table nil
-  "Abbrev table used while in text mode.")
-(define-abbrev-table 'text-mode-abbrev-table ())
-
-(if text-mode-syntax-table
-    ()
-  (setq text-mode-syntax-table (make-syntax-table))
-  (modify-syntax-entry ?\" ".   " text-mode-syntax-table)
-  (modify-syntax-entry ?\\ ".   " text-mode-syntax-table)
-  (modify-syntax-entry ?' "w   " text-mode-syntax-table))
-
-(defvar text-mode-map nil
-  "Keymap for Text mode.
-Many other modes, such as Mail mode, Outline mode and Indented Text mode,
+  "Non-nil if this buffer's major mode is a variant of Text mode.
+Use (derived-mode-p 'text-mode) instead.")
+
+(defvar text-mode-syntax-table
+  (let ((st (make-syntax-table)))
+    (modify-syntax-entry ?\" ".   " st)
+    (modify-syntax-entry ?\\ ".   " st)
+    ;; We add `p' so that M-c on 'hello' leads to 'Hello' rather than 'hello'.
+    (modify-syntax-entry ?' "w p" st)
+    st)
+  "Syntax table used while in `text-mode'.")
+
+(defvar text-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\e\t" 'ispell-complete-word)
+    (define-key map "\es" 'center-line)
+    (define-key map "\eS" 'center-paragraph)
+    map)
+  "Keymap for `text-mode'.
+Many other modes, such as `mail-mode', `outline-mode' and `indented-text-mode',
 inherit all the commands defined in this map.")
 
-(if text-mode-map
-    ()
-  (setq text-mode-map (make-sparse-keymap))
-  (define-key text-mode-map "\e\t" 'ispell-complete-word)
-  (define-key text-mode-map "\t" 'indent-relative)
-  (define-key text-mode-map "\es" 'center-line)
-  (define-key text-mode-map "\eS" 'center-paragraph))
-
 \f
-(defun text-mode ()
+(define-derived-mode text-mode nil "Text"
   "Major mode for editing text written for humans to read.
 In this mode, paragraphs are delimited only by blank or white lines.
 You can thus get the full benefit of adaptive filling
  (see the variable `adaptive-fill-mode').
 \\{text-mode-map}
 Turning on Text mode runs the normal hook `text-mode-hook'."
-  (interactive)
-  (kill-all-local-variables)
-  (use-local-map text-mode-map)
-  (setq local-abbrev-table text-mode-abbrev-table)
-  (set-syntax-table text-mode-syntax-table)
-  (make-local-variable 'paragraph-start)
-  (setq paragraph-start (concat page-delimiter "\\|[ \t]*$"))
-  (if (eq ?^ (aref paragraph-start 0))
-      (setq paragraph-start (substring paragraph-start 1)))
-  (make-local-variable 'paragraph-separate)
-  (setq paragraph-separate paragraph-start)
-  (make-local-variable 'indent-line-function)
-  (setq indent-line-function 'indent-relative-maybe)
-  (setq mode-name "Text")
-  (setq major-mode 'text-mode)
-  (run-hooks 'text-mode-hook))
-
-(defun paragraph-indent-text-mode ()
+  (make-local-variable 'text-mode-variant)
+  (setq text-mode-variant t)
+  (set (make-local-variable 'require-final-newline) t)
+  (set (make-local-variable 'indent-line-function) 'indent-relative))
+
+(define-derived-mode paragraph-indent-text-mode text-mode "Parindent"
   "Major mode for editing text, with leading spaces starting a paragraph.
 In this mode, you do not need blank lines between paragraphs
 when the first line of the following paragraph starts with whitespace.
@@ -98,14 +80,8 @@ Special commands:
 \\{text-mode-map}
 Turning on Paragraph-Indent Text mode runs the normal hooks
 `text-mode-hook' and `paragraph-indent-text-mode-hook'."
-  (interactive)
-  (kill-all-local-variables)
-  (use-local-map text-mode-map)
-  (setq mode-name "Parindent")
-  (setq major-mode 'paragraph-indent-text-mode)
-  (setq local-abbrev-table text-mode-abbrev-table)
-  (set-syntax-table text-mode-syntax-table)
-  (run-hooks 'text-mode-hook 'paragraph-indent-text-mode-hook))
+  :abbrev-table nil :syntax-table nil
+  (paragraph-indent-minor-mode))
 
 (defun paragraph-indent-minor-mode ()
   "Minor mode for editing text, with leading spaces starting a paragraph.
@@ -116,17 +92,18 @@ Turning on Paragraph-Indent minor mode runs the normal hook
 `paragraph-indent-text-mode-hook'."
   (interactive)
   (set (make-local-variable 'paragraph-start)
-       (default-value 'paragraph-start))
-  (set (make-local-variable 'paragraph-separate) paragraph-start)
+       (concat "[ \t\n\f]\\|" paragraph-start))
+  (set (make-local-variable 'indent-line-function) 'indent-to-left-margin)
   (run-hooks 'paragraph-indent-text-mode-hook))
-      
+
 (defalias 'indented-text-mode 'text-mode)
 
+;; This can be made a no-op once all modes that use text-mode-hook
+;; are "derived" from text-mode.
 (defun text-mode-hook-identify ()
   "Mark that this mode has run `text-mode-hook'.
 This is how `toggle-text-mode-auto-fill' knows which buffers to operate on."
-  (make-local-variable 'text-mode-variant)
-  (setq text-mode-variant t))
+  (set (make-local-variable 'text-mode-variant) t))
 
 (add-hook 'text-mode-hook 'text-mode-hook-identify)
 
@@ -135,16 +112,14 @@ This is how `toggle-text-mode-auto-fill' knows which buffers to operate on."
 This command affects all buffers that use modes related to Text mode,
 both existing buffers and buffers that you subsequently create."
   (interactive)
-  (let ((enable-mode (not (memq 'turn-on-auto-fill text-mode-hook)))
-       (buffers (buffer-list)))
+  (let ((enable-mode (not (memq 'turn-on-auto-fill text-mode-hook))))
     (if enable-mode
        (add-hook 'text-mode-hook 'turn-on-auto-fill)
       (remove-hook 'text-mode-hook 'turn-on-auto-fill))
-    (while buffers
-      (with-current-buffer (car buffers)
-       (if text-mode-variant
-           (auto-fill-mode (if enable-mode 1 0))))
-      (setq buffers (cdr buffers)))
+    (dolist (buffer (buffer-list))
+      (with-current-buffer buffer
+       (if (or (derived-mode-p 'text-mode) text-mode-variant)
+           (auto-fill-mode (if enable-mode 1 0)))))
     (message "Auto Fill %s in Text modes"
             (if enable-mode "enabled" "disabled"))))
 \f
@@ -192,7 +167,7 @@ The argument NLINES says how many lines to center."
        (delete-horizontal-space)
        (setq line-length (current-column))
        (if (> (- fill-column lm line-length) 0)
-           (indent-line-to 
+           (indent-line-to
             (+ lm (/ (- fill-column lm line-length) 2))))))
     (cond ((null nlines)
           (setq nlines 0))