branch: elpa/gptel
commit 94bf19da93aee9a101429d7ecbfbb9c7c5b67216
Author: Karthik Chikmagalur <karthikchikmaga...@gmail.com>
Commit: Karthik Chikmagalur <karthikchikmaga...@gmail.com>

    gptel: Convert with-buffer-copy to internal defun
    
    * gptel.el (gptel--with-buffer-copy)
    (gptel--with-buffer-copy-internal): Convert
    `gptel--with-buffer-copy' to a trivial macro, and move the
    buffer-copy logic to a dedicated defun,
    `gptel--with-buffer-copy-internal'.  This is to avoid variable
    capturing, evaluate args only once, and for better
    (e)debuggability.
    
    This change is made on the advisement of Stefan Monnier:
    https://yhetil.org/emacs-devel/jwva56s3mbm.fsf-monnier+em...@gnu.org
---
 gptel.el | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/gptel.el b/gptel.el
index ea5b4af55b..ef410eaa06 100644
--- a/gptel.el
+++ b/gptel.el
@@ -1073,22 +1073,24 @@ Compatibility macro for Emacs 27.1."
   "Copy gptel's local variables from BUF to a temp buffer and run BODY.
 
 If positions START and END are provided, insert that part of BUF first."
-  (declare (indent 3))
-  (let ((temp-buffer (make-symbol "temp-buffer")))
-    `(let ((,temp-buffer (gptel--temp-buffer " *gptel-prompt*")))
-      (with-current-buffer ,temp-buffer
-       (dolist (sym '( gptel-backend gptel--system-message gptel-model
-                       gptel-mode gptel-track-response gptel-track-media
-                       gptel-use-tools gptel-tools gptel-use-curl
-                       gptel-use-context gptel--num-messages-to-send
-                       gptel-stream gptel-include-reasoning
-                       gptel-temperature gptel-max-tokens gptel-cache))
-        (set (make-local-variable sym)
-         (buffer-local-value sym ,buf)))
-       ,(when (and start end)
-         `(insert-buffer-substring ,buf ,start ,end))
-       (setq major-mode (buffer-local-value 'major-mode ,buf))
-       ,@body))))
+  `(gptel--with-buffer-copy-internal ,buf ,start ,end (lambda () ,@body)))
+
+(defun gptel--with-buffer-copy-internal (buf start end body-thunk)
+  "Prepare a temp buffer for a gptel request.
+
+For BUF, START, END and BODY-THUNK see `gptel--with-buffer-copy'."
+  (let ((temp-buffer (gptel--temp-buffer " *gptel-prompt*")))
+    (with-current-buffer temp-buffer
+      (dolist (sym '( gptel-backend gptel--system-message gptel-model
+                      gptel-mode gptel-track-response gptel-track-media
+                      gptel-use-tools gptel-tools gptel-use-curl
+                      gptel-use-context gptel--num-messages-to-send
+                      gptel-stream gptel-include-reasoning
+                      gptel-temperature gptel-max-tokens gptel-cache))
+        (set (make-local-variable sym) (buffer-local-value sym buf)))
+      (when (and start end) (insert-buffer-substring buf start end))
+      (setq major-mode (buffer-local-value 'major-mode buf))
+      (funcall body-thunk))))
 
 (defsubst gptel--trim-prefixes (s)
   "Remove prompt/response prefixes from string S.

Reply via email to