From 9278ddd4ea1a8b1a4c1edaa8894516e3f48d245b Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Thu, 14 Aug 2025 19:24:49 -0500 Subject: refactor(system-utils): major refactoring / adding tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Theme: Modularize system-utilities into separate modules. Clean up any typos, buts, and unused variables. Add some initial ERT tests for new modules created. Changes: - Extract file handling into its own module (file-config) - Extract keyboard macro management into its own module (keyboard-macros) - Extract buffer burying (instead of killing) into its own module (undead-buffers) - Extract all date/time config into its own module (chrono-tools) - Moved keybinding discovery functionality and help into keybindings module - Combine flyspell and abbrev (spell-check and autocorrect) to flyspell-and-abbrev.el - Rename epa-config.el to auth-config.el for auth-source and epa settings. - Refactor `cj/kill-other-window` for more accurate buffer handling. - Include "*ert*" in the default bury (don't kill) list as killing it kills test runs. - Bind C-c M-m to inhibit-mouse-mode - Remove the unused ledger-file variable in user-constants.el. - Removed obsolete C-x x m, C-x x r, and C-x x d key mappings. - C-; b r to call cj/rename-buffer-and-file instead of typo’d function - Other purely cosmetic comment changes to system-utils.el ERT tests: - Rename ERT test definitions to include module scopes (file-config, keyboard-macros) - Add an ERT test for the timer bell's existence. - Add ERT tests to cover `cj/kill-buffer-or-bury-alive`, prefix-arg behavior, window-killing commands, and bulk operations. - Add test `authinfo-file` exists Missing authinfo triggers a debug message - Add test that `gpg2` executable is on the user’s PATH - Remove outdated authinfo test. - Add “Run these tests” note where missing. --- modules/flyspell-config.el | 202 --------------------------------------------- 1 file changed, 202 deletions(-) delete mode 100644 modules/flyspell-config.el (limited to 'modules/flyspell-config.el') diff --git a/modules/flyspell-config.el b/modules/flyspell-config.el deleted file mode 100644 index 89fd25a1..00000000 --- a/modules/flyspell-config.el +++ /dev/null @@ -1,202 +0,0 @@ -;;; flyspell-config.el --- Spell Check Configuration -*- lexical-binding: t; -*- -;; author Craig Jennings - -;;; Commentary: - -;; Spell-Checking: Flyspell - -;; C-' is now my main interface for all spell checking. - -;; The workflow is that it finds the nearest misspelled word above where the -;; cursor is, allows for saving or correcting, then stops. You may proceed to -;; the next misspelling by selecting C-' again. - -;; Flyspell will automatically run in a mode appropriate for the buffer type -;; - if it's a programming mode, it will only check comments -;; - if in text mode, it will check everything -;; - otherwise it will turn off. -;; This check happens on every mode switch. - -;; If you want flyspell on in another mode (say fundamental mode), or you want -;; to turn it off, you can toggle flyspell's state with 'C-c f' - -;; The nicest thing is that each spell correction creates an abbrev. This -;; essentially is a shortcut that expands that same misspelling to the correct -;; spelling the next time it's typed. That idea comes courtesy Artur Malabarba, -;; and it's increased my overall typing speed. - -;; Original idea here: -;; http://endlessparentheses.com/ispell-and-abbrev-the-perfect-auto-correct.html - -;; The code below is my refactoring of Artur Malabarba's code, and using -;; flyspell rather than ispell. - -;; -;; Use M-o to get to 'other options', like saving to your personal dictionary. - -;; Note that the keybinding typically taken for the flyspell-mode-map "C-;" has -;; been deliberately hijacked in custom-functions.el for my personal-keymap. -;; This is the code run there: - -;; (eval-after-load "flyspell" -;; '(define-key flyspell-mode-map (kbd "C-;") nil)) - -;;; Code: - -;; ---------------------------- Ispell And Flyspell ---------------------------- - - -(use-package ispell - :defer .5 - :ensure nil ;; built-in - :config - (setq ispell-alternate-dictionary - (concat user-emacs-directory "assets/english-words.txt")) - (setq ispell-dictionary "american") ; better for aspell - ;; use aspell rather than ispell - (setq ispell-program-name "aspell") - ;; aspell is in /usr/local/ on BSD - (cond ((eq system-type 'berkeley-unix) - (setq ispell-program-name "/usr/local/bin/aspell"))) - - ;; in aspell "-l" means --list, not --lang - (setq ispell-list-command "--list") - (setq ispell-extra-args '("--sug-mode=ultra" "-W" "3" "--lang=en_US")) - (setq ispell-local-dictionary "en_US") - (setq ispell-local-dictionary-alist - '(("en_US" "[[:alpha:]]" "[^[:alpha:]]" "['‘’]" - t ;; Many other characters - ("-d" "en_US") nil utf-8))) - ;; personal directory goes with sync'd files - (setq ispell-personal-dictionary - (concat sync-dir "aspell-personal-dictionary")) - ;; skip code blocks in org mode - (add-to-list 'ispell-skip-region-alist '("^#+BEGIN_SRC" . "^#+END_SRC"))) - - -(use-package flyspell - :defer .5 - :after ispell - :ensure nil ;; built-in - :config - ;; don't print message for every word when checking - (setq flyspell-issue-message-flag nil)) - -(use-package flyspell-correct - :after flyspell - :defer .5) - -(use-package flyspell-correct-ivy - :after flyspell-correct - :defer .5) - -;; ------------------------------ Flyspell Toggle ------------------------------ -;; easy toggling flyspell and also leverage the 'for-buffer-type' functionality. - -;; (defun flyspell-toggle () -;; "Turn Flyspell on if it is off, or off if it is on. -;; When turning on,it uses `flyspell-on-for-buffer-type' so code-vs-text is -;; handled appropriately." -;; (interactive) -;; (if (symbol-value flyspell-mode) -;; (progn ; flyspell is on, turn it off -;; (message "Flyspell off") -;; (flyspell-mode -1)) -;; ;; else - flyspell is off, turn it on -;; (progn -;; (flyspell-on-for-buffer-type) -;; (message "Flyspell on")))) -;; (define-key global-map (kbd "C-c f") 'flyspell-toggle ) - -;; ------------------------ Flyspell On For Buffer Type ------------------------ -;; check strings and comments in prog mode; check everything in text mode - -;; (defun flyspell-on-for-buffer-type () -;; "Enable Flyspell for the major mode and check the current buffer. -;; If flyspell is already enabled, do nothing. If the mode is derived from -;; `prog-mode', enable `flyspell-prog-mode' so only strings and comments get -;; checked. If the buffer is text based `flyspell-mode' is enabled to check -;; all text." -;; (interactive) -;; (unless flyspell-mode ; if not already on -;; (cond -;; ((derived-mode-p 'prog-mode) -;; (flyspell-prog-mode) -;; (flyspell-buffer) -;; ((derived-mode-p 'text-mode) -;; (flyspell-mode 1) -;; (flyspell-buffer)))))) - -;; (add-hook 'after-change-major-mode-hook 'flyspell-on-for-buffer-type) -;; (add-hook 'find-file-hook 'flyspell-on-for-buffer-type) - -;; ---------------------------- Flyspell Then Abbrev --------------------------- -;; Spell check the buffer and create abbrevs to avoid future misspellings. - -(require 'files) -(setq save-abbrevs 'silently) -(setq-default abbrev-mode t) - -(defun cj/find-previous-flyspell-overlay (position) - "Locate the Flyspell overlay immediately previous to a given POSITION." - ;; sort the overlays into position order - (let ((overlay-list (sort (overlays-in (point-min) position) - (lambda (a b) - (> (overlay-start a) (overlay-start b)))))) - ;; search for previous flyspell overlay - (while (and overlay-list - (or (not (flyspell-overlay-p (car overlay-list))) - ;; check if its face has changed - (not (eq (get-char-property - (overlay-start (car overlay-list)) 'face) - 'flyspell-incorrect)))) - (setq overlay-list (cdr overlay-list))) - ;; if no previous overlay exists, return nil - (when overlay-list - ;; otherwise, return the overlay start position - (overlay-start (car overlay-list))))) - - -(defun cj/flyspell-goto-previous-misspelling (position) - "Go to the first misspelled word before the given POSITION. -Return the misspelled word if found or nil if not. Leave the point at the -beginning of the misspelled word. Setting the hook on pre-command ensures that -any started Flyspell corrections complete before running other commands in the -buffer." - (interactive "d") - (add-hook 'pre-command-hook - (function flyspell-auto-correct-previous-hook) t t) - (let* ((overlay-position (cj/find-previous-flyspell-overlay position)) - (misspelled-word (when overlay-position - (goto-char overlay-position) - (thing-at-point 'word)))) - (if misspelled-word - (downcase misspelled-word) - nil))) - -(defun cj/flyspell-then-abbrev (p) - "Call \='flyspell-correct-at-point\=' and create abbrev for future corrections. -The abbrev is created in the local dictionary unless the prefix P -argument is provided, when it's created in the global dictionary." - (interactive "P") - (flyspell-buffer) - (save-excursion - (let (misspelled-word corrected-word) - (while (setq misspelled-word - (cj/flyspell-goto-previous-misspelling (point))) - (call-interactively 'flyspell-correct-at-point) - (setq corrected-word (downcase (or (thing-at-point 'word) ""))) - (when (and misspelled-word corrected-word - (not (string= corrected-word misspelled-word))) - (message "\"%s\" now expands to \"%s\" %sally" - misspelled-word corrected-word (if p "loc" "glob")) - (define-abbrev - (if p local-abbrev-table global-abbrev-table) - misspelled-word corrected-word)) - (goto-char (point-min)))) - (message "Spell check complete."))) - -(define-key global-map (kbd "C-'") 'cj/flyspell-then-abbrev) - -(provide 'flyspell-config) -;;; flyspell-config.el ends here. -- cgit v1.2.3