diff --git a/emacs/.emacs.d/config/init-ide.el b/emacs/.emacs.d/config/init-ide.el index 794f94c..bcb48b5 100644 --- a/emacs/.emacs.d/config/init-ide.el +++ b/emacs/.emacs.d/config/init-ide.el @@ -282,10 +282,52 @@ ;; Code formatting library (use-package apheleia :straight (apheleia :host github :repo "raxod502/apheleia") + :commands apheleia-format-buffer + :autoload apheleia--get-formatters :config (add-to-list 'apheleia-mode-alist '(ruby-mode . (rubocop))) - :general - (prog-mode-map "C-c f" #'apheleia-format-buffer)) + (add-to-list 'apheleia-mode-alist '(ruby-ts-mode . (rubocop)))) + +(defun apheleia () + "Format the region or current buffer using Apheleia." + (interactive) + (let* ((buf (current-buffer)) + (name (buffer-file-name)) + (temp-file (make-temp-file "apheleia" nil (format ".%s" (file-name-extension name)))) + (temp-buffer (find-file-noselect temp-file)) + (formatters (apheleia--get-formatters)) + (line (line-number-at-pos)) + (col (current-column)) + start + end) + (if (region-active-p) + (setq start (region-beginning) + end (region-end)) + (setq start (point-min) + end (point-max))) + (with-current-buffer temp-buffer + (erase-buffer) + (insert-buffer-substring buf start end) + (write-file temp-file) + (apheleia-format-buffer formatters + (lambda () + (with-current-buffer buf + (delete-region start end) + (insert-buffer-substring temp-buffer) + (goto-char (point-min)) + (forward-line (1- line)) + (move-to-column col) + (delete-file temp-file) + (when (get-buffer temp-buffer) + (kill-buffer temp-buffer)))) + :callback (lambda (&rest args) + (when-let ((error (plist-get args :error))) + (delete-file temp-file) + (when (get-buffer temp-buffer) + (kill-buffer temp-buffer)) + (error "Formatting failed: %s" error))))))) + +(keymap-set prog-mode-map "C-c f" #'apheleia) ;; AI assistance (use-package copilot