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.