diff --git a/.emacs b/.emacs index 5a26f69..6773060 100644 --- a/.emacs +++ b/.emacs @@ -447,25 +447,68 @@ ) :config (setq cmake-tab-width 4) + + (defun atu/create-or-erase-buffer (buffer-name) + "" + (let ((existing-buffer (get-buffer buffer-name))) + (when existing-buffer + (with-current-buffer existing-buffer + (erase-buffer))) + (get-buffer-create buffer-name)) + ) + (defun atu/cmake-format-buffer () "Formats the current buffer using cmake-format" (interactive) - (shell-command-on-region - ;; region to execute on - (point-min) - (point-max) - ;; command - "cmake-format -" - ;; replace - t - ;; name of the error bufer - "* cmake-format Error Buffer *" - ;; - t)) + (let ((error-buffer (atu/create-or-erase-buffer "*cmake-format:stderr*"))) + (setq-local atu/after-save-message nil) + (if (eq 0 (call-process-region + ;;region + (point-min) + (point-max) + "cmake-format" + nil ;do not delete buffer + ;; discard stdout copy stderr to buffer + error-buffer + nil ;dont-redisplay buffer + "-" + )) + (let ((current-point (point))) + (call-process-region + (point-min) (point-max) + "cmake-format" + t t t; replace current buffer and redisplay it + "-" + ) + (goto-char (+ (point-min) current-point)) + nil + ) + (message + "cmake-format: could not format %s see buffer %s for details" + (buffer-name) error-buffer) + (current-message) + ) + ) + ) + + (defun atu/cmake-before-save-hook () + "" + (setq-local atu/after-save-message (atu/cmake-format-buffer)) + ) + + (defun atu/cmake-after-save-hook () + "" + (when atu/after-save-message + (message atu/after-save-message) + ) + ) :hook (cmake-mode . lsp-deferred) - (cmake-mode . (lambda () (add-hook 'before-save-hook 'atu/cmake-format-buffer nil 'local))) + (cmake-mode . (lambda () + (add-hook 'before-save-hook 'atu/cmake-before-save-hook nil 'local) + (add-hook 'after-save-hook 'atu/cmake-after-save-hook nil 'local)) + ) ) (use-package cc-mode