[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/spell-fu 3f4fc34204 32/86: Add 'spell-fu-buffer' utility
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/spell-fu 3f4fc34204 32/86: Add 'spell-fu-buffer' utility |
Date: |
Thu, 7 Jul 2022 12:03:41 -0400 (EDT) |
branch: elpa/spell-fu
commit 3f4fc342049f27b76e31ee21f6af03d2b155df82
Author: Campbell Barton <ideasman42@gmail.com>
Commit: Campbell Barton <ideasman42@gmail.com>
Add 'spell-fu-buffer' utility
While you shouldn't have to use this, it may be useful to check the
entire buffer to iterate over all errors or to report errors.
---
spell-fu.el | 135 +++++++++++++++++++++++++++++++++++++++---------------------
1 file changed, 89 insertions(+), 46 deletions(-)
diff --git a/spell-fu.el b/spell-fu.el
index aa2b0c14bc..a3eec4b8aa 100644
--- a/spell-fu.el
+++ b/spell-fu.el
@@ -396,6 +396,7 @@ On failure of any kind, return nil, the caller will need to
regenerate the cache
(message "failed, %s" (error-message-string err))
nil)))))
+
;; ---------------------------------------------------------------------------
;; Word List Initialization
;;
@@ -572,55 +573,57 @@ If optional arguments POINT-START and POINT-END exist
remove overlays from
range POINT-START to POINT-END. Otherwise remove all overlays."
(remove-overlays point-start point-end 'spell-fu-pending t))
+(defun spell-fu--idle-handle-pending-ranges-impl (visible-start visible-end)
+ "VISIBLE-START and VISIBLE-END typically from `window-start' and
`window-end'.
+
+Although you can pass in specific ranges as needed,
+when checking the entire buffer for example."
+ (let ((overlays-in-view (overlays-in visible-start visible-end)))
+ (while overlays-in-view
+ (let ((item-ov (pop overlays-in-view)))
+ (when
+ (and
+ (overlay-get item-ov 'spell-fu-pending)
+ ;; It's possible these become invalid while looping over items.
+ (overlay-buffer item-ov))
+
+ (let
+ ( ;; Window clamped range.
+ (point-start (max visible-start (overlay-start item-ov)))
+ (point-end (min visible-end (overlay-end item-ov))))
+
+ ;; Expand so we don't spell check half a word.
+ (spell-fu--setq-expand-range-to-line-boundaries
+ ;; Warning these values are set in place.
+ point-start point-end)
+
+ (when
+ (condition-case err
+ ;; Needed so the idle timer won't quit mid-spelling.
+ (let ((inhibit-quit nil))
+ (funcall spell-fu-check-range point-start point-end)
+ t)
+ (error
+ (progn
+ ;; Keep since this should be very rare.
+ (message "Early exit 'spell-fu-mode': %s"
(error-message-string err))
+ ;; Break out of the loop.
+ (setq overlays-in-view nil)
+ nil)))
+
+ ;; Don't delete the overlay since it may extend outside the
window bounds,
+ ;; always delete the range instead.
+ ;;
+ ;; While we could remove everything in the window range,
+ ;; avoid this because it's possible `spell-fu-check-range' is
interrupted.
+ ;; Allowing interrupting is important, so users may set this to
a slower function
+ ;; which doesn't lock up Emacs as this is run from an idle timer.
+ (spell-fu--idle-remove-overlays point-start point-end))))))))
+
(defun spell-fu--idle-handle-pending-ranges ()
"Spell check the on-screen overlay ranges."
(when (bound-and-true-p spell-fu-mode)
- (let*
- ( ;; Don't show the cursor motion from spell checking.
- (visible-start (window-start))
- (visible-end (window-end))
- (overlays-in-view (overlays-in visible-start visible-end)))
-
- (while overlays-in-view
- (let ((item-ov (pop overlays-in-view)))
- (when
- (and
- (overlay-get item-ov 'spell-fu-pending)
- ;; It's possible these become invalid while looping over items.
- (overlay-buffer item-ov))
-
- (let
- ( ;; Window clamped range.
- (point-start (max visible-start (overlay-start item-ov)))
- (point-end (min visible-end (overlay-end item-ov))))
-
- ;; Expand so we don't spell check half a word.
- (spell-fu--setq-expand-range-to-line-boundaries
- ;; Warning these values are set in place.
- point-start point-end)
-
- (when
- (condition-case err
- ;; Needed so the idle timer won't quit mid-spelling.
- (let ((inhibit-quit nil))
- (funcall spell-fu-check-range point-start point-end)
- t)
- (error
- (progn
- ;; Keep since this should be very rare.
- (message "Early exit 'spell-fu-mode': %s"
(error-message-string err))
- ;; Break out of the loop.
- (setq overlays-in-view nil)
- nil)))
-
- ;; Don't delete the overlay since it may extend outside the
window bounds,
- ;; always delete the range instead.
- ;;
- ;; While we could remove everything in the window range,
- ;; avoid this because it's possible `spell-fu-check-range' is
interrupted.
- ;; Allowing interrupting is important, so users may set this
to a slower function
- ;; which doesn't lock up Emacs as this is run from an idle
timer.
- (spell-fu--idle-remove-overlays point-start point-end)))))))))
+ (spell-fu--idle-handle-pending-ranges-impl (window-start) (window-end))))
(defun spell-fu--idle-font-lock-region-pending (point-start point-end)
"Track the range to spell check, adding POINT-START & POINT-END to the
queue."
@@ -660,6 +663,46 @@ range POINT-START to POINT-END. Otherwise remove all
overlays."
(spell-fu--idle-remove-overlays))
+;; ---------------------------------------------------------------------------
+;; Public Functions
+
+(defun spell-fu-region (&optional point-start point-end verbose)
+ "Spell check the region between POINT-START and POINT-END, VERBOSE reports
the findings."
+ ;; Expand range to line bounds, when set.
+ (when (or point-start point-end)
+ (unless point-start
+ (setq point-start (point-min)))
+ (unless point-end
+ (setq point-end (point-max)))
+ (spell-fu--setq-expand-range-to-line-boundaries
+ ;; Warning these values are set in place.
+ point-start point-end))
+
+ (setq point-start (or point-start (point-min)))
+ (setq point-end (or point-end (point-max)))
+
+ (jit-lock-fontify-now point-start point-end)
+
+ ;; Ensure idle timer is handled immediately.
+ (cond
+ ((<= spell-fu-idle-delay 0.0)
+ nil)
+ (t
+ (spell-fu--idle-handle-pending-ranges-impl point-start point-end)))
+
+ (when verbose
+ (let ((count 0))
+ (dolist (item-ov (overlays-in point-start point-end))
+ (when (overlay-get item-ov 'spell-fu-mode)
+ (setq count (1+ count))))
+ (message "Spell-fu: %d misspelled word(s) found!" count))))
+
+(defun spell-fu-buffer ()
+ "Spell check the whole buffer."
+ (interactive)
+ (spell-fu-region nil nil t))
+
+
;; ---------------------------------------------------------------------------
;; Define Minor Mode
;;
- [nongnu] elpa/spell-fu 1299bfca2e 85/86: Merge pull request 'Fix wrong function name for multiple languages example' (#27) from kepi/emacs-spell-fu:master into master, (continued)
- [nongnu] elpa/spell-fu 1299bfca2e 85/86: Merge pull request 'Fix wrong function name for multiple languages example' (#27) from kepi/emacs-spell-fu:master into master, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 907271a557 03/86: Cleanup: unnecessary 'let' nesting, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 3898e6f591 04/86: Cleanup: remove use of exception handling, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu ae4504f14d 07/86: Fix using hard coded en_US dictionary, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu f2b7d58e87 08/86: Cleanup: correct comment, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 1e6928f77d 05/86: Cleanup: add message for generating cache, some comments, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu bd76cb262e 15/86: Avoid 2x loops over the pending screen overlays, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 4f9732492c 01/86: Initial code., ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 6a7440044e 19/86: Cleanup: rename variables to make the assignment explicit, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 5915e0ae2a 24/86: Cleanup: use safer sharp-quoted function names, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 3f4fc34204 32/86: Add 'spell-fu-buffer' utility,
ELPA Syncer <=
- [nongnu] elpa/spell-fu ddad489f2c 43/86: Adds affix dict support via aspell expand cmd, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu ce64f4bc4d 51/86: Cleanup: remove arguments that are always fixed, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 1b765f8029 58/86: Cleanup: replace setq with let binding, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 1159eeec13 63/86: Fix including trailing single-quote in the word, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 32fcbd9e8e 68/86: Initial changes for multiple dictionaries, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 1f3e5b8f05 72/86: readme: Fix typos, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 2f2fd6de00 83/86: Change URL to codeberg, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 00b75e5741 25/86: Cleanup: docstring, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu 1bc18879b6 27/86: Add license file, ELPA Syncer, 2022/07/07
- [nongnu] elpa/spell-fu d0700095ea 28/86: Add header to cache loading & error checking for cache content, ELPA Syncer, 2022/07/07