(defgroup sqlfmt nil "Easy sqlfmt invocation in Emacs" :group 'sql) (defcustom sqlfmt-executable "sqlfmt" "Location of sqlfmt executable." :type 'string) (defcustom sqlfmt-options '("--use-spaces") "Command line options to pass to sqlfmt." :type '(repeat string)) (defcustom sqlfmt-reuse-error-buffer t "Reuse the same buffer for sqlfmt errors, replacing content on new invocations, or generate new buffers on each invocation" :type 'boolean) (defun sqlfmt-buffer () (interactive) (sqlfmt-region (point-min) (point-max))) (defun sqlfmt-region (start end) "Calls sqlfmt on region" (interactive (if (use-region-p) (list (region-beginning) (region-end)) (list nil nil))) (if (not (and start end)) (error "No region active, sqlfmt cancelled")) (let* ((sqlfmt-buffer-base "*sqlfmt*") (inhibit-read-only t) (orig-buffer (current-buffer)) (orig-point (point)) (tmpbuf (if sqlfmt-reuse-error-buffer (get-buffer-create sqlfmt-buffer-base) (generate-new-buffer sqlfmt-buffer-base))) (status-code (progn (with-current-buffer tmpbuf (erase-buffer) (setq buffer-read-only t)) (apply #'call-process-region start end sqlfmt-executable nil tmpbuf nil sqlfmt-options)))) (deactivate-mark) (if (eq status-code 0) (progn (with-current-buffer orig-buffer (delete-region start end) (insert-buffer tmpbuf) (kill-buffer tmpbuf) (goto-char orig-point)) (message "sqlfmt applied")) (error "sqlfmt failed, see %s buffer for details." (buffer-name tmpbuf)))))