Compare commits

...

3 Commits

Author SHA1 Message Date
e2f027df57 Add custom apheleia function for formatting regions
Implemented a custom `apheleia` function to format selected regions or entire buffer using Apheleia, handling temp files and regions. Updated keybinding for `C-c f` to use this new function.
2024-08-22 11:27:42 -04:00
685230b4a8 Autoload gptel-context commands manually 2024-08-20 11:06:37 -04:00
d1147a81c3 Default to creating a new buffer when invoking gptel 2024-08-20 10:18:34 -04:00
2 changed files with 71 additions and 2 deletions

View File

@ -5,7 +5,34 @@
(use-package gptel
:commands (gptel-request)
:init
;; Annoyingly, gptel fails to require gptel-context, so we have to do it manually
(autoload 'gptel-context-add "gptel-context")
(autoload 'gptel-context-add-file "gptel-context")
:config
;; Default to creating a new buffer when invoking gptel
(defun gptel-before-advice (name &optional _ initial interactivep)
(interactive
(let* ((backend (default-value 'gptel-backend))
(backend-name
(generate-new-buffer-name (format "*%s*" (gptel-backend-name backend)))))
(list (read-buffer "Create or choose gptel buffer: "
backend-name nil ; DEFAULT and REQUIRE-MATCH
(lambda (b) ; PREDICATE
(buffer-local-value 'gptel-mode
(get-buffer (or (car-safe b) b)))))
(condition-case nil
(gptel--get-api-key
(gptel-backend-key backend))
((error user-error)
(setq gptel-api-key
(read-passwd
(format "%s API key: " backend-name)))))
(and (use-region-p)
(buffer-substring (region-beginning)
(region-end)))
t))))
(advice-add 'gptel :before #'gptel-before-advice)
(defvar gptel-backend-openai (gptel-make-openai "ChatGPT"
:key #'gptel-api-key-from-auth-source
:stream t

View File

@ -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