annotate lisp/textmodes/refill.el @ 57315:0d912ccf6554

(XTset_vertical_scroll_bar): Improve handling of scroll bars with fractional column width. If scroll bar separates two windows, move it towards the window it belongs to. Only update the padding area below the scroll bar widget when necessary, i.e. when scroll bar widget is created, moved, or resized.
author Kim F. Storm <storm@cua.dk>
date Mon, 04 Oct 2004 14:07:06 +0000
parents 695cf19ef79e
children 73def390d890 375f2633d815
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
1 ;;; refill.el --- `auto-fill' by refilling paragraphs on changes
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
2
51335
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
3 ;; Copyright (C) 2000, 2003 Free Software Foundation, Inc.
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
4
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
5 ;; Author: Dave Love <fx@gnu.org>
52290
5109a6b6910a Maintainer.
Dave Love <fx@gnu.org>
parents: 51335
diff changeset
6 ;; Maintainer: Miles Bader <miles@gnu.org>
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
7 ;; Keywords: wp
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
8
38401
64d8d90d180d Fix license commentary.
Gerd Moellmann <gerd@gnu.org>
parents: 33736
diff changeset
9 ;; This file is part of GNU Emacs.
64d8d90d180d Fix license commentary.
Gerd Moellmann <gerd@gnu.org>
parents: 33736
diff changeset
10
64d8d90d180d Fix license commentary.
Gerd Moellmann <gerd@gnu.org>
parents: 33736
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
38401
64d8d90d180d Fix license commentary.
Gerd Moellmann <gerd@gnu.org>
parents: 33736
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
64d8d90d180d Fix license commentary.
Gerd Moellmann <gerd@gnu.org>
parents: 33736
diff changeset
14 ;; any later version.
64d8d90d180d Fix license commentary.
Gerd Moellmann <gerd@gnu.org>
parents: 33736
diff changeset
15
64d8d90d180d Fix license commentary.
Gerd Moellmann <gerd@gnu.org>
parents: 33736
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
38401
64d8d90d180d Fix license commentary.
Gerd Moellmann <gerd@gnu.org>
parents: 33736
diff changeset
20
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
38401
64d8d90d180d Fix license commentary.
Gerd Moellmann <gerd@gnu.org>
parents: 33736
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64d8d90d180d Fix license commentary.
Gerd Moellmann <gerd@gnu.org>
parents: 33736
diff changeset
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
24 ;; Boston, MA 02111-1307, USA.
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
25
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
26 ;;; Commentary:
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
27
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
28 ;; Provides a mode where paragraphs are refilled after changes in them
32761
f7e7454c16a0 Fix var names in doc.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32750
diff changeset
29 ;; (using `after-change-functions'). This gives something akin to typical
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
30 ;; word processor-style filling. We restrict refilling due to
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
31 ;; self-insertion to the characters which trigger auto-fill.
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
32
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
33 ;; It partly satisfies a todo item in enriched.el for some value of
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
34 ;; `without slowing down editing too much'. It doesn't attempt to do
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
35 ;; anything (using `window-size-change-functions'?) about resizing
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
36 ;; windows -- who cares?
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
37
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
38 ;; This implementation is probably fragile and missing some special
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
39 ;; cases -- not extensively tested. Yanking paragraph breaks, for
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
40 ;; instance, won't DTRT by refilling all the relevant paragraphs.
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
41
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
42 ;; You could do it a bit more efficiently (and robustly?) with just an
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
43 ;; auto-fill function, but that doesn't cope with changes other than
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
44 ;; through self-insertion. (Using auto-fill and after-change
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
45 ;; functions together didn't seem winning.) This could probably
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
46 ;; benefit from a less-general and faster `fill-paragraph-function',
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
47 ;; ideally as a primitive.
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
48
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
49 ;; The work is done in a local post-command hook but only if
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
50 ;; `refill-doit' has been set by the after-change function. Using
32761
f7e7454c16a0 Fix var names in doc.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32750
diff changeset
51 ;; `post-command-hook' ensures simply that refilling only happens
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
52 ;; once per command.
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
53
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
54 ;; [Per Abrahamsen's maniac.el does a similar thing, but operates from
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
55 ;; post-command-hook. I don't understand the statement in it that
32761
f7e7454c16a0 Fix var names in doc.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32750
diff changeset
56 ;; after-change-functions don't work for this purpose; perhaps there was
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
57 ;; some Emacs bug at the time. ISTR maniac has problems with
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
58 ;; whitespace at the end of paragraphs.]
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
59
39894
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
60 ;;; Todo/Bugs:
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
61
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
62 ;; - When deleting the first word on a line, the space after that word tends
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
63 ;; to become part of the fill-prefix, causing either wrong filling of the
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
64 ;; remaining text, or causing the cursor to move unexpectedly. Ex:
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
65 ;; Start with
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
66 ;; I>< blabla
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
67 ;;
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
68 ;; and hit backspace. We end up with
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
69 ;;
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
70 ;; ><blabla
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
71 ;; instead of
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
72 ;; >< blabla
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
73 ;;
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
74 ;; Other example. Start with
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
75 ;;
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
76 ;; Foo bar blablabla asdgf
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
77 ;; word>< asdfas dfasdfasd
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
78 ;; asd asdfa sdfasd sdf
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
79 ;;
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
80 ;; and hit M-backspace. We end up with
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
81 ;;
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
82 ;; Foo bar blablabla asdgf
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
83 ;; ><asdfas dfasdfasd asd
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
84 ;; asdfa sdfasd sdf
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
85
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
86 ;;; Code:
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
87
48415
3f0b3e6d23fb (defgroup refill): New group.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 42263
diff changeset
88 (defgroup refill nil
3f0b3e6d23fb (defgroup refill): New group.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 42263
diff changeset
89 "Refilling paragraphs on changes."
3f0b3e6d23fb (defgroup refill): New group.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 42263
diff changeset
90 :group 'fill)
3f0b3e6d23fb (defgroup refill): New group.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 42263
diff changeset
91
33660
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
92 (defvar refill-ignorable-overlay nil
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
93 "Portion of the most recently filled paragraph not needing filling.
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
94 This is used to optimize refilling.")
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
95 (make-variable-buffer-local 'refill-ignorable-overlay)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
96
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
97 (defun refill-adjust-ignorable-overlay (overlay afterp beg end &optional len)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
98 "Adjust OVERLAY to not include the about-to-be-modified region."
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
99 (when (not afterp)
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
100 (save-excursion
33660
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
101 (goto-char beg)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
102 (forward-line -1)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
103 (if (<= (point) (overlay-start overlay))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
104 ;; Just get OVERLAY out of the way
51335
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
105 (move-overlay overlay (point-min) (point-min))
49599
5ade352e8d1c Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48415
diff changeset
106 ;; Make overlay contain only the region
33660
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
107 (move-overlay overlay (overlay-start overlay) (point))))))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
108
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
109 (defun refill-fill-paragraph-at (pos &optional arg)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
110 "Like `fill-paragraph' at POS, but don't delete whitespace at paragraph end."
51335
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
111 (save-excursion
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
112 (goto-char pos)
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
113 ;; FIXME: forward-paragraph seems to disregard `use-hard-newlines',
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
114 ;; leading to excessive refilling and wrong choice of fill-prefix.
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
115 ;; might be a bug in my paragraphs.el.
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
116 (forward-paragraph)
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
117 (skip-syntax-backward "-")
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
118 (let ((end (point))
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
119 (beg (progn (backward-paragraph) (point)))
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
120 (obeg (overlay-start refill-ignorable-overlay))
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
121 (oend (overlay-end refill-ignorable-overlay)))
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
122 (unless (> beg pos) ;Don't fill if point is outside the paragraph.
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
123 (goto-char pos)
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
124 (if (and (>= beg obeg) (< beg oend))
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
125 ;; Limit filling to the modified tail of the paragraph.
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
126 (let ( ;; When adaptive-fill-mode is enabled, the filling
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
127 ;; functions will attempt to set the fill prefix from
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
128 ;; the fake paragraph bounds we pass in, so set it
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
129 ;; ourselves first, using the real paragraph bounds.
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
130 (fill-prefix
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
131 (if (and adaptive-fill-mode
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
132 (or (null fill-prefix) (string= fill-prefix "")))
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
133 (fill-context-prefix beg end)
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
134 fill-prefix))
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
135 ;; Turn off adaptive-fill-mode temporarily
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
136 (adaptive-fill-mode nil))
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
137 (save-restriction
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
138 (if use-hard-newlines
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
139 (fill-region oend end arg)
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
140 (fill-region-as-paragraph oend end arg)))
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
141 (move-overlay refill-ignorable-overlay obeg (point)))
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
142 ;; Fill the whole paragraph
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
143 (save-restriction
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
144 (if use-hard-newlines
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
145 (fill-region beg end arg)
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
146 (fill-region-as-paragraph beg end arg)))
816e3b31173a (refill-adjust-ignorable-overlay): Don't hardcode pint-min == 1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51292
diff changeset
147 (move-overlay refill-ignorable-overlay beg (point)))))))
33660
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
148
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
149 (defun refill-fill-paragraph (arg)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
150 "Like `fill-paragraph' but don't delete whitespace at paragraph end."
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
151 (refill-fill-paragraph-at (point) arg))
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
152
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
153 (defvar refill-doit nil
51292
c41cc5ded813 (refill-fill-paragraph-at): Avoid refilling the following paragraph.
Richard M. Stallman <rms@gnu.org>
parents: 50440
diff changeset
154 "Non-nil tells `refill-post-command-function' to do its processing.
32761
f7e7454c16a0 Fix var names in doc.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32750
diff changeset
155 Set by `refill-after-change-function' in `after-change-functions' and
33660
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
156 unset by `refill-post-command-function' in `post-command-hook', and
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
157 sometimes `refill-pre-command-function' in `pre-command-hook'. This
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
158 ensures refilling is only done once per command that causes a change,
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
159 regardless of the number of after-change calls from commands doing
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
160 complex processing.")
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
161 (make-variable-buffer-local 'refill-doit)
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
162
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
163 (defun refill-after-change-function (beg end len)
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
164 "Function for `after-change-functions' which just sets `refill-doit'."
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
165 (unless undo-in-progress
33660
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
166 (setq refill-doit end)))
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
167
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
168 (defun refill-post-command-function ()
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
169 "Post-command function to do refilling (conditionally)."
33660
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
170 (when refill-doit ; there was a change
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
171 ;; There's probably scope for more special cases here...
33660
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
172 (if (eq this-command 'self-insert-command)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
173 ;; Treat self-insertion commands specially, since they don't
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
174 ;; always reset `refill-doit' -- for self-insertion commands that
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
175 ;; *don't* cause a refill, we want to leave it turned on so that
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
176 ;; any subsequent non-modification command will cause a refill.
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
177 (when (aref auto-fill-chars (char-before))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
178 ;; Respond to the same characters as auto-fill (other than
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
179 ;; newline, covered below).
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
180 (refill-fill-paragraph-at refill-doit)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
181 (setq refill-doit nil))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
182 (cond
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
183 ((or (eq this-command 'quoted-insert)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
184 (eq this-command 'fill-paragraph)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
185 (eq this-command 'fill-region))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
186 nil)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
187 ((or (eq this-command 'newline)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
188 (eq this-command 'newline-and-indent)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
189 (eq this-command 'open-line))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
190 ;; Don't zap what was just inserted.
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
191 (save-excursion
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
192 (beginning-of-line) ; for newline-and-indent
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
193 (skip-chars-backward "\n")
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
194 (save-restriction
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
195 (narrow-to-region (point-min) (point))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
196 (refill-fill-paragraph-at refill-doit)))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
197 (widen)
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
198 (save-excursion
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
199 (skip-chars-forward "\n")
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
200 (save-restriction
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
201 (narrow-to-region (line-beginning-position) (point-max))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
202 (refill-fill-paragraph-at refill-doit))))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
203 (t
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
204 (refill-fill-paragraph-at refill-doit)))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
205 (setq refill-doit nil))))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
206
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
207 (defun refill-pre-command-function ()
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
208 "Pre-command function to do refilling (conditionally)."
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
209 (when (and refill-doit (not (eq this-command 'self-insert-command)))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
210 ;; A previous setting of `refill-doit' didn't result in a refill,
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
211 ;; because it was a self-insert-command. Since the next command is
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
212 ;; something else, do the refill now.
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
213 (refill-fill-paragraph-at refill-doit)
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
214 (setq refill-doit nil)))
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
215
32960
0756037b6de5 (refill-late-fill-paragraph-function): New
Dave Love <fx@gnu.org>
parents: 32767
diff changeset
216 (defvar refill-late-fill-paragraph-function nil)
0756037b6de5 (refill-late-fill-paragraph-function): New
Dave Love <fx@gnu.org>
parents: 32767
diff changeset
217
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
218 ;;;###autoload
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
219 (define-minor-mode refill-mode
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
220 "Toggle Refill minor mode.
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
221 With prefix arg, turn Refill mode on iff arg is positive.
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
222
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
223 When Refill mode is on, the current paragraph will be formatted when
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
224 changes are made within it. Self-inserting characters only cause
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
225 refilling if they would cause auto-filling."
39894
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
226 nil " Refill" '(("\177" . backward-delete-char-untabify))
42263
ea39d5799d38 (refill-mode): Don't barf when redundantly turning refill-mode off.
Miles Bader <miles@gnu.org>
parents: 39894
diff changeset
227 ;; Remove old state if necessary
ea39d5799d38 (refill-mode): Don't barf when redundantly turning refill-mode off.
Miles Bader <miles@gnu.org>
parents: 39894
diff changeset
228 (when refill-ignorable-overlay
ea39d5799d38 (refill-mode): Don't barf when redundantly turning refill-mode off.
Miles Bader <miles@gnu.org>
parents: 39894
diff changeset
229 (delete-overlay refill-ignorable-overlay)
ea39d5799d38 (refill-mode): Don't barf when redundantly turning refill-mode off.
Miles Bader <miles@gnu.org>
parents: 39894
diff changeset
230 (kill-local-variable 'refill-ignorable-overlay))
50410
fff8e0eb547c (refill-fill-paragraph-at): Don't preserve the trailing space since
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49599
diff changeset
231 (when (local-variable-p 'refill-late-fill-paragraph-function)
42263
ea39d5799d38 (refill-mode): Don't barf when redundantly turning refill-mode off.
Miles Bader <miles@gnu.org>
parents: 39894
diff changeset
232 (setq fill-paragraph-function refill-late-fill-paragraph-function)
ea39d5799d38 (refill-mode): Don't barf when redundantly turning refill-mode off.
Miles Bader <miles@gnu.org>
parents: 39894
diff changeset
233 (kill-local-variable 'refill-late-fill-paragraph-function))
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
234 (if refill-mode
32761
f7e7454c16a0 Fix var names in doc.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32750
diff changeset
235 (progn
f7e7454c16a0 Fix var names in doc.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32750
diff changeset
236 (add-hook 'after-change-functions 'refill-after-change-function nil t)
f7e7454c16a0 Fix var names in doc.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32750
diff changeset
237 (add-hook 'post-command-hook 'refill-post-command-function nil t)
33660
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
238 (add-hook 'pre-command-hook 'refill-pre-command-function nil t)
32960
0756037b6de5 (refill-late-fill-paragraph-function): New
Dave Love <fx@gnu.org>
parents: 32767
diff changeset
239 (set (make-local-variable 'refill-late-fill-paragraph-function)
0756037b6de5 (refill-late-fill-paragraph-function): New
Dave Love <fx@gnu.org>
parents: 32767
diff changeset
240 fill-paragraph-function)
42263
ea39d5799d38 (refill-mode): Don't barf when redundantly turning refill-mode off.
Miles Bader <miles@gnu.org>
parents: 39894
diff changeset
241 ;; This provides the test for recursive paragraph filling.
32761
f7e7454c16a0 Fix var names in doc.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32750
diff changeset
242 (set (make-local-variable 'fill-paragraph-function)
f7e7454c16a0 Fix var names in doc.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32750
diff changeset
243 'refill-fill-paragraph)
39894
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
244 ;; When using justification, doing DEL on 2 spaces should remove
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
245 ;; both, otherwise, the subsequent refill will undo the DEL.
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
246 (set (make-local-variable 'backward-delete-char-untabify-method)
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
247 'hungry)
33660
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
248 (setq refill-ignorable-overlay (make-overlay 1 1 nil nil t))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
249 (overlay-put refill-ignorable-overlay 'modification-hooks
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
250 '(refill-adjust-ignorable-overlay))
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
251 (overlay-put refill-ignorable-overlay 'insert-behind-hooks
b22657305a2c (refill-ignorable-overlay): New variable.
Miles Bader <miles@gnu.org>
parents: 32960
diff changeset
252 '(refill-adjust-ignorable-overlay))
32761
f7e7454c16a0 Fix var names in doc.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32750
diff changeset
253 (auto-fill-mode 0))
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
254 (remove-hook 'after-change-functions 'refill-after-change-function t)
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
255 (remove-hook 'post-command-hook 'refill-post-command-function t)
39894
b27f7112ce6f (refill-mode): Bind DEL to backward-delete-char-untabify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38401
diff changeset
256 (kill-local-variable 'backward-delete-char-untabify-method)))
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
257
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
258 (provide 'refill)
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
259
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52290
diff changeset
260 ;;; arch-tag: 2c4ce9e8-1daa-4a3b-b6f8-fd6ac5bf6138
32750
dd36de87245d *** empty log message ***
Dave Love <fx@gnu.org>
parents:
diff changeset
261 ;;; refill.el ends here