branch: elpa/gptel
commit 3e7a4eb83c934a0071ea6c9d10bfb29a9d958706
Author: Karthik Chikmagalur <[email protected]>
Commit: karthink <[email protected]>

    gptel-context: Better context buffer navigation
    
    * gptel-context.el (gptel-context-previous, gptel-context-next):
    Recenter appropriately when moving.  Fix gptel-context-previous
    jumping beyond first context.  Make slight aesthetic tweaks to
    context buffer
---
 gptel-context.el | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/gptel-context.el b/gptel-context.el
index 8f5740df1d..76d68de311 100644
--- a/gptel-context.el
+++ b/gptel-context.el
@@ -337,7 +337,7 @@ context overlays, see `gptel-context--alist'."
       (save-excursion
         (let ((contexts gptel-context--alist))
           (if (length> contexts 0)
-              (let (beg ov l1 l2)
+              (let ((first t) beg ov l1 l2)
                 (pcase-dolist (`(,buf . ,ovs) contexts)
                   (if (bufferp buf)
                       ;; It's a buffer with some overlay(s)
@@ -345,8 +345,10 @@ context overlays, see `gptel-context--alist'."
                         (with-current-buffer buf
                           (setq l1 (line-number-at-pos (overlay-start 
source-ov))
                                 l2 (line-number-at-pos (overlay-end 
source-ov))))
-                        (insert (make-separator-line)
-                                (propertize (format "In buffer %s (lines 
%d-%d):\n\n"
+                        (if (not first)
+                            (insert "\n")
+                          (setq first nil))
+                        (insert (propertize (format "In buffer %s (lines 
%d-%d):\n\n"
                                                     (buffer-name buf) l1 l2)
                                             'face 'bold))
                         (setq beg (point))
@@ -356,10 +358,13 @@ context overlays, see `gptel-context--alist'."
                         (overlay-put ov 'gptel-context source-ov)
                         (overlay-put ov 'gptel-overlay t)
                         (overlay-put ov 'evaporate t)
-                        (insert "\n"))
+                        (insert "\n\n")
+                        (insert (make-separator-line)))
                     ;; BUF is a file path, not a buffer
-                    (insert (make-separator-line)
-                            (propertize (format "In file %s:\n\n" 
(file-name-nondirectory buf))
+                    (if (not first)
+                        (insert "\n")
+                      (setq first nil))
+                    (insert (propertize (format "In file %s:\n\n" 
(file-name-nondirectory buf))
                                         'face 'bold))
                     (setq beg (point))
                     (insert-file-contents buf)
@@ -368,7 +373,8 @@ context overlays, see `gptel-context--alist'."
                     (overlay-put ov 'gptel-context buf)
                     (overlay-put ov 'gptel-overlay t)
                     (overlay-put ov 'evaporate t)
-                    (insert "\n\n")))
+                    (insert "\n\n")
+                    (insert (make-separator-line))))
                 (goto-char (point-min)))
             (insert "There are no active gptel contexts.")))))
     (display-buffer (current-buffer)
@@ -421,16 +427,21 @@ If non-nil, indicates backward movement.")
       (setq next-start (next-overlay-change next-start)))
     (when (/= next-start (point-max))
       (setq gptel-context--buffer-reverse nil)
-      (goto-char next-start))))
+      (goto-char next-start)
+      (recenter (floor (window-height) 4)))))
 
 (defun gptel-context-previous ()
   "Move to previous gptel context chunk."
   (interactive)
   (let ((ov-here (car (overlays-at (point)))))
     (when ov-here (goto-char (overlay-start ov-here)))
-    (goto-char (previous-overlay-change
-                (previous-overlay-change (point))))
-    (setq gptel-context--buffer-reverse t)))
+    (let ((previous-context-pos (previous-overlay-change
+                                 (previous-overlay-change (point)))))
+      ;; Prevent point from jumping to the start of the buffer.
+      (unless (= previous-context-pos (point-min))
+        (goto-char previous-context-pos)
+        (recenter (floor (window-height) 4))
+        (setq gptel-context--buffer-reverse t)))))
 
 (defun gptel-context-flag-deletion ()
   "Mark gptel context chunk at point for removal."

Reply via email to