>From fc7faf6319f3da55f2a63b39279fcd415b5ceb6b Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Fri, 20 May 2022 13:52:28 +0200 Subject: [PATCH] Make `count-words' count sentences. --- doc/emacs/basic.texi | 14 +++++++------- etc/NEWS | 3 +++ lisp/simple.el | 23 ++++++++++++++++++++--- lisp/textmodes/paragraphs.el | 3 ++- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/doc/emacs/basic.texi b/doc/emacs/basic.texi index 196a28be5a..b93a6d5de6 100644 --- a/doc/emacs/basic.texi +++ b/doc/emacs/basic.texi @@ -653,14 +653,14 @@ Position Info displayed before each line, see @ref{Display Custom}. @item M-= -Display the number of lines, words, and characters that are present in -the region (@code{count-words-region}). @xref{Mark}, for information -about the region. +Display the number of lines, sentences, words, and characters that are +present in the region (@code{count-words-region}). @xref{Mark}, for +information about the region. @item M-x count-words -Display the number of lines, words, and characters that are present in -the buffer. If the region is active (@pxref{Mark}), display the -numbers for the region instead. +Display the number of lines, sentences, words, and characters that are +present in the buffer. If the region is active (@pxref{Mark}), +display the numbers for the region instead. @item C-x = Display the character code of character after point, character position of @@ -689,7 +689,7 @@ Position Info @kindex M-= @findex count-words-region @kbd{M-=} (@code{count-words-region}) displays a message reporting -the number of lines, words, and characters in the region +the number of lines, sentences, words, and characters in the region (@pxref{Mark}, for an explanation of the region). With a prefix argument, @kbd{C-u M-=}, the command displays a count for the entire buffer. diff --git a/etc/NEWS b/etc/NEWS index 7089e3a271..36df7f1861 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -315,6 +315,9 @@ a convenient method of making commands disabled in this way. --- ** 'count-lines' will now report buffer totals if given a prefix. ++++ +** 'count-words' will now report sentences count when used interactively. + --- ** New user option 'find-library-include-other-files'. If set to nil, commands like 'find-library' will only include library diff --git a/lisp/simple.el b/lisp/simple.el index cd7a82b7ac..bee7e90f72 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -1649,8 +1649,9 @@ count-words If called interactively, START and END are normally the start and end of the buffer; but if the region is active, START and END are the start and end of the region. Print a message reporting the -number of lines, words, and chars. With prefix argument, also -include the data for the entire (un-narrowed) buffer. +number of lines, sentences, words, and chars. With prefix +argument, also include the data for the entire (un-narrowed) +buffer. If called from Lisp, return the number of words between START and END, without printing any message. TOTALS is ignored when called @@ -1690,14 +1691,30 @@ count-words--buffer-format (defun count-words--format (str start end) (let ((lines (count-lines start end)) + (sentences (count-sentences start end)) (words (count-words start end)) (chars (- end start))) - (format "%s has %d line%s, %d word%s, and %d character%s" + (format "%s has %d line%s, %d sentence%s, %d word%s, and %d character%s" str lines (if (= lines 1) "" "s") + sentences (if (= sentences 1) "" "s") words (if (= words 1) "" "s") chars (if (= chars 1) "" "s")))) +(defun count-sentences (start end) + (let ((sentences 0) + (inhibit-field-text-motion t)) + (save-excursion + (save-restriction + (narrow-to-region start end) + (goto-char (point-min)) + (while (ignore-errors (forward-sentence)) + (setq sentences (1+ sentences))) + ;; Remove last possibly empty sentence + (when (/= (skip-chars-backward " \t\n") 0) + (setq sentences (1- sentences))) + sentences)))) + (define-obsolete-function-alias 'count-lines-region 'count-words-region "24.1") (defun what-line () diff --git a/lisp/textmodes/paragraphs.el b/lisp/textmodes/paragraphs.el index 7daf71e990..7eb80d9af1 100644 --- a/lisp/textmodes/paragraphs.el +++ b/lisp/textmodes/paragraphs.el @@ -477,7 +477,8 @@ forward-sentence (skip-chars-backward " \t\n") (goto-char par-end))) (setq arg (1- arg))) - (constrain-to-field nil opoint t))) + (let ((npoint (constrain-to-field nil opoint t))) + (not (= npoint opoint))))) (defun repunctuate-sentences-filter (_start _end) "Search filter used by `repunctuate-sentences' to skip unneeded spaces. -- 2.36.0