summaryrefslogtreecommitdiff
path: root/modules/flycheck-config.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2025-10-12 11:47:26 -0500
committerCraig Jennings <c@cjennings.net>2025-10-12 11:47:26 -0500
commit092304d9e0ccc37cc0ddaa9b136457e56a1cac20 (patch)
treeea81999b8442246c978b364dd90e8c752af50db5 /modules/flycheck-config.el
changing repositories
Diffstat (limited to 'modules/flycheck-config.el')
-rw-r--r--modules/flycheck-config.el99
1 files changed, 99 insertions, 0 deletions
diff --git a/modules/flycheck-config.el b/modules/flycheck-config.el
new file mode 100644
index 00000000..f14d94ba
--- /dev/null
+++ b/modules/flycheck-config.el
@@ -0,0 +1,99 @@
+;;; flycheck-config --- Syntax/Grammar Check -*- lexical-binding: t; coding: utf-8; -*-
+;; author Craig Jennings <c@cjennings.net>
+
+;;; Commentary:
+
+;; This file configures Flycheck for on-demand syntax and grammar checking.
+;; - Flycheck starts automatically only in sh-mode and emacs-lisp-mode
+
+;; - This binds a custom helper (=cj/flycheck-list-errors=) to “C-; ?”
+;; for popping up Flycheck's error list in another window.
+
+;; - It also customizes Checkdoc to suppress only the “sentence-end-double-space”
+;; and “warn-escape” warnings.
+
+;; - It registers a Proselint checker for prose files
+;; (text-mode, markdown-mode, gfm-mode).
+
+;; Note: I do use proselint quite a bit in emails and org-mode files. However, some
+;; org-files can be large and running proselint on them will slow Emacs to a crawl.
+;; Therefore, hitting "C-; ?" also runs cj/flycheck-prose-on-demand if in an org buffer.
+
+;;
+;; The cj/flycheck-prose-on-demand function:
+;; - Turns on flycheck for the local buffer
+;; - ensures proselint is added
+;; - triggers an immediate check
+;;
+;; Since this is called within cj/flycheck-list-errors, flycheck's error list will still
+;; display and the focus transferred to that buffer.
+
+;; OS Dependencies:
+;; proselint (in the Arch AUR)
+
+;;; Code:
+
+(defun cj/prose-helpers-on ()
+ "Ensure that abbrev, flyspell, and flycheck are all on."
+ (interactive)
+ (if (not (abbrev-mode))
+ (abbrev-mode))
+ ;; (flyspell-on-for-buffer-type)
+ (if (not (flycheck-mode))
+ (flycheck-mode)))
+
+;; ---------------------------------- Linting ----------------------------------
+
+(use-package flycheck
+ :after custom-functions ;; for keymap binding
+ :defer t
+ :commands (flycheck-list-errors
+ cj/flycheck-list-errors)
+ :hook ((sh-mode emacs-lisp-mode) . flycheck-mode)
+ :bind
+ (:map cj/custom-keymap
+ ("?" . cj/flycheck-list-errors))
+ :custom
+ ;; Only disable these two Checkdoc warnings; leave all others intact.
+ (checkdoc-arguments
+ '(("sentence-end-double-space" nil)
+ ("warn-escape" nil)))
+ :config
+
+ ;; use the load-path of the currently running Emacs instance
+ (setq flycheck-emacs-lisp-load-path 'inherit)
+
+ ;; Define the prose checker (installed separately via OS).
+ (flycheck-define-checker proselint
+ "A linter for prose."
+ :command ("proselint" source-inplace)
+ :error-patterns
+ ((warning line-start (file-name) ":" line ":" column ": "
+ (id (one-or-more (not (any " "))))
+ (message) line-end))
+ :modes (text-mode markdown-mode gfm-mode org-mode))
+ (add-to-list 'flycheck-checkers 'proselint)
+
+ (defun cj/flycheck-list-errors ()
+ "Display flycheck's error list and switch to its buffer.
+
+Runs flycheck-prose-on-demand if in an org-buffer."
+ (interactive)
+ (when (derived-mode-p 'org-mode)
+ (cj/flycheck-prose-on-demand))
+
+ (flycheck-list-errors)
+ (switch-to-buffer-other-window "*Flycheck errors*"))
+
+ (defun cj/flycheck-prose-on-demand ()
+ "Enable Flycheck+Proselint in this buffer, run it, and show errors."
+ (interactive)
+ ;; turn on Flycheck locally
+ (flycheck-mode 1)
+ ;; ensure proselint is valid for org/text
+ (flycheck-add-mode 'proselint major-mode)
+ ;; trigger immediate check
+ (flycheck-buffer)))
+
+(provide 'flycheck-config)
+;;; flycheck-config.el ends here