From: Manuel Giraud Date: Fri, 20 May 2022 11:52:28 +0000 (+0200) Subject: Make `count-words' count sentences. X-Git-Tag: emacs-29.0.90~1910^2~358 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=460d5fd971489ba7b573d71a94cdaac2f9f1a767;p=emacs.git Make `count-words' count sentences. * lisp/textmodes/paragraphs.el (count-sentences): New function. * lisp/simple.el (count-words--format): Update format for showing sentences. (count-words): Also count sentences. * lisp/simple.el (count-words): * etc/NEWS: * doc/emacs/basic.texi (Position Info): Update documentation for sentence counting. --- diff --git a/doc/emacs/basic.texi b/doc/emacs/basic.texi index 196a28be5a1..b93a6d5de6e 100644 --- a/doc/emacs/basic.texi +++ b/doc/emacs/basic.texi @@ -653,14 +653,14 @@ Toggle automatic display of the current line number or column number. 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 @@ narrowed region and the line number relative to the whole buffer. @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 85a0ee44b9e..1165ac37b24 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -330,6 +330,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 db52d83cea4..a254ee22514 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -1667,8 +1667,9 @@ START and END." 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 @@ -1708,11 +1709,13 @@ from Lisp." (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")))) diff --git a/lisp/textmodes/paragraphs.el b/lisp/textmodes/paragraphs.el index 7daf71e990e..98eb494823d 100644 --- a/lisp/textmodes/paragraphs.el +++ b/lisp/textmodes/paragraphs.el @@ -477,7 +477,23 @@ sentences. Also, every paragraph boundary terminates sentences as well." (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 count-sentences (start end) + "Count sentences in current buffer from START to 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)))) (defun repunctuate-sentences-filter (_start _end) "Search filter used by `repunctuate-sentences' to skip unneeded spaces.