annotate lisp/fill.el @ 5753:dbd8305e13cb

Warn about non-string non-integer ARG to #'gensym, bytecomp.el. lisp/ChangeLog addition: 2013-08-21 Aidan Kehoe <kehoea@parhasard.net> * bytecomp.el: * bytecomp.el (gensym): * bytecomp.el (byte-compile-gensym): New. Warn that gensym called in a for-effect context is unlikely to be useful. Warn about non-string non-integer ARGs, this is incorrect. Am not changing the function to error with same, most code that makes the mistake is has no problems, which is why it has survived so long. * window-xemacs.el (save-window-excursion/mapping): * window.el (save-window-excursion): Call #'gensym with a string, not a symbol.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 21 Aug 2013 19:02:59 +0100
parents 308d34e9f07d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; fill.el --- fill commands for XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;; Copyright (C) 1985, 86, 92, 94, 95, 1997 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 ;; Keywords: wp, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2510
diff changeset
10 ;; XEmacs is free software: you can redistribute it and/or modify it
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2510
diff changeset
11 ;; under the terms of the GNU General Public License as published by the
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2510
diff changeset
12 ;; Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2510
diff changeset
13 ;; option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2510
diff changeset
15 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2510
diff changeset
16 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2510
diff changeset
17 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2510
diff changeset
18 ;; for more details.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2510
diff changeset
21 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 ;;; Synched up with: FSF 19.34.
2510
6f72d9a709c3 [xemacs-hg @ 2005-01-26 09:56:05 by ben]
ben
parents: 776
diff changeset
24 ;;; NOTE: Merging past 19.34 is currently impossible. Later versions
6f72d9a709c3 [xemacs-hg @ 2005-01-26 09:56:05 by ben]
ben
parents: 776
diff changeset
25 ;;; contain FSF's own Kinsoku processing, conflicting with the current code
6f72d9a709c3 [xemacs-hg @ 2005-01-26 09:56:05 by ben]
ben
parents: 776
diff changeset
26 ;;; and depending on various features of their Mule implementation that
6f72d9a709c3 [xemacs-hg @ 2005-01-26 09:56:05 by ben]
ben
parents: 776
diff changeset
27 ;;; do not currently exist.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 ;; This file is dumped with XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 ;; All the commands for filling text. These are documented in the XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ;; Reference Manual.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 ;; 97/3/14 Jareth Hein (jhod@po.iijnet.or.jp) added functions for kinsoku (asian text
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 ;; line break processing)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 ;; 97/06/11 Steve Baur (steve@xemacs.org) converted broken
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 ;; following-char/preceding-char calls to char-after/char-before.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 (defgroup fill nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 "Indenting and filling text."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 :group 'editing)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 (defcustom fill-individual-varying-indent nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 "*Controls criterion for a new paragraph in `fill-individual-paragraphs'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 Non-nil means changing indent doesn't end a paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 That mode can handle paragraphs with extra indentation on the first line,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 but it requires separator lines between paragraphs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 A value of nil means that any change in indentation starts a new paragraph."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 :group 'fill)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 (defcustom sentence-end-double-space t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 "*Non-nil means a single space does not end a sentence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 This variable applies only to filling, not motion commands. To
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 change the behavior of motion commands, see `sentence-end'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 :group 'fill)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 (defcustom colon-double-space nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 "*Non-nil means put two spaces after a colon when filling."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 :group 'fill)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 (defvar fill-paragraph-function nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 "Mode-specific function to fill a paragraph, or nil if there is none.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 If the function returns nil, then `fill-paragraph' does its normal work.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 (defun set-fill-prefix ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 "Set the fill prefix to the current line up to point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 Filling expects lines to start with the fill prefix and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 reinserts the fill prefix in each resulting line."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 (setq fill-prefix (buffer-substring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 (save-excursion (move-to-left-margin) (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 (if (equal fill-prefix "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 (setq fill-prefix nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 (if fill-prefix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 (message "fill-prefix: \"%s\"" fill-prefix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 (message "fill-prefix cancelled")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 (defcustom adaptive-fill-mode t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 "*Non-nil means determine a paragraph's fill prefix from its text."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 :group 'fill)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 ;; #### - this is still weak. Yeah, there's filladapt, but this should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 ;; still be better... --Stig
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
93 (defcustom adaptive-fill-regexp "[ \t]*\\([#;>*]+ +\\)?"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 "*Regexp to match text at start of line that constitutes indentation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 If Adaptive Fill mode is enabled, whatever text matches this pattern
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 on the second line of a paragraph is used as the standard indentation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 for the paragraph. If the paragraph has just one line, the indentation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 is taken from that line."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 :type 'regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 :group 'fill)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 (defcustom adaptive-fill-function nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 "*Function to call to choose a fill prefix for a paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 This function is used when `adaptive-fill-regexp' does not match."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 :type 'function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 :group 'fill)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
108 ;; Added for kinsoku processing. Use this instead of
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 ;; (skip-chars-backward "^ \t\n")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 ;; (skip-chars-backward "^ \n" linebeg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 (defun fill-move-backward-to-break-point (regexp &optional lim)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 (let ((opoint (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 ;; 93.8.23 by kawamoto@ics.es.osaka-u.ac.jp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 ;; case of first 'word' being longer than fill-column
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 (if (not (re-search-backward regexp lim 'move))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 ;; we have skipped backward SPC or WAN (word-across-newline). So move point forward again.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 (forward-char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 (if (< opoint (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 (forward-char -1)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 ;; Added for kinsoku processing. Use instead of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 ;; (re-search-forward "[ \t]" opoint t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 ;; (skip-chars-forward "^ \n")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 ;; (skip-chars-forward "^ \n")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 (defun fill-move-forward-to-break-point (regexp &optional lim)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 (let ((opoint (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 (if (not (re-search-forward regexp lim 'move))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 (forward-char -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 (if (< (point) opoint)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 (forward-char))))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 444
diff changeset
133 (if (featurep 'mule) (declare-fboundp (kinsoku-process-extend))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 (defun fill-end-of-sentence-p ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 (skip-chars-backward " ]})\"'")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 (memq (char-before (point)) '(?. ?? ?!))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 (defun current-fill-column ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 "Return the fill-column to use for this line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 The fill-column to use for a buffer is stored in the variable `fill-column',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 but can be locally modified by the `right-margin' text property, which is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 subtracted from `fill-column'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 The fill column to use for a line is the first column at which the column
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 number equals or exceeds the local fill-column - right-margin difference."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 (if fill-column
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 (let* ((here (progn (beginning-of-line) (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 (here-col 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 (eol (progn (end-of-line) (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 margin fill-col change col)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 ;; Look separately at each region of line with a different right-margin.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 (while (and (setq margin (get-text-property here 'right-margin)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 fill-col (- fill-column (or margin 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 change (text-property-not-all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 here eol 'right-margin margin))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 (progn (goto-char (1- change))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 (setq col (current-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 (< col fill-col)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 (setq here change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 here-col col))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 (max here-col fill-col)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
166 (defun canonically-space-region (start end)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 "Remove extra spaces between words in region.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 Leave one space between words, two at end of sentences or after colons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 \(depending on values of `sentence-end-double-space' and `colon-double-space').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 Remove indentation from each line."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 (interactive "r")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 ;;;### 97/3/14 jhod: Do I have to add anything here for kinsoku?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 (save-excursion
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
174 (goto-char start)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 ;; XEmacs - (ENE/stig from fa-extras.el): Skip the start of a comment.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 (and comment-start-skip
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 (looking-at comment-start-skip)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 (goto-char (match-end 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 ;; Nuke tabs; they get screwed up in a fill.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 ;; This is quick, but loses when a tab follows the end of a sentence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 ;; Actually, it is difficult to tell that from "Mr.\tSmith".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 ;; Blame the typist.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
183 (subst-char-in-region start end ?\t ?\ )
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 (while (and (< (point) end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 (re-search-forward " *" end t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 (delete-region
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 (+ (match-beginning 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 ;; Determine number of spaces to leave:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 (skip-chars-backward " ]})\"'")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 (cond ((and sentence-end-double-space
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 (memq (char-before (point)) '(?. ?? ?!))) 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 ((and colon-double-space
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 (eq (char-before (point)) ?:)) 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 ((char-equal (char-before (point)) ?\n) 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 (t 1))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 (match-end 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 ;; Make sure sentences ending at end of line get an extra space.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 ;; loses on split abbrevs ("Mr.\nSmith")
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
200 (goto-char start)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 (while (and (< (point) end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 (re-search-forward "[.?!][])}\"']*$" end t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 ;; We insert before markers in case a caller such as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 ;; do-auto-fill has done a save-excursion with point at the end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 ;; of the line and wants it to stay at the end of the line.
2510
6f72d9a709c3 [xemacs-hg @ 2005-01-26 09:56:05 by ben]
ben
parents: 776
diff changeset
206 (insert-before-markers-and-inherit ? ))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 ;; XEmacs -- added DONT-SKIP-FIRST. Port of older code changes by Stig.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 ;; #### probably this junk is broken -- do-auto-fill doesn't actually use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 ;; it. If so, it should be removed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 (defun fill-context-prefix (from to &optional first-line-regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 dont-skip-first)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 "Compute a fill prefix from the text between FROM and TO.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 This uses the variables `adaptive-fill-prefix' and `adaptive-fill-function'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 If FIRST-LINE-REGEXP is non-nil, then when taking a prefix from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 first line, insist it must match FIRST-LINE-REGEXP."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 (goto-char from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 (if (eolp) (forward-line 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 ;; Move to the second line unless there is just one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 (let ((firstline (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 ;; Non-nil if we are on the second line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 at-second
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 ;; XEmacs change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 (if (not dont-skip-first)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 (forward-line 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 (cond ((>= (point) to)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 (goto-char firstline))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 ((/= (point) from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 (setq at-second t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 (move-to-left-margin)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 ;; XEmacs change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 (let ((start (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 ; jhod: no longer used?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 ;(eol (save-excursion (end-of-line) (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 (setq result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 (if (or dont-skip-first (not (looking-at paragraph-start)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 (cond ((and adaptive-fill-regexp (looking-at adaptive-fill-regexp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 (buffer-substring-no-properties start (match-end 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 (adaptive-fill-function (funcall adaptive-fill-function)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 (and result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 (or at-second
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 (null first-line-regexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 (string-match first-line-regexp result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 result)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 ;; XEmacs (stig) - this is pulled out of fill-region-as-paragraph so that it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 ;; can also be called from do-auto-fill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 ;; #### But it's not used there. Chuck pulled it out because it broke things.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 (defun maybe-adapt-fill-prefix (&optional from to dont-skip-first)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 (if (and adaptive-fill-mode
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 (or (null fill-prefix) (string= fill-prefix "")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 (setq fill-prefix (fill-context-prefix from to nil dont-skip-first))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 (defun fill-region-as-paragraph (from to &optional justify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 nosqueeze squeeze-after)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 "Fill the region as one paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 It removes any paragraph breaks in the region and extra newlines at the end,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 indents and fills lines between the margins given by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 `current-left-margin' and `current-fill-column' functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 It leaves point at the beginning of the line following the paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 Normally performs justification according to the `current-justification'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 function, but with a prefix arg, does full justification instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 From a program, optional third arg JUSTIFY can specify any type of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 justification. Fourth arg NOSQUEEZE non-nil means not to make spaces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 between words canonical before filling. Fifth arg SQUEEZE-AFTER, if non-nil,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 means don't canonicalize spaces before that position.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 If `sentence-end-double-space' is non-nil, then period followed by one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 space does not end a sentence, so don't break a line there."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 (interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 ;; XEmacs addition:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 (barf-if-buffer-read-only nil (region-beginning) (region-end))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 (list (region-beginning) (region-end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 (if current-prefix-arg 'full))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 ;; Arrange for undoing the fill to restore point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 (if (and buffer-undo-list (not (eq buffer-undo-list t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 (setq buffer-undo-list (cons (point) buffer-undo-list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 ;; Make sure "to" is the endpoint.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 (goto-char (min from to))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 (setq to (max from to))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 ;; Ignore blank lines at beginning of region.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 (skip-chars-forward " \t\n")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 (let ((from-plus-indent (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 (oneleft nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 (setq from (point))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
297
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 ;; Delete all but one soft newline at end of region.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 ;; And leave TO before that one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 (goto-char to)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 (while (and (> (point) from) (eq ?\n (char-after (1- (point)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 (if (and oneleft
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 (not (and use-hard-newlines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 (get-text-property (1- (point)) 'hard))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 (delete-backward-char 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 (backward-char 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 (setq oneleft t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 (setq to (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 ;; If there was no newline, and there is text in the paragraph, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 ;; create a newline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 (if (and (not oneleft) (> to from-plus-indent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 (newline))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 (goto-char from-plus-indent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 (if (not (> to (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 nil ; There is no paragraph, only whitespace: exit now.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 (or justify (setq justify (current-justification)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 ;; Don't let Adaptive Fill mode alter the fill prefix permanently.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 (let ((fill-prefix fill-prefix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 ;; Figure out how this paragraph is indented, if desired.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 ;; XEmacs: move some code here to a separate function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 (maybe-adapt-fill-prefix from to t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 (goto-char from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 (narrow-to-region (point) to)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 (if (not justify) ; filling disabled: just check indentation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 (goto-char from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 (while (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 (if (and (not (eolp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 (< (current-indentation) (current-left-margin)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 (indent-to-left-margin))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 (forward-line 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 (if use-hard-newlines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 (remove-text-properties from (point-max) '(hard nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 ;; Make sure first line is indented (at least) to left margin...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 (if (or (memq justify '(right center))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 (< (current-indentation) (current-left-margin)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 (indent-to-left-margin))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 ;; Delete the fill prefix from every line except the first.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 ;; The first line may not even have a fill prefix.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 (goto-char from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 (let ((fpre (and fill-prefix (not (equal fill-prefix ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 (concat "[ \t]*"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 (regexp-quote fill-prefix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 "[ \t]*"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 (and fpre
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 (if (>= (+ (current-left-margin) (length fill-prefix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 (current-fill-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 (error "fill-prefix too long for specified width"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 (goto-char from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 (while (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 (if (looking-at fpre)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 (delete-region (point) (match-end 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 (forward-line 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 (goto-char from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 (if (looking-at fpre)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 (goto-char (match-end 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 (setq from (point)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 ;; Remove indentation from lines other than the first.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 (beginning-of-line 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 (indent-region (point) (point-max) 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 (goto-char from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 ;; FROM, and point, are now before the text to fill,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 ;; but after any fill prefix on the first line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 ;; Make sure sentences ending at end of line get an extra space.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 ;; loses on split abbrevs ("Mr.\nSmith")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 (while (re-search-forward "[.?!][])}\"']*$" nil t)
2510
6f72d9a709c3 [xemacs-hg @ 2005-01-26 09:56:05 by ben]
ben
parents: 776
diff changeset
380 (or (eobp) (insert-and-inherit ?\ ?\ )))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 (goto-char from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 (skip-chars-forward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 ;; Then change all newlines to spaces.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 ;;; 97/3/14 jhod: Kinsoku change
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
385 ;; Spacing is not necessary for characters of no word-separator.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 ;; The regexp word-across-newline is used for this check.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 (defvar word-across-newline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 (if (not (and (featurep 'mule)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 (stringp word-across-newline)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 (subst-char-in-region from (point-max) ?\n ?\ )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 ;; WAN +NL+WAN --> WAN + WAN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 ;; not(WAN)+NL+WAN --> not(WAN) + WAN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 ;; WAN +NL+not(WAN) --> WAN + not(WAN)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 ;; SPC +NL+not(WAN) --> SPC + not(WAN)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 ;; not(WAN)+NL+not(WAN) --> not(WAN) + SPC + not(WAN)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 (goto-char from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 (end-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 (while (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 ;; Insert SPC only when point is between nonWAN. Insert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 ;; before deleting to preserve marker if possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 (if (or (prog2 ; check following char.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 (forward-char) ; skip newline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 (or (eobp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 (looking-at word-across-newline))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 (forward-char -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 (prog2 ; check previous char.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 (forward-char -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 (or (eq (char-after (point)) ?\ )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 (looking-at word-across-newline))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 (forward-char)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 (insert ?\ ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 (delete-char 1) ; delete newline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 (end-of-line)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 ;; end patch
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 (goto-char from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 (skip-chars-forward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 (if (and nosqueeze (not (eq justify 'full)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 (canonically-space-region (or squeeze-after (point)) (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 (goto-char (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 (delete-horizontal-space)
2510
6f72d9a709c3 [xemacs-hg @ 2005-01-26 09:56:05 by ben]
ben
parents: 776
diff changeset
425 (insert-and-inherit " "))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 (goto-char (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 ;; This is the actual filling loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 (let ((prefixcol 0) linebeg
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 (re-break-point (if (featurep 'mule)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 (concat "[ \n\t]\\|" word-across-newline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 ".\\|." word-across-newline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 "[ \n\t]")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 (while (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 (setq linebeg (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 (move-to-column (1+ (current-fill-column)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 (if (eobp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 (or nosqueeze (delete-horizontal-space))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 ;; Move back to start of word.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 ;; 97/3/14 jhod: Kinsoku
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 ;(skip-chars-backward "^ \n" linebeg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 (fill-move-backward-to-break-point re-break-point linebeg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 ;; end patch
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 ;; Don't break after a period followed by just one space.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 ;; Move back to the previous place to break.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 ;; The reason is that if a period ends up at the end of a line,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 ;; further fills will assume it ends a sentence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 ;; If we now know it does not end a sentence,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 ;; avoid putting it at the end of the line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 (if sentence-end-double-space
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 (while (and (> (point) (+ linebeg 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 (eq (char-before (point)) ?\ )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 (not (eq (char-after (point)) ?\ ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 (eq (char-after (- (point) 2)) ?\.))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 (forward-char -2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 ;; 97/3/14 jhod: Kinsoku
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 ;(skip-chars-backward "^ \n" linebeg)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 (fill-move-backward-to-break-point re-break-point linebeg)))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 444
diff changeset
459 (if (featurep 'mule) (declare-fboundp (kinsoku-process)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 ;end patch
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 ;; If the left margin and fill prefix by themselves
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 ;; pass the fill-column. or if they are zero
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 ;; but we have no room for even one word,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 ;; keep at least one word anyway.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 ;; This handles ALL BUT the first line of the paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 (if (if (zerop prefixcol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 (skip-chars-backward " \t" linebeg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 (bolp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 (>= prefixcol (current-column)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 ;; Ok, skip at least one word.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 ;; Meanwhile, don't stop at a period followed by one space.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 (let ((first t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 (move-to-column prefixcol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 (while (and (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 (or first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 (and (not (bobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 sentence-end-double-space
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 (save-excursion (forward-char -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 (and (looking-at "\\. ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 (not (looking-at "\\. ")))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 (skip-chars-forward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 ;; 94/3/14 jhod: Kinsoku
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 ;(skip-chars-forward "^ \n\t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 (fill-move-forward-to-break-point re-break-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 ;; end patch
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 (setq first nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 ;; Normally, move back over the single space between the words.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 (if (eq (char-before (point)) ?\ )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 (forward-char -1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 ;; If the left margin and fill prefix by themselves
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 ;; pass the fill-column, keep at least one word.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 ;; This handles the first line of the paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 (if (and (zerop prefixcol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 (let ((fill-point (point)) nchars)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 (move-to-left-margin)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 (setq nchars (- fill-point (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 (or (< nchars 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 (and fill-prefix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 (< nchars (length fill-prefix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 (string= (buffer-substring (point) fill-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 (substring fill-prefix 0 nchars)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 ;; Ok, skip at least one word. But
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 ;; don't stop at a period followed by just one space.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 (let ((first t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 (while (and (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 (or first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 (and (not (bobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 sentence-end-double-space
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 (save-excursion (forward-char -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 (and (looking-at "\\. ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 (not (looking-at "\\. ")))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 (skip-chars-forward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 ;; 97/3/14 jhod: Kinsoku
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 ;(skip-chars-forward "^ \t\n")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 (fill-move-forward-to-break-point re-break-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 ;; end patch
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 (setq first nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 ;; Check again to see if we got to the end of the paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 (if (save-excursion (skip-chars-forward " \t") (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 (or nosqueeze (delete-horizontal-space))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 ;; Replace whitespace here with one newline, then indent to left
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 ;; margin.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 (skip-chars-backward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 ;; 97/3/14 jhod: More kinsoku stuff
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 (if (featurep 'mule)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 ;; WAN means chars which match word-across-newline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 ;; (0) | SPC + SPC* <EOB> --> NL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 ;; (1) WAN | SPC + SPC* --> WAN + SPC + NL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 ;; (2) | SPC + SPC* + WAN --> SPC + NL + WAN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 ;; (3) '.' | SPC + nonSPC --> '.' + SPC + NL + nonSPC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 ;; (4) '.' | SPC + SPC --> '.' + NL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 ;; (5) | SPC* --> NL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 (let ((start (point)) ; 92.6.30 by K.Handa
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 (ch (char-after (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 (if (and (= ch ? )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 (progn ; not case (0) -- 92.6.30 by K.Handa
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 (skip-chars-forward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 (not (eobp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 (or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 (progn ; case (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 (goto-char start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 (forward-char -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 (looking-at word-across-newline))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 (progn ; case (2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 (goto-char start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 (skip-chars-forward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 (and (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 (looking-at word-across-newline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 ;; never leave space after the end of sentence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 (not (fill-end-of-sentence-p))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 (progn ; case (3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 (goto-char (1+ start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 (and (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 (not (eq (char-after (point)) ? ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 (fill-end-of-sentence-p)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 ;; We should keep one SPACE before NEWLINE. (1),(2),(3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 (goto-char (1+ start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 ;; We should delete all SPACES around break point. (4),(5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 (goto-char start))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 ;; end of patch
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 (insert ?\n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 ;; Give newline the properties of the space(s) it replaces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 (set-text-properties (1- (point)) (point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 (text-properties-at (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 (indent-to-left-margin)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 ;; Insert the fill prefix after indentation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 ;; Set prefixcol so whitespace in the prefix won't get lost.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 (and fill-prefix (not (equal fill-prefix ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 (progn
2510
6f72d9a709c3 [xemacs-hg @ 2005-01-26 09:56:05 by ben]
ben
parents: 776
diff changeset
573 (insert-and-inherit fill-prefix)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 (setq prefixcol (current-column))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 ;; Justify the line just ended, if desired.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 (if justify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 (if (save-excursion (skip-chars-forward " \t") (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 (delete-horizontal-space)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 (justify-current-line justify t t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 (forward-line -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 (justify-current-line justify nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 (forward-line 1))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 ;; Leave point after final newline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 (goto-char (point-max)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 (forward-char 1))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 (defun fill-paragraph (arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 "Fill paragraph at or after point. Prefix arg means justify as well.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 If `sentence-end-double-space' is non-nil, then period followed by one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 space does not end a sentence, so don't break a line there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 If `fill-paragraph-function' is non-nil, we call it (passing our
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 argument to it), and if it returns non-nil, we simply return its value."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 (interactive (list (if current-prefix-arg 'full)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 (or (and fill-paragraph-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 (let ((function fill-paragraph-function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 fill-paragraph-function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 (funcall function arg)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 (let ((before (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 (forward-paragraph)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 (or (bolp) (newline 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (let ((end (point))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
605 (start (progn (backward-paragraph) (point))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 (goto-char before)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 (if use-hard-newlines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 ;; Can't use fill-region-as-paragraph, since this paragraph may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 ;; still contain hard newlines. See fill-region.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
610 (fill-region start end arg)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
611 (fill-region-as-paragraph start end arg)))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 (defun fill-region (from to &optional justify nosqueeze to-eop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 "Fill each of the paragraphs in the region.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 Prefix arg (non-nil third arg, if called from program) means justify as well.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 Noninteractively, fourth arg NOSQUEEZE non-nil means to leave
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 whitespace other than line breaks untouched, and fifth arg TO-EOP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 non-nil means to keep filling to the end of the paragraph (or next
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 hard newline, if `use-hard-newlines' is on).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 If `sentence-end-double-space' is non-nil, then period followed by one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 space does not end a sentence, so don't break a line there."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 (interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 ;; XEmacs addition:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 (barf-if-buffer-read-only nil (region-beginning) (region-end))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 (list (region-beginning) (region-end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 (if current-prefix-arg 'full))))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
630 (let (end start)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 (goto-char (max from to))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 (if to-eop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 (progn (skip-chars-backward "\n")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 (forward-paragraph)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 (setq end (point))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
637 (goto-char (setq start (min from to)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 (narrow-to-region (point) end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 (while (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 (let ((initial (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 ;; If using hard newlines, break at every one for filling
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
644 ;; purposes rather than using paragraph breaks.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 (if use-hard-newlines
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
646 (progn
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 (while (and (setq end (text-property-any (point) (point-max)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 'hard t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 (not (eq ?\n (char-after end)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 (not (= end (point-max))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 (goto-char (1+ end)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 (setq end (if end (min (point-max) (1+ end)) (point-max)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 (goto-char initial))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 (forward-paragraph 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 (setq end (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 (forward-paragraph -1))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
657 (if (< (point) start)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
658 (goto-char start))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 (if (>= (point) initial)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 (fill-region-as-paragraph (point) end justify nosqueeze)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 (goto-char end)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 (defun fill-paragraph-or-region (arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 "Fill the current region, if it's active; otherwise, fill the paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 See `fill-paragraph' and `fill-region' for more information."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 (interactive "*P")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 (if (region-active-p)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 444
diff changeset
668 (call-interactively 'fill-region)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 444
diff changeset
669 (call-interactively 'fill-paragraph)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
671
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 (defconst default-justification 'left
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 "*Method of justifying text not otherwise specified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 Possible values are `left', `right', `full', `center', or `none'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 The requested kind of justification is done whenever lines are filled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 The `justification' text-property can locally override this variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 This variable automatically becomes buffer-local when set in any fashion.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 (make-variable-buffer-local 'default-justification)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 (defun current-justification ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 "How should we justify this line?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 This returns the value of the text-property `justification',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 or the variable `default-justification' if there is no text-property.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 However, it returns nil rather than `none' to mean \"don't justify\"."
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
685 (let ((j (or (get-text-property
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 ;; Make sure we're looking at paragraph body.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
687 (save-excursion (skip-chars-forward " \t")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 (if (and (eobp) (not (bobp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 (1- (point)) (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 'justification)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 default-justification)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 (if (eq 'none j)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 j)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 (defun set-justification (begin end value &optional whole-par)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 "Set the region's justification style.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 The kind of justification to use is prompted for.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 If the mark is not active, this command operates on the current paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 If the mark is active, the region is used. However, if the beginning and end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 of the region are not at paragraph breaks, they are moved to the beginning and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 end of the paragraphs they are in.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 If `use-hard-newlines' is true, all hard newlines are taken to be paragraph
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 breaks.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 When calling from a program, operates just on region between BEGIN and END,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 unless optional fourth arg WHOLE-PAR is non-nil. In that case bounds are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 extended to include entire paragraphs as in the interactive command."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 ;; XEmacs change (was mark-active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 (interactive (list (if (region-active-p) (region-beginning) (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 (if (region-active-p) (region-end) (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 (let ((s (completing-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 "Set justification to: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 '(("left") ("right") ("full")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 ("center") ("none"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 nil t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 (if (equal s "") (error ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 (intern s))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 (if whole-par
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 (let ((paragraph-start (if use-hard-newlines "." paragraph-start))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
724 (paragraph-ignore-fill-prefix (if use-hard-newlines t
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 paragraph-ignore-fill-prefix)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 (goto-char begin)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 (while (and (bolp) (not (eobp))) (forward-char 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 (backward-paragraph)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 (setq begin (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 (goto-char end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 (skip-chars-backward " \t\n" begin)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 (forward-paragraph)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 (setq end (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 (narrow-to-region (point-min) end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 (unjustify-region begin (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 (put-text-property begin (point-max) 'justification value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 (fill-region begin (point-max) nil t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 (defun set-justification-none (b e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 "Disable automatic filling for paragraphs in the region.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 If the mark is not active, this applies to the current paragraph."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 ;; XEmacs change (was mark-active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 (interactive (list (if (region-active-p) (region-beginning) (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 (if (region-active-p) (region-end) (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 (set-justification b e 'none t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 (defun set-justification-left (b e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 "Make paragraphs in the region left-justified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 This is usually the default, but see the variable `default-justification'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 If the mark is not active, this applies to the current paragraph."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 ;; XEmacs change (was mark-active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 (interactive (list (if (region-active-p) (region-beginning) (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 (if (region-active-p) (region-end) (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 (set-justification b e 'left t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 (defun set-justification-right (b e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 "Make paragraphs in the region right-justified:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 Flush at the right margin and ragged on the left.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 If the mark is not active, this applies to the current paragraph."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 ;; XEmacs change (was mark-active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 (interactive (list (if (region-active-p) (region-beginning) (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 (if (region-active-p) (region-end) (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 (set-justification b e 'right t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 (defun set-justification-full (b e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 "Make paragraphs in the region fully justified:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 This makes lines flush on both margins by inserting spaces between words.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 If the mark is not active, this applies to the current paragraph."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 ;; XEmacs change (was mark-active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 (interactive (list (if (region-active-p) (region-beginning) (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 (if (region-active-p) (region-end) (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 (set-justification b e 'full t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 (defun set-justification-center (b e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 "Make paragraphs in the region centered.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 If the mark is not active, this applies to the current paragraph."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 ;; XEmacs change (was mark-active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 (interactive (list (if (region-active-p) (region-beginning) (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 (if (region-active-p) (region-end) (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 (set-justification b e 'center t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 ;; 97/3/14 jhod: This functions are added for Kinsoku support
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 (defun find-space-insertable-point ()
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
785 "Search backward for a permissible point for inserting justification spaces."
776
79940b592197 [xemacs-hg @ 2002-03-15 07:43:14 by ben]
ben
parents: 502
diff changeset
786 (if-boundp 'space-insertable
79940b592197 [xemacs-hg @ 2002-03-15 07:43:14 by ben]
ben
parents: 502
diff changeset
787 (if (re-search-backward space-insertable nil t)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 (progn (forward-char 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 (search-backward " " nil t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 ;; A line has up to six parts:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 ;;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
795 ;; >>> hello.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 ;; [Indent-1][FP][ Indent-2 ][text][trailing whitespace][newline]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 ;; "Indent-1" is the left-margin indentation; normally it ends at column
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 ;; given by the `current-left-margin' function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 ;; "FP" is the fill-prefix. It can be any string, including whitespace.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 ;; "Indent-2" is added to justify a line if the `current-justification' is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 ;; `center' or `right'. In `left' and `full' justification regions, any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 ;; whitespace there is part of the line's text, and should not be changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 ;; Trailing whitespace is not counted as part of the line length when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 ;; center- or right-justifying.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 ;;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
807 ;; All parts of the line are optional, although the final newline can
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 ;; only be missing on the last line of the buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 (defun justify-current-line (&optional how eop nosqueeze)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 "Do some kind of justification on this line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 Normally does full justification: adds spaces to the line to make it end at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 the column given by `current-fill-column'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 Optional first argument HOW specifies alternate type of justification:
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
815 it can be `left', `right', `full', `center', or `none'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 If HOW is t, will justify however the `current-justification' function says to.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 If HOW is nil or missing, full justification is done by default.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 Second arg EOP non-nil means that this is the last line of the paragraph, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 it will not be stretched by full justification.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 Third arg NOSQUEEZE non-nil means to leave interior whitespace unchanged,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 otherwise it is made canonical."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 (if (eq t how) (setq how (or (current-justification) 'none))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 (if (null how) (setq how 'full)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 (or (memq how '(none left right center))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 (setq how 'full))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 (or (memq how '(none left)) ; No action required for these.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 (let ((fc (current-fill-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 (pos (point-marker))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 fp-end ; point at end of fill prefix
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
831 start ; point at beginning of line's text
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 end ; point at end of line's text
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
833 indent ; column of `start'
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 endcol ; column of `end'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 ncols) ; new indent point or offset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 (end-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 ;; Check if this is the last line of the paragraph.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
838 (if (and use-hard-newlines (null eop)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 (get-text-property (point) 'hard))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 (setq eop t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 (skip-chars-backward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 ;; Quick exit if it appears to be properly justified already
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 ;; or there is no text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 (if (or (bolp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 (and (memq how '(full right))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 (= (current-column) fc)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 (setq end (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 (skip-chars-forward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 ;; Skip over fill-prefix.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
852 (if (and fill-prefix
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 (not (string-equal fill-prefix ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 (equal fill-prefix
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
855 (buffer-substring
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 (point) (min (point-max) (+ (length fill-prefix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 (point))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 (forward-char (length fill-prefix))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
859 (if (and adaptive-fill-mode
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 (looking-at adaptive-fill-regexp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 (goto-char (match-end 0))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 (setq fp-end (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 (skip-chars-forward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 ;; This is beginning of the line's text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 (setq indent (current-column))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
866 (setq start (point))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 (goto-char end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 (setq endcol (current-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 ;; HOW can't be null or left--we would have exited already
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
871 (cond ((eq 'right how)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 (setq ncols (- fc endcol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 (if (< ncols 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 ;; Need to remove some indentation
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
875 (delete-region
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 (progn (goto-char fp-end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 (if (< (current-column) (+ indent ncols))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 (move-to-column (+ indent ncols) t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 (progn (move-to-column indent) (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 ;; Need to add some
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
882 (goto-char start)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 (indent-to (+ indent ncols))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 ;; If point was at beginning of text, keep it there.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
885 (if (= start pos)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 (move-marker pos (point)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 ((eq 'center how)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 ;; Figure out how much indentation is needed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 (setq ncols (+ (current-left-margin)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 (/ (- fc (current-left-margin) ;avail. space
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 (- endcol indent)) ;text width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 2)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 (if (< ncols indent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 ;; Have too much indentation - remove some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 (delete-region
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 (progn (goto-char fp-end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 (if (< (current-column) ncols)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 (move-to-column ncols t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 (progn (move-to-column indent) (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 ;; Have too little - add some
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
903 (goto-char start)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 (indent-to ncols)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 ;; If point was at beginning of text, keep it there.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
906 (if (= start pos)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 (move-marker pos (point)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 ((eq 'full how)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 ;; Insert extra spaces between words to justify line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 (save-restriction
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
912 (narrow-to-region start end)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 (or nosqueeze
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
914 (canonically-space-region start end))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 (goto-char (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 (setq ncols (- fc endcol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 ;; Ncols is number of additional spaces needed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 (if (> ncols 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 (if (and (not eop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 ;; 97/3/14 jhod: Kinsoku
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 (find-space-insertable-point)) ;(search-backward " " nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 (while (> ncols 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 (let ((nmove (+ 3 (random 3))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 (while (> nmove 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 (or (find-space-insertable-point) ;(search-backward " " nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 (goto-char (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 (find-space-insertable-point))) ;(search-backward " ")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 (skip-chars-backward " ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 (setq nmove (1- nmove))))
2510
6f72d9a709c3 [xemacs-hg @ 2005-01-26 09:56:05 by ben]
ben
parents: 776
diff changeset
931 (insert-and-inherit " ")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 (skip-chars-backward " ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 (setq ncols (1- ncols)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 (t (error "Unknown justification value"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 (goto-char pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 (move-marker pos nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 (defun unjustify-current-line ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 "Remove justification whitespace from current line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 If the line is centered or right-justified, this function removes any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 indentation past the left margin. If the line is full-justified, it removes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 extra spaces between words. It does nothing in other justification modes."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 (let ((justify (current-justification)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 (cond ((eq 'left justify) nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 ((eq nil justify) nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 ((eq 'full justify) ; full justify: remove extra spaces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 (beginning-of-line-text)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 (canonically-space-region
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 (point) (save-excursion (end-of-line) (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 ((memq justify '(center right))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 (move-to-left-margin nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 ;; Position ourselves after any fill-prefix.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
955 (if (and fill-prefix
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 (not (string-equal fill-prefix ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 (equal fill-prefix
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
958 (buffer-substring
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 (point) (min (point-max) (+ (length fill-prefix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 (point))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 (forward-char (length fill-prefix)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 (delete-region (point) (progn (skip-chars-forward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 (point))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 (defun unjustify-region (&optional begin end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 "Remove justification whitespace from region.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 For centered or right-justified regions, this function removes any indentation
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
968 past the left margin from each line. For full-justified lines, it removes
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 extra spaces between words. It does nothing in other justification modes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 Arguments BEGIN and END are optional; default is the whole buffer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 (if end (narrow-to-region (point-min) end))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 (goto-char (or begin (point-min)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 (while (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 (unjustify-current-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 (forward-line 1)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 (defun fill-nonuniform-paragraphs (min max &optional justifyp mailp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 "Fill paragraphs within the region, allowing varying indentation within each.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 This command divides the region into \"paragraphs\",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 only at paragraph-separator lines, then fills each paragraph
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 using as the fill prefix the smallest indentation of any line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 in the paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 When calling from a program, pass range to fill as first two arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 Optional third and fourth arguments JUSTIFY and MAIL-FLAG:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 JUSTIFY to justify paragraphs (prefix arg),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 MAIL-FLAG for a mail message, i. e. don't fill header lines."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 (interactive (list (region-beginning) (region-end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 (if current-prefix-arg 'full)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 (let ((fill-individual-varying-indent t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 (fill-individual-paragraphs min max justifyp mailp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 (defun fill-individual-paragraphs (min max &optional justify mailp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 "Fill paragraphs of uniform indentation within the region.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 This command divides the region into \"paragraphs\",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 treating every change in indentation level as a paragraph boundary,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 then fills each paragraph using its indentation level as the fill prefix.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 When calling from a program, pass range to fill as first two arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 Optional third and fourth arguments JUSTIFY and MAIL-FLAG:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 JUSTIFY to justify paragraphs (prefix arg),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 MAIL-FLAG for a mail message, i. e. don't fill header lines."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 (interactive (list (region-beginning) (region-end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 (if current-prefix-arg 'full)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 (goto-char min)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 (narrow-to-region (point) max)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
1015 (if mailp
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 (while (and (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 (or (looking-at "[ \t]*[^ \t\n]+:")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 (looking-at "[ \t]*$")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 (if (looking-at "[ \t]*[^ \t\n]+:")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 (search-forward "\n\n" nil 'move)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 (forward-line 1))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 (narrow-to-region (point) max)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 ;; Loop over paragraphs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 (while (progn (skip-chars-forward " \t\n") (not (eobp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 (move-to-left-margin)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 (let ((start (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 fill-prefix fill-prefix-regexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 ;; Find end of paragraph, and compute the smallest fill-prefix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 ;; that fits all the lines in this paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 (while (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 ;; Update the fill-prefix on the first line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 ;; and whenever the prefix good so far is too long.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 (if (not (and fill-prefix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 (looking-at fill-prefix-regexp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 (setq fill-prefix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 (if (and adaptive-fill-mode adaptive-fill-regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 (looking-at adaptive-fill-regexp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 (match-string 0)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
1039 (buffer-substring
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 (point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 (save-excursion (skip-chars-forward " \t")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 fill-prefix-regexp (regexp-quote fill-prefix)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 (if (bolp)
2510
6f72d9a709c3 [xemacs-hg @ 2005-01-26 09:56:05 by ben]
ben
parents: 776
diff changeset
1046 ;; If forward-line went past a newline,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 ;; move further to the left margin.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 (move-to-left-margin))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 ;; Now stop the loop if end of paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 (and (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 (if fill-individual-varying-indent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 ;; If this line is a separator line, with or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 ;; without prefix, end the paragraph.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 440
diff changeset
1054 (and
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 (not (looking-at paragraph-separate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 (not (and (looking-at fill-prefix-regexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 ;; XEmacs change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 (forward-char (length fill-prefix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 (looking-at paragraph-separate))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 ;; If this line has more or less indent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 ;; than the fill prefix wants, end the paragraph.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 (and (looking-at fill-prefix-regexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 (not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 (forward-char (length fill-prefix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 (or (looking-at paragraph-separate)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 (looking-at paragraph-start))))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 ;; Fill this paragraph, but don't add a newline at the end.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 (let ((had-newline (bolp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 (fill-region-as-paragraph start (point) justify)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 (or had-newline (delete-char -1))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 ;;; fill.el ends here