(ispell-command-loop): Add current dictionary name and program name
[bpt/emacs.git] / lisp / textmodes / refill.el
index 9856047..d49513c 100644 (file)
@@ -1,8 +1,9 @@
 ;;; refill.el --- `auto-fill' by refilling paragraphs on changes
 
-;; Copyright (C) 2000 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2003, 2005  Free Software Foundation, Inc.
 
 ;; Author: Dave Love <fx@gnu.org>
+;; Maintainer: Miles Bader <miles@gnu.org>
 ;; Keywords: wp
 
 ;; This file is part of GNU Emacs.
@@ -19,8 +20,8 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
 
@@ -84,6 +85,8 @@
 
 ;;; Code:
 
+(eval-when-compile (require 'cl))
+
 (defgroup refill nil
   "Refilling paragraphs on changes."
   :group 'fill)
@@ -101,27 +104,28 @@ This is used to optimize refilling.")
       (forward-line -1)
       (if (<= (point) (overlay-start overlay))
          ;; Just get OVERLAY out of the way
-         (move-overlay overlay 1 1)
+         (move-overlay overlay (point-min) (point-min))
        ;; Make overlay contain only the region
        (move-overlay overlay (overlay-start overlay) (point))))))
 
 (defun refill-fill-paragraph-at (pos &optional arg)
   "Like `fill-paragraph' at POS, but don't delete whitespace at paragraph end."
-  (let (fill-pfx)
-    (save-excursion
-      (goto-char pos)
-      ;; FIXME: forward-paragraph seems to disregard `use-hard-newlines',
-      ;; leading to excessive refilling and wrong choice of fill-prefix.
-      ;; might be a bug in my paragraphs.el.
-      (forward-paragraph)
-      (let ((end (point))
-           (beg (progn (backward-paragraph) (point)))
-           (obeg (overlay-start refill-ignorable-overlay))
-           (oend (overlay-end refill-ignorable-overlay)))
+  (save-excursion
+    (goto-char pos)
+    ;; FIXME: forward-paragraph seems to disregard `use-hard-newlines',
+    ;; leading to excessive refilling and wrong choice of fill-prefix.
+    ;; might be a bug in my paragraphs.el.
+    (forward-paragraph)
+    (skip-syntax-backward "-")
+    (let ((end (point))
+         (beg (progn (backward-paragraph) (point)))
+         (obeg (overlay-start refill-ignorable-overlay))
+         (oend (overlay-end refill-ignorable-overlay)))
+      (unless (> beg pos)      ;Don't fill if point is outside the paragraph.
        (goto-char pos)
        (if (and (>= beg obeg) (< beg oend))
            ;; Limit filling to the modified tail of the paragraph.
-           (let (;; When adaptive-fill-mode is enabled, the filling
+           (let ( ;; When adaptive-fill-mode is enabled, the filling
                  ;; functions will attempt to set the fill prefix from
                  ;; the fake paragraph bounds we pass in, so set it
                  ;; ourselves first, using the real paragraph bounds.
@@ -136,23 +140,20 @@ This is used to optimize refilling.")
                (if use-hard-newlines
                    (fill-region oend end arg)
                  (fill-region-as-paragraph oend end arg)))
-             (setq fill-pfx fill-prefix)
              (move-overlay refill-ignorable-overlay obeg (point)))
          ;; Fill the whole paragraph
-         (setq fill-pfx
-               (save-restriction
-                 (if use-hard-newlines
-                     (fill-region beg end arg)
-                   (fill-region-as-paragraph beg end arg))))
-         (move-overlay refill-ignorable-overlay beg (point)))))
-    (skip-line-prefix fill-pfx)))
+         (save-restriction
+           (if use-hard-newlines
+               (fill-region beg end arg)
+             (fill-region-as-paragraph beg end arg)))
+         (move-overlay refill-ignorable-overlay beg (point)))))))
 
 (defun refill-fill-paragraph (arg)
   "Like `fill-paragraph' but don't delete whitespace at paragraph end."
   (refill-fill-paragraph-at (point) arg))
 
 (defvar refill-doit nil
-  "Non-nil means that `refill-post-command-function' does its processing.
+  "Non-nil tells `refill-post-command-function' to do its processing.
 Set by `refill-after-change-function' in `after-change-functions' and
 unset by `refill-post-command-function' in `post-command-hook', and
 sometimes `refill-pre-command-function' in `pre-command-hook'.  This
@@ -170,40 +171,36 @@ complex processing.")
   "Post-command function to do refilling (conditionally)."
   (when refill-doit ; there was a change
     ;; There's probably scope for more special cases here...
-    (if (eq this-command 'self-insert-command)
-       ;; Treat self-insertion commands specially, since they don't
-       ;; always reset `refill-doit' -- for self-insertion commands that
-       ;; *don't* cause a refill, we want to leave it turned on so that
-       ;; any subsequent non-modification command will cause a refill.
-       (when (aref auto-fill-chars (char-before))
-         ;; Respond to the same characters as auto-fill (other than
-         ;; newline, covered below).
-         (refill-fill-paragraph-at refill-doit)
-         (setq refill-doit nil))
-      (cond
-       ((or (eq this-command 'quoted-insert)
-           (eq this-command 'fill-paragraph)
-           (eq this-command 'fill-region))
-       nil)
-       ((or (eq this-command 'newline)
-           (eq this-command 'newline-and-indent)
-           (eq this-command 'open-line))
-       ;; Don't zap what was just inserted.
-       (save-excursion
-         (beginning-of-line)           ; for newline-and-indent
-         (skip-chars-backward "\n")
-         (save-restriction
-           (narrow-to-region (point-min) (point))
-           (refill-fill-paragraph-at refill-doit)))
-       (widen)
-       (save-excursion
-         (skip-chars-forward "\n")
-         (save-restriction
-           (narrow-to-region (line-beginning-position) (point-max))
-           (refill-fill-paragraph-at refill-doit))))
-       (t
-       (refill-fill-paragraph-at refill-doit)))
-      (setq refill-doit nil))))
+    (case this-command
+      (self-insert-command
+       ;; Treat self-insertion commands specially, since they don't
+       ;; always reset `refill-doit' -- for self-insertion commands that
+       ;; *don't* cause a refill, we want to leave it turned on so that
+       ;; any subsequent non-modification command will cause a refill.
+       (when (aref auto-fill-chars (char-before))
+        ;; Respond to the same characters as auto-fill (other than
+        ;; newline, covered below).
+        (refill-fill-paragraph-at refill-doit)
+        (setq refill-doit nil)))
+      ((quoted-insert fill-paragraph fill-region) nil)
+      ((newline newline-and-indent open-line indent-new-comment-line
+       reindent-then-newline-and-indent)
+       ;; Don't zap what was just inserted.
+       (save-excursion
+        (beginning-of-line)            ; for newline-and-indent
+        (skip-chars-backward "\n")
+        (save-restriction
+          (narrow-to-region (point-min) (point))
+          (refill-fill-paragraph-at refill-doit)))
+       (widen)
+       (save-excursion
+        (skip-chars-forward "\n")
+        (save-restriction
+          (narrow-to-region (line-beginning-position) (point-max))
+          (refill-fill-paragraph-at refill-doit))))
+      (t
+       (refill-fill-paragraph-at refill-doit)))
+    (setq refill-doit nil)))
 
 (defun refill-pre-command-function ()
   "Pre-command function to do refilling (conditionally)."
@@ -214,7 +211,7 @@ complex processing.")
     (refill-fill-paragraph-at refill-doit)
     (setq refill-doit nil)))
 
