aboutsummaryrefslogtreecommitdiff
path: root/modules/system-lib.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-20 11:32:21 -0400
committerCraig Jennings <c@cjennings.net>2026-06-20 11:32:21 -0400
commit5b5d24b5d14b9828b2acc2e39b4530be9091e512 (patch)
tree7f754389fd8d62d148a76ce21b7b055177d5a463 /modules/system-lib.el
parented7e6b2a89fc31d2e23f2c53f8af49d3ff00586d (diff)
downloaddotemacs-5b5d24b5d14b9828b2acc2e39b4530be9091e512.tar.gz
dotemacs-5b5d24b5d14b9828b2acc2e39b4530be9091e512.zip
refactor: extract shared format-region helper into system-lib
prog-json and prog-yaml each carried a byte-identical cj/--<lang>-format-region that runs a formatter over the buffer via call-process-region and replaces it on exit 0. Hoist it to system-lib as cj/format-region-with-program with a generic output buffer, and point both formatters at it. Adds the first direct unit coverage of the helper (Normal, Boundary, Error).
Diffstat (limited to 'modules/system-lib.el')
-rw-r--r--modules/system-lib.el24
1 files changed, 24 insertions, 0 deletions
diff --git a/modules/system-lib.el b/modules/system-lib.el
index ed98a476e..49bb6cd1a 100644
--- a/modules/system-lib.el
+++ b/modules/system-lib.el
@@ -164,5 +164,29 @@ contributes its own modes regardless of load order."
(setq font-lock-global-modes
(cj/--font-lock-global-modes-excluding font-lock-global-modes mode))))
+(defun cj/format-region-with-program (program &rest args)
+ "Replace the current buffer with PROGRAM ARGS run over its contents, via argv.
+Runs PROGRAM (with ARGS) on the whole buffer through `call-process-region'
+-- no shell, so no quoting or word-splitting. The buffer is replaced only
+when PROGRAM exits zero; on a non-zero exit the buffer is left untouched and
+a `user-error' is signalled with the program's stderr text. Point is
+preserved as closely as the reformatted size allows. Returns t on success."
+ (let* ((point (point))
+ (src (current-buffer))
+ (out (generate-new-buffer " *format-out*"))
+ (status (apply #'call-process-region
+ (point-min) (point-max) program
+ nil out nil args)))
+ (unwind-protect
+ (if (and (integerp status) (zerop status))
+ (progn
+ (with-current-buffer src
+ (replace-buffer-contents out)
+ (goto-char (min point (point-max))))
+ t)
+ (user-error "%s failed: %s" program
+ (string-trim (with-current-buffer out (buffer-string)))))
+ (kill-buffer out))))
+
(provide 'system-lib)
;;; system-lib.el ends here