xterm.c (XTflash): Use Gdk-routines if USE_GTK so scroll bars doesn't get
[bpt/emacs.git] / lisp / textmodes / paragraphs.el
CommitLineData
55535639 1;;; paragraphs.el --- paragraph and sentence parsing
6594deb0 2
3731a850 3;; Copyright (C) 1985, 1986, 1987, 1991, 1994, 1995, 1996, 1997, 1999, 2000,
114f9c96 4;; 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
9750e079 5
4821e2af 6;; Maintainer: FSF
d7b4d18f 7;; Keywords: wp
4821e2af 8
a2535589
JA
9;; This file is part of GNU Emacs.
10
1fecc8fe 11;; GNU Emacs is free software: you can redistribute it and/or modify
a2535589 12;; it under the terms of the GNU General Public License as published by
1fecc8fe
GM
13;; the Free Software Foundation, either version 3 of the License, or
14;; (at your option) any later version.
a2535589
JA
15
16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details.
20
21;; You should have received a copy of the GNU General Public License
1fecc8fe 22;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
a2535589 23
edbd2f74
ER
24;;; Commentary:
25
26;; This package provides the paragraph-oriented commands documented in the
27;; Emacs manual.
28
4821e2af 29;;; Code:
a2535589 30
e4550233
RS
31(defgroup paragraphs nil
32 "Paragraph and sentence parsing."
33 :group 'editing)
34
c28e534b 35(put 'use-hard-newlines 'permanent-local t)
07187d55 36(define-minor-mode use-hard-newlines
965eb84a
RS
37 "Minor mode to distinguish hard and soft newlines.
38When active, the functions `newline' and `open-line' add the
39text-property `hard' to newlines that they insert, and a line is
55cc5677 40only considered as a candidate to match `paragraph-start' or
965eb84a 41`paragraph-separate' if it follows a hard newline.
55cc5677 42
965eb84a
RS
43Prefix argument says to turn mode on if positive, off if negative.
44When the mode is turned on, if there are newlines in the buffer but no hard
db95369b 45newlines, ask the user whether to mark as hard any newlines preceeding a
965eb84a
RS
46`paragraph-start' line. From a program, second arg INSERT specifies whether
47to do this; it can be `never' to change nothing, t or `always' to force
db95369b 48marking, `guess' to try to do the right thing with no questions, nil
965eb84a
RS
49or anything else to ask the user.
50
51Newlines not marked hard are called \"soft\", and are always internal
52to paragraphs. The fill functions insert and delete only soft newlines."
eacd92dd 53 :group 'paragraphs
07187d55
SM
54 :extra-args (insert)
55 (when use-hard-newlines
965eb84a
RS
56 ;; Turn mode on
57 ;; Intuit hard newlines --
58 ;; mark as hard any newlines preceding a paragraph-start line.
59 (if (or (eq insert t) (eq insert 'always)
60 (and (not (eq 'never insert))
965eb84a
RS
61 (not (text-property-any (point-min) (point-max) 'hard t))
62 (save-excursion
63 (goto-char (point-min))
64 (search-forward "\n" nil t))
65 (or (eq insert 'guess)
66 (y-or-n-p "Make newlines between paragraphs hard? "))))
67 (save-excursion
68 (goto-char (point-min))
69 (while (search-forward "\n" nil t)
70 (let ((pos (point)))
71 (move-to-left-margin)
07187d55
SM
72 (when (looking-at paragraph-start)
73 (set-hard-newline-properties (1- pos) pos))
74 ;; If paragraph-separate, newline after it is hard too.
75 (when (looking-at paragraph-separate)
76 (set-hard-newline-properties (1- pos) pos)
77 (end-of-line)
78 (unless (eobp)
79 (set-hard-newline-properties (point) (1+ (point)))))))))))
55cc5677 80
07187d55 81(defcustom paragraph-start "\f\\|[ \t]*$" "\
85e17b4f 82Regexp for beginning of a line that starts OR separates paragraphs.
1f2007b3
RS
83This regexp should match lines that separate paragraphs
84and should also match lines that start a paragraph
85\(and are part of that paragraph).
a37669ec 86
55cc5677
BG
87This is matched against the text at the left margin, which is not necessarily
88the beginning of the line, so it should never use \"^\" as an anchor. This
89ensures that the paragraph functions will work equally well within a region
90of text indented by a margin setting.
91
1f2007b3 92The variable `paragraph-separate' specifies how to distinguish
a37669ec
RS
93lines that start paragraphs from lines that separate them.
94
3f5dc0b0 95If the variable `use-hard-newlines' is non-nil, then only lines following a
e4550233
RS
96hard newline are considered to match."
97 :group 'paragraphs
98 :type 'regexp)
f31b1257 99(put 'paragraph-start 'safe-local-variable 'stringp)
6503cec3 100
55cc5677
BG
101;; paragraph-start requires a hard newline, but paragraph-separate does not:
102;; It is assumed that paragraph-separate is distinctive enough to be believed
103;; whenever it occurs, while it is reasonable to set paragraph-start to
104;; something very minimal, even including "." (which makes every hard newline
105;; start a new paragraph).
106
e4550233 107(defcustom paragraph-separate "[ \t\f]*$"
85e17b4f 108 "Regexp for beginning of a line that separates paragraphs.
9d7c4eb5 109If you change this, you may have to change `paragraph-start' also.
a37669ec 110
55cc5677
BG
111This is matched against the text at the left margin, which is not necessarily
112the beginning of the line, so it should not use \"^\" as an anchor. This
113ensures that the paragraph functions will work equally within a region of
e4550233
RS
114text indented by a margin setting."
115 :group 'paragraphs
116 :type 'regexp)
f31b1257 117(put 'paragraph-separate 'safe-local-variable 'stringp)
6503cec3 118
629261c7 119(defcustom sentence-end-double-space t
85e17b4f 120 "Non-nil means a single space does not end a sentence.
629261c7
SM
121This is relevant for filling. See also `sentence-end-without-period'
122and `colon-double-space'.
123
32e40471 124This value is used by the function `sentence-end' to construct the
51d7369e
LT
125regexp describing the end of a sentence, when the value of the variable
126`sentence-end' is nil. See Info node `(elisp)Standard Regexps'."
629261c7
SM
127 :type 'boolean
128 :group 'fill)
f31b1257 129(put 'sentence-end-double-space 'safe-local-variable 'booleanp)
629261c7
SM
130
131(defcustom sentence-end-without-period nil
85e17b4f 132 "Non-nil means a sentence will end without a period.
629261c7 133For example, a sentence in Thai text ends with double space but
32e40471
JL
134without a period.
135
136This value is used by the function `sentence-end' to construct the
51d7369e
LT
137regexp describing the end of a sentence, when the value of the variable
138`sentence-end' is nil. See Info node `(elisp)Standard Regexps'."
629261c7
SM
139 :type 'boolean
140 :group 'fill)
f31b1257 141(put 'sentence-end-without-period 'safe-local-variable 'booleanp)
629261c7 142
9402a4b9 143(defcustom sentence-end-without-space
98819490 144 "。.?!"
85e17b4f 145 "String of characters that end sentence without following spaces.
32e40471
JL
146
147This value is used by the function `sentence-end' to construct the
51d7369e
LT
148regexp describing the end of a sentence, when the value of the variable
149`sentence-end' is nil. See Info node `(elisp)Standard Regexps'."
9402a4b9
KH
150 :group 'paragraphs
151 :type 'string)
f31b1257 152(put 'sentence-end-without-space 'safe-local-variable 'stringp)
9402a4b9 153
32e40471 154(defcustom sentence-end nil
85e17b4f 155 "Regexp describing the end of a sentence.
ac1470eb 156The value includes the whitespace following the sentence.
51534471
JB
157All paragraph boundaries also end sentences, regardless.
158
32e40471
JL
159The value nil means to use the default value defined by the
160function `sentence-end'. You should always use this function
161to obtain the value of this variable."
e4550233 162 :group 'paragraphs
32e40471 163 :type '(choice regexp (const :tag "Use default value" nil)))
f31b1257 164(put 'sentence-end 'safe-local-variable 'string-or-null-p)
32e40471 165
98819490 166(defcustom sentence-end-base "[.?!][]\"'”)}]*"
85e17b4f 167 "Regexp matching the basic end of a sentence, not including following space."
f4b80eb1
RS
168 :group 'paragraphs
169 :type 'string
170 :version "22.1")
f31b1257 171(put 'sentence-end-base 'safe-local-variable 'stringp)
f4b80eb1 172
32e40471
JL
173(defun sentence-end ()
174 "Return the regexp describing the end of a sentence.
175
176This function returns either the value of the variable `sentence-end'
177if it is non-nil, or the default value constructed from the
f4b80eb1
RS
178variables `sentence-end-base', `sentence-end-double-space',
179`sentence-end-without-period' and `sentence-end-without-space'.
180
181The default value specifies that in order to be recognized as the
182end of a sentence, the ending period, question mark, or exclamation point
183must be followed by two spaces, with perhaps some closing delimiters
184in between. See Info node `(elisp)Standard Regexps'."
32e40471 185 (or sentence-end
38cb7a93
RS
186 ;; We accept non-break space along with space.
187 (concat (if sentence-end-without-period "\\w[ \u00a0][ \u00a0]\\|")
f4b80eb1
RS
188 "\\("
189 sentence-end-base
32e40471 190 (if sentence-end-double-space
38cb7a93 191 "\\($\\|[ \u00a0]$\\|\t\\|[ \u00a0][ \u00a0]\\)" "\\($\\|[\t \u00a0]\\)")
f4b80eb1
RS
192 "\\|[" sentence-end-without-space "]+"
193 "\\)"
38cb7a93 194 "[ \u00a0\t\n]*")))
e4550233
RS
195
196(defcustom page-delimiter "^\014"
85e17b4f 197 "Regexp describing line-beginnings that separate pages."
e4550233
RS
198 :group 'paragraphs
199 :type 'regexp)
f31b1257 200(put 'page-delimiter 'safe-local-variable 'stringp)
e4550233
RS
201
202(defcustom paragraph-ignore-fill-prefix nil
85e17b4f 203 "Non-nil means the paragraph commands are not affected by `fill-prefix'.
e4550233
RS
204This is desirable in modes where blank lines are the paragraph delimiters."
205 :group 'paragraphs
206 :type 'boolean)
f31b1257 207(put 'paragraph-ignore-fill-prefix 'safe-local-variable 'booleanp)
77176e73 208
a2535589
JA
209(defun forward-paragraph (&optional arg)
210 "Move forward to end of paragraph.
94d63a23
RS
211With argument ARG, do it ARG times;
212a negative argument ARG = -N means move backward N paragraphs.
a2535589
JA
213
214A line which `paragraph-start' matches either separates paragraphs
215\(if `paragraph-separate' matches it also) or is the first line of a paragraph.
216A paragraph end is the beginning of a line which is not part of the paragraph
de24b077
SM
217to which the end of the previous line belongs, or the end of the buffer.
218Returns the count of paragraphs left to move."
2169fd55 219 (interactive "^p")
a2535589 220 (or arg (setq arg 1))
17cca868
GM
221 (let* ((opoint (point))
222 (fill-prefix-regexp
a2535589
JA
223 (and fill-prefix (not (equal fill-prefix ""))
224 (not paragraph-ignore-fill-prefix)
225 (regexp-quote fill-prefix)))
55cc5677
BG
226 ;; Remove ^ from paragraph-start and paragraph-sep if they are there.
227 ;; These regexps shouldn't be anchored, because we look for them
228 ;; starting at the left-margin. This allows paragraph commands to
229 ;; work normally with indented text.
230 ;; This hack will not find problem cases like "whatever\\|^something".
629261c7
SM
231 (parstart (if (and (not (equal "" paragraph-start))
232 (equal ?^ (aref paragraph-start 0)))
233 (substring paragraph-start 1)
234 paragraph-start))
235 (parsep (if (and (not (equal "" paragraph-separate))
236 (equal ?^ (aref paragraph-separate 0)))
237 (substring paragraph-separate 1)
238 paragraph-separate))
239 (parsep
a2535589 240 (if fill-prefix-regexp
629261c7 241 (concat parsep "\\|"
a2535589 242 fill-prefix-regexp "[ \t]*$")
629261c7 243 parsep))
55cc5677 244 ;; This is used for searching.
629261c7 245 (sp-parstart (concat "^[ \t]*\\(?:" parstart "\\|" parsep "\\)"))
eeb0f327 246 start found-start)
8a2a4ced 247 (while (and (< arg 0) (not (bobp)))
629261c7 248 (if (and (not (looking-at parsep))
a37669ec 249 (re-search-backward "^\n" (max (1- (point)) (point-min)) t)
629261c7 250 (looking-at parsep))
de24b077 251 (setq arg (1+ arg))
2be01738 252 (setq start (point))
8a2a4ced 253 ;; Move back over paragraph-separating lines.
a2535589 254 (forward-char -1) (beginning-of-line)
a37669ec 255 (while (and (not (bobp))
55cc5677 256 (progn (move-to-left-margin)
629261c7 257 (looking-at parsep)))
3f5dc0b0 258 (forward-line -1))
8a2a4ced
RS
259 (if (bobp)
260 nil
de24b077 261 (setq arg (1+ arg))
8a2a4ced
RS
262 ;; Go to end of the previous (non-separating) line.
263 (end-of-line)
264 ;; Search back for line that starts or separates paragraphs.
265 (if (if fill-prefix-regexp
629261c7 266 ;; There is a fill prefix; it overrides parstart.
2be01738 267 (let (multiple-lines)
55cc5677
BG
268 (while (and (progn (beginning-of-line) (not (bobp)))
269 (progn (move-to-left-margin)
629261c7 270 (not (looking-at parsep)))
55cc5677 271 (looking-at fill-prefix-regexp))
3f5dc0b0
SM
272 (unless (= (point) start)
273 (setq multiple-lines t))
55cc5677 274 (forward-line -1))
2be01738 275 (move-to-left-margin)
629261c7
SM
276 ;; This deleted code caused a long hanging-indent line
277 ;; not to be filled together with the following lines.
278 ;; ;; Don't move back over a line before the paragraph
279 ;; ;; which doesn't start with fill-prefix
280 ;; ;; unless that is the only line we've moved over.
281 ;; (and (not (looking-at fill-prefix-regexp))
282 ;; multiple-lines
283 ;; (forward-line 1))
2be01738 284 (not (bobp)))
629261c7 285 (while (and (re-search-backward sp-parstart nil 1)
eeb0f327 286 (setq found-start t)
55cc5677 287 ;; Found a candidate, but need to check if it is a
629261c7 288 ;; REAL parstart.
55cc5677
BG
289 (progn (setq start (point))
290 (move-to-left-margin)
629261c7
SM
291 (not (looking-at parsep)))
292 (not (and (looking-at parstart)
293 (or (not use-hard-newlines)
30857a61
LT
294 (bobp)
295 (get-text-property
296 (1- start) 'hard)))))
eeb0f327 297 (setq found-start nil)
55cc5677 298 (goto-char start))
eeb0f327 299 found-start)
de24b077
SM
300 ;; Found one.
301 (progn
8a2a4ced
RS
302 ;; Move forward over paragraph separators.
303 ;; We know this cannot reach the place we started
304 ;; because we know we moved back over a non-separator.
55cc5677
BG
305 (while (and (not (eobp))
306 (progn (move-to-left-margin)
629261c7 307 (looking-at parsep)))
8a2a4ced 308 (forward-line 1))
55cc5677
BG
309 ;; If line before paragraph is just margin, back up to there.
310 (end-of-line 0)
311 (if (> (current-column) (current-left-margin))
312 (forward-char 1)
313 (skip-chars-backward " \t")
314 (if (not (bolp))
315 (forward-line 1))))
8a2a4ced 316 ;; No starter or separator line => use buffer beg.
de24b077 317 (goto-char (point-min))))))
629261c7 318
8a2a4ced 319 (while (and (> arg 0) (not (eobp)))
de24b077
SM
320 ;; Move forward over separator lines...
321 (while (and (not (eobp))
322 (progn (move-to-left-margin) (not (eobp)))
323 (looking-at parsep))
324 (forward-line 1))
325 (unless (eobp) (setq arg (1- arg)))
326 ;; ... and one more line.
327 (forward-line 1)
a2535589 328 (if fill-prefix-regexp
629261c7 329 ;; There is a fill prefix; it overrides parstart.
a2535589 330 (while (and (not (eobp))
55cc5677 331 (progn (move-to-left-margin) (not (eobp)))
629261c7 332 (not (looking-at parsep))
a2535589
JA
333 (looking-at fill-prefix-regexp))
334 (forward-line 1))
629261c7 335 (while (and (re-search-forward sp-parstart nil 1)
55cc5677
BG
336 (progn (setq start (match-beginning 0))
337 (goto-char start)
4669fb3c
RS
338 (not (eobp)))
339 (progn (move-to-left-margin)
629261c7
SM
340 (not (looking-at parsep)))
341 (or (not (looking-at parstart))
55cc5677
BG
342 (and use-hard-newlines
343 (not (get-text-property (1- start) 'hard)))))
a37669ec
RS
344 (forward-char 1))
345 (if (< (point) (point-max))
de24b077 346 (goto-char start))))
7b462fc6
SM
347 (constrain-to-field nil opoint t)
348 ;; Return the number of steps that could not be done.
349 arg))
a2535589
JA
350
351(defun backward-paragraph (&optional arg)
352 "Move backward to start of paragraph.
94d63a23
RS
353With argument ARG, do it ARG times;
354a negative argument ARG = -N means move forward N paragraphs.
a2535589 355
23b34992 356A paragraph start is the beginning of a line which is a
2900c113
SM
357`paragraph-start' or which is ordinary text and follows a
358`paragraph-separate'ing line; except: if the first real line of a
23b34992
BP
359paragraph is preceded by a blank line, the paragraph starts at that
360blank line.
361
362See `forward-paragraph' for more information."
2169fd55 363 (interactive "^p")
a2535589
JA
364 (or arg (setq arg 1))
365 (forward-paragraph (- arg)))
366
94ed0931 367(defun mark-paragraph (&optional arg allow-extend)
a2535589 368 "Put point at beginning of this paragraph, mark at end.
f48b59a2
KG
369The paragraph marked is the one that contains point or follows point.
370
371With argument ARG, puts mark at end of a following paragraph, so that
372the number of paragraphs marked equals ARG.
373
374If ARG is negative, point is put at end of this paragraph, mark is put
cad113ae
KG
375at beginning of this or a previous paragraph.
376
94ed0931 377Interactively, if this command is repeated
3731a850 378or (in Transient Mark mode) if the mark is active,
94ed0931
RS
379it marks the next ARG paragraphs after the ones already marked."
380 (interactive "p\np")
be0d25b6
KG
381 (unless arg (setq arg 1))
382 (when (zerop arg)
383 (error "Cannot mark zero paragraphs"))
94ed0931
RS
384 (cond ((and allow-extend
385 (or (and (eq last-command this-command) (mark t))
386 (and transient-mark-mode mark-active)))
be0d25b6
KG
387 (set-mark
388 (save-excursion
389 (goto-char (mark))
390 (forward-paragraph arg)
391 (point))))
392 (t
393 (forward-paragraph arg)
394 (push-mark nil t t)
395 (backward-paragraph arg))))
a2535589
JA
396
397(defun kill-paragraph (arg)
398 "Kill forward to end of paragraph.
399With arg N, kill forward to Nth end of paragraph;
400negative arg -N means kill backward to Nth start of paragraph."
275cf1b2 401 (interactive "p")
8d6eaa00 402 (kill-region (point) (progn (forward-paragraph arg) (point))))
a2535589
JA
403
404(defun backward-kill-paragraph (arg)
405 "Kill back to start of paragraph.
406With arg N, kill back to Nth start of paragraph;
407negative arg -N means kill forward to Nth end of paragraph."
275cf1b2 408 (interactive "p")
17cca868 409 (kill-region (point) (progn (backward-paragraph arg) (point))))
a2535589
JA
410
411(defun transpose-paragraphs (arg)
412 "Interchange this (or next) paragraph with previous one."
413 (interactive "*p")
414 (transpose-subr 'forward-paragraph arg))
415
416(defun start-of-paragraph-text ()
417 (let ((opoint (point)) npoint)
418 (forward-paragraph -1)
419 (setq npoint (point))
420 (skip-chars-forward " \t\n")
b4e6c391
RS
421 ;; If the range of blank lines found spans the original start point,
422 ;; try again from the beginning of it.
423 ;; Must be careful to avoid infinite loop
424 ;; when following a single return at start of buffer.
425 (if (and (>= (point) opoint) (< npoint opoint))
a2535589
JA
426 (progn
427 (goto-char npoint)
428 (if (> npoint (point-min))
429 (start-of-paragraph-text))))))
430
431(defun end-of-paragraph-text ()
432 (let ((opoint (point)))
433 (forward-paragraph 1)
434 (if (eq (preceding-char) ?\n) (forward-char -1))
435 (if (<= (point) opoint)
436 (progn
437 (forward-char 1)
438 (if (< (point) (point-max))
439 (end-of-paragraph-text))))))
440
441(defun forward-sentence (&optional arg)
33127d1a
JB
442 "Move forward to next end of sentence. With argument, repeat.
443With negative argument, move backward repeatedly to start of sentence.
a2535589 444
23b34992
BP
445The variable `sentence-end' is a regular expression that matches ends of
446sentences. Also, every paragraph boundary terminates sentences as well."
2169fd55 447 (interactive "^p")
a2535589 448 (or arg (setq arg 1))
32e40471
JL
449 (let ((opoint (point))
450 (sentence-end (sentence-end)))
17cca868 451 (while (< arg 0)
ea2c6478 452 (let ((pos (point))
d7158f27
SM
453 ;; We used to use (start-of-paragraph-text), but this can
454 ;; prevent sentence-end from matching if it is anchored at
455 ;; BOL and the paragraph starts indented.
456 (par-beg (save-excursion (backward-paragraph) (point))))
ea2c6478
GM
457 (if (and (re-search-backward sentence-end par-beg t)
458 (or (< (match-end 0) pos)
459 (re-search-backward sentence-end par-beg t)))
460 (goto-char (match-end 0))
17cca868
GM
461 (goto-char par-beg)))
462 (setq arg (1+ arg)))
463 (while (> arg 0)
464 (let ((par-end (save-excursion (end-of-paragraph-text) (point))))
465 (if (re-search-forward sentence-end par-end t)
466 (skip-chars-backward " \t\n")
467 (goto-char par-end)))
468 (setq arg (1- arg)))
469 (constrain-to-field nil opoint t)))
a2535589 470
d320a41d 471(defun repunctuate-sentences ()
d320a41d
RS
472 "Put two spaces at the end of sentences from point to the end of buffer.
473It works using `query-replace-regexp'."
279dffd6 474 (interactive)
d320a41d
RS
475 (query-replace-regexp "\\([]\"')]?\\)\\([.?!]\\)\\([]\"')]?\\) +"
476 "\\1\\2\\3 "))
477
478
a2535589
JA
479(defun backward-sentence (&optional arg)
480 "Move backward to start of sentence. With arg, do it arg times.
23b34992 481See `forward-sentence' for more information."
2169fd55 482 (interactive "^p")
a2535589
JA
483 (or arg (setq arg 1))
484 (forward-sentence (- arg)))
485
486(defun kill-sentence (&optional arg)
487 "Kill from point to end of sentence.
488With arg, repeat; negative arg -N means kill back to Nth start of sentence."
275cf1b2 489 (interactive "p")
8d6eaa00 490 (kill-region (point) (progn (forward-sentence arg) (point))))
a2535589
JA
491
492(defun backward-kill-sentence (&optional arg)
493 "Kill back from point to start of sentence.
494With arg, repeat, or kill forward to Nth end of sentence if negative arg -N."
275cf1b2 495 (interactive "p")
17cca868 496 (kill-region (point) (progn (backward-sentence arg) (point))))
a2535589
JA
497
498(defun mark-end-of-sentence (arg)
cad113ae
KG
499 "Put mark at end of sentence. Arg works as in `forward-sentence'.
500If this command is repeated, it marks the next ARG sentences after the
501ones already marked."
a2535589
JA
502 (interactive "p")
503 (push-mark
cad113ae
KG
504 (save-excursion
505 (if (and (eq last-command this-command) (mark t))
506 (goto-char (mark)))
507 (forward-sentence arg)
508 (point))
509 nil t))
a2535589
JA
510
511(defun transpose-sentences (arg)
512 "Interchange this (next) and previous sentence."
513 (interactive "*p")
514 (transpose-subr 'forward-sentence arg))
6594deb0 515
75538b71 516;; Local Variables:
98819490 517;; coding: utf-8
75538b71 518;; End:
cc4fe8d2 519
75538b71 520;; arch-tag: e727eb1a-527a-4464-b9d7-9d3ec0d1a575
6594deb0 521;;; paragraphs.el ends here