;;; paragraphs.el --- paragraph and sentence parsing
-;; Copyright (C) 1985, 1986, 1987, 1991, 1994, 1995, 1996, 1997, 1999, 2000,
-;; 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 1985-1987, 1991, 1994-1997, 1999-2012
+;; Free Software Foundation, Inc.
;; Maintainer: FSF
;; Keywords: wp
+;; Package: emacs
;; This file is part of GNU Emacs.
(put 'use-hard-newlines 'permanent-local t)
(define-minor-mode use-hard-newlines
- "Minor mode to distinguish hard and soft newlines.
-When active, the functions `newline' and `open-line' add the
+ "Toggle distinguishing between hard and soft newlines.
+With a prefix argument ARG, enable the feature if ARG is
+positive, and disable it otherwise. If called from Lisp, enable
+it if ARG is omitted or nil.
+
+When enabled, the functions `newline' and `open-line' add the
text-property `hard' to newlines that they insert, and a line is
only considered as a candidate to match `paragraph-start' or
`paragraph-separate' if it follows a hard newline.
-Prefix argument says to turn mode on if positive, off if negative.
-When the mode is turned on, if there are newlines in the buffer but no hard
-newlines, ask the user whether to mark as hard any newlines preceeding a
-`paragraph-start' line. From a program, second arg INSERT specifies whether
-to do this; it can be `never' to change nothing, t or `always' to force
-marking, `guess' to try to do the right thing with no questions, nil
-or anything else to ask the user.
+When enabling, if there are newlines in the buffer but no hard
+newlines, ask the user whether to mark as hard any newlines
+preceding a `paragraph-start' line. From a program, second arg
+INSERT specifies whether to do this; it can be `never' to change
+nothing, t or `always' to force marking, `guess' to try to do the
+right thing with no questions, nil or anything else to ask the
+user.
Newlines not marked hard are called \"soft\", and are always internal
to paragraphs. The fill functions insert and delete only soft newlines."
(put 'sentence-end-without-period 'safe-local-variable 'booleanp)
(defcustom sentence-end-without-space
- "\e$B!#!%!)!*\e$A!##.#?#!\e$(0!$!%!)!*\e$(G!$!%!)!*\e(B"
+ "。.?!"
"String of characters that end sentence without following spaces.
This value is used by the function `sentence-end' to construct the
:type '(choice regexp (const :tag "Use default value" nil)))
(put 'sentence-end 'safe-local-variable 'string-or-null-p)
-(defcustom sentence-end-base "[.?!][]\"'\e$B!I\e$,1r}\e(B)}]*"
+(defcustom sentence-end-base "[.?!][]\"'”)}]*"
"Regexp matching the basic end of a sentence, not including following space."
:group 'paragraphs
:type 'string
must be followed by two spaces, with perhaps some closing delimiters
in between. See Info node `(elisp)Standard Regexps'."
(or sentence-end
- (concat (if sentence-end-without-period "\\w \\|")
+ ;; We accept non-break space along with space.
+ (concat (if sentence-end-without-period "\\w[ \u00a0][ \u00a0]\\|")
"\\("
sentence-end-base
(if sentence-end-double-space
- "\\($\\| $\\|\t\\| \\)" "\\($\\|[\t ]\\)")
+ "\\($\\|[ \u00a0]$\\|\t\\|[ \u00a0][ \u00a0]\\)" "\\($\\|[\t \u00a0]\\)")
"\\|[" sentence-end-without-space "]+"
"\\)"
- "[ \t\n]*")))
+ "[ \u00a0\t\n]*")))
(defcustom page-delimiter "^\014"
"Regexp describing line-beginnings that separate pages."
(kill-region (point) (progn (backward-paragraph arg) (point))))
(defun transpose-paragraphs (arg)
- "Interchange this (or next) paragraph with previous one."
+ "Interchange the current paragraph with the next one.
+With prefix argument ARG a non-zero integer, moves the current
+paragraph past ARG paragraphs, leaving point after the current paragraph.
+If ARG is positive, moves the current paragraph forwards, if
+ARG is negative moves it backwards. If ARG is zero, exchanges
+the current paragraph with the one containing the mark."
(interactive "*p")
(transpose-subr 'forward-paragraph arg))
(sentence-end (sentence-end)))
(while (< arg 0)
(let ((pos (point))
- (par-beg (save-excursion (start-of-paragraph-text) (point))))
- (if (and (re-search-backward sentence-end par-beg t)
- (or (< (match-end 0) pos)
- (re-search-backward sentence-end par-beg t)))
- (goto-char (match-end 0))
- (goto-char par-beg)))
+ par-beg par-text-beg)
+ (save-excursion
+ (start-of-paragraph-text)
+ ;; Start of real text in the paragraph.
+ ;; We move back to here if we don't see a sentence-end.
+ (setq par-text-beg (point))
+ ;; Start of the first line of the paragraph.
+ ;; We use this as the search limit
+ ;; to allow s1entence-end to match if it is anchored at
+ ;; BOL and the paragraph starts indented.
+ (beginning-of-line)
+ (setq par-beg (point)))
+ (if (and (re-search-backward sentence-end par-beg t)
+ (or (< (match-end 0) pos)
+ (re-search-backward sentence-end par-beg t)))
+ (goto-char (match-end 0))
+ (goto-char par-text-beg)))
(setq arg (1+ arg)))
(while (> arg 0)
(let ((par-end (save-excursion (end-of-paragraph-text) (point))))
- (if (re-search-forward sentence-end par-end t)
- (skip-chars-backward " \t\n")
- (goto-char par-end)))
+ (if (re-search-forward sentence-end par-end t)
+ (skip-chars-backward " \t\n")
+ (goto-char par-end)))
(setq arg (1- arg)))
(constrain-to-field nil opoint t)))
nil t))
(defun transpose-sentences (arg)
- "Interchange this (next) and previous sentence."
+ "Interchange the current sentence with the next one.
+With prefix argument ARG a non-zero integer, moves the current
+sentence past ARG sentences, leaving point after the current sentence.
+If ARG is positive, moves the current sentence forwards, if
+ARG is negative moves it backwards. If ARG is zero, exchanges
+the current sentence with the one containing the mark."
(interactive "*p")
(transpose-subr 'forward-sentence arg))
;; Local Variables:
-;; coding: iso-2022-7bit
+;; coding: utf-8
;; End:
-;; arch-tag: e727eb1a-527a-4464-b9d7-9d3ec0d1a575
;;; paragraphs.el ends here