From 81bb4671043be17a35ced9b44f035b8dad3e725a Mon Sep 17 00:00:00 2001 From: Karthik Chikmagalur Date: Fri, 29 Mar 2024 15:47:32 -0700 Subject: [PATCH] gptel: Set window when running post-response hook * gptel.el (gptel--insert-response): Moving point in a buffer does not move window-point in a window displaying that buffer if the window is not selected (#269). So select the gptel response window explicitly (if possible) when running `gptel-post-response-functions`. NOTE: Instead of selecting the window before running the hook, We could run `set-window-point` in the window after running it. Since the hook can have any kind of behavior (smooth-scrolling for instance) we want it to play out interactively. * gptel-curl.el (gptel--curl-stream-cleanup): Ditto. --- gptel-curl.el | 14 ++++++++++---- gptel.el | 9 +++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/gptel-curl.el b/gptel-curl.el index 7426135..581b577 100644 --- a/gptel-curl.el +++ b/gptel-curl.el @@ -238,10 +238,16 @@ PROCESS and _STATUS are process parameters." (when gptel-mode (gptel--update-status (format " Response Error: %s" http-msg) 'error)))) - (with-current-buffer gptel-buffer - (run-hook-with-args 'gptel-post-response-functions - (marker-position start-marker) - (marker-position (or tracking-marker start-marker))))) + ;; Run hook in visible window to set window-point, BUG #269 + (if-let ((gptel-window (get-buffer-window gptel-buffer 'visible))) + (with-selected-window gptel-window + (run-hook-with-args 'gptel-post-response-functions + (marker-position start-marker) + (marker-position (or tracking-marker start-marker)))) + (with-current-buffer gptel-buffer + (run-hook-with-args 'gptel-post-response-functions + (marker-position start-marker) + (marker-position (or tracking-marker start-marker)))))) (setf (alist-get process gptel-curl--process-alist nil 'remove) nil) (kill-buffer proc-buf))) diff --git a/gptel.el b/gptel.el index 7587082..1fecdb0 100644 --- a/gptel.el +++ b/gptel.el @@ -1047,8 +1047,13 @@ See `gptel--url-get-response' for details." (gptel--update-status (format " Response Error: %s" status-str) 'error) (message "gptel response error: (%s) %s" - status-str (plist-get info :error))) - (run-hook-with-args 'gptel-post-response-functions response-beg response-end)))) + status-str (plist-get info :error)))) + ;; Run hook in visible window to set window-point, BUG #269 + (if-let ((gptel-window (get-buffer-window gptel-buffer 'visible))) + (with-selected-window gptel-window + (run-hook-with-args 'gptel-post-response-functions response-beg response-end)) + (with-current-buffer gptel-buffer + (run-hook-with-args 'gptel-post-response-functions response-beg response-end))))) (defun gptel-set-topic () "Set a topic and limit this conversation to the current heading.