Mercurial > emacs
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 |
rev | line source |
---|---|
32750 | 1 ;;; refill.el --- `auto-fill' by refilling paragraphs on changes |
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 | 4 |
5 ;; Author: Dave Love <fx@gnu.org> | |
52290 | 6 ;; Maintainer: Miles Bader <miles@gnu.org> |
32750 | 7 ;; Keywords: wp |
8 | |
38401 | 9 ;; This file is part of GNU Emacs. |
10 | |
11 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
32750 | 12 ;; it under the terms of the GNU General Public License as published by |
38401 | 13 ;; the Free Software Foundation; either version 2, or (at your option) |
14 ;; any later version. | |
15 | |
16 ;; GNU Emacs is distributed in the hope that it will be useful, | |
32750 | 17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 ;; GNU General Public License for more details. | |
38401 | 20 |
32750 | 21 ;; You should have received a copy of the GNU General Public License |
38401 | 22 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
32750 | 24 ;; Boston, MA 02111-1307, USA. |
25 | |
26 ;;; Commentary: | |
27 | |
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 | 30 ;; word processor-style filling. We restrict refilling due to |
31 ;; self-insertion to the characters which trigger auto-fill. | |
32 | |
33 ;; It partly satisfies a todo item in enriched.el for some value of | |
34 ;; `without slowing down editing too much'. It doesn't attempt to do | |
35 ;; anything (using `window-size-change-functions'?) about resizing | |
36 ;; windows -- who cares? | |
37 | |
38 ;; This implementation is probably fragile and missing some special | |
39 ;; cases -- not extensively tested. Yanking paragraph breaks, for | |
40 ;; instance, won't DTRT by refilling all the relevant paragraphs. | |
41 | |
42 ;; You could do it a bit more efficiently (and robustly?) with just an | |
43 ;; auto-fill function, but that doesn't cope with changes other than | |
44 ;; through self-insertion. (Using auto-fill and after-change | |
45 ;; functions together didn't seem winning.) This could probably | |
46 ;; benefit from a less-general and faster `fill-paragraph-function', | |
47 ;; ideally as a primitive. | |
48 | |
49 ;; The work is done in a local post-command hook but only if | |
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 | 52 ;; once per command. |
53 | |
54 ;; [Per Abrahamsen's maniac.el does a similar thing, but operates from | |
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 | 57 ;; some Emacs bug at the time. ISTR maniac has problems with |
58 ;; whitespace at the end of paragraphs.] | |
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 | 86 ;;; Code: |
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 | 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 | 152 |
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 | 158 ensures refilling is only done once per command that causes a change, |
159 regardless of the number of after-change calls from commands doing | |
160 complex processing.") | |
161 (make-variable-buffer-local 'refill-doit) | |
162 | |
163 (defun refill-after-change-function (beg end len) | |
164 "Function for `after-change-functions' which just sets `refill-doit'." | |
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 | 167 |
168 (defun refill-post-command-function () | |
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 | 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 | 214 (setq refill-doit nil))) |
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 | 218 ;;;###autoload |
219 (define-minor-mode refill-mode | |
220 "Toggle Refill minor mode. | |
221 With prefix arg, turn Refill mode on iff arg is positive. | |
222 | |
223 When Refill mode is on, the current paragraph will be formatted when | |
224 changes are made within it. Self-inserting characters only cause | |
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 | 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 | 254 (remove-hook 'after-change-functions 'refill-after-change-function t) |
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 | 257 |
258 (provide 'refill) | |
259 | |
52401 | 260 ;;; arch-tag: 2c4ce9e8-1daa-4a3b-b6f8-fd6ac5bf6138 |
32750 | 261 ;;; refill.el ends here |