-(defvar refill-late-fill-paragraph-function nil)
+(defvar refill-saved-state nil)
 
 ;;;###autoload
 (define-minor-mode refill-mode
@@ -224,21 +221,25 @@ With prefix arg, turn Refill mode on iff arg is positive.
 When Refill mode is on, the current paragraph will be formatted when
 changes are made within it.  Self-inserting characters only cause
 refilling if they would cause auto-filling."
-  nil " Refill" '(("\177" . backward-delete-char-untabify))
+  :group 'refill
+  :lighter " Refill"
+  :keymap '(("\177" . backward-delete-char-untabify))
   ;; Remove old state if necessary
   (when refill-ignorable-overlay
     (delete-overlay refill-ignorable-overlay)
     (kill-local-variable 'refill-ignorable-overlay))
-  (when (local-variable-p 'refill-late-fill-paragraph-function)
-    (setq fill-paragraph-function refill-late-fill-paragraph-function)
-    (kill-local-variable 'refill-late-fill-paragraph-function))
+  (when (local-variable-p 'refill-saved-state)
+    (dolist (x refill-saved-state)
+      (set (make-local-variable (car x)) (cdr x)))
+    (kill-local-variable 'refill-saved-state))
   (if refill-mode
       (progn
        (add-hook 'after-change-functions 'refill-after-change-function nil t)
        (add-hook 'post-command-hook 'refill-post-command-function nil t)
        (add-hook 'pre-command-hook 'refill-pre-command-function nil t)
-       (set (make-local-variable 'refill-late-fill-paragraph-function)
-            fill-paragraph-function)
+       (set (make-local-variable 'refill-saved-state)
+            (mapcar (lambda (s) (cons s (symbol-value s)))
+                    '(fill-paragraph-function auto-fill-function)))
        ;; This provides the test for recursive paragraph filling.
        (set (make-local-variable 'fill-paragraph-function)
             'refill-fill-paragraph)
@@ -258,4 +259,5 @@ refilling if they would cause auto-filling."
 
 (provide 'refill)
 
+;; arch-tag: 2c4ce9e8-1daa-4a3b-b6f8-fd6ac5bf6138
 ;;; refill.el ends here