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

    gptel-transient: Add code fences when redirecting to gptel buffer
    
    * gptel-transient.el (gptel--suffix-send): Add code fences or Org
    block markers around text when redirecting a response to a gptel
    buffer.  Skip this step if the gptel buffer will be in the same
    major-mode as the current buffer. (#1002)
---
 gptel-transient.el | 64 +++++++++++++++++++++++++++++++++---------------------
 1 file changed, 39 insertions(+), 25 deletions(-)

diff --git a/gptel-transient.el b/gptel-transient.el
index 7e9fa972d67..f6fba6e45a9 100644
--- a/gptel-transient.el
+++ b/gptel-transient.el
@@ -1544,35 +1544,49 @@ This sets the variable `gptel-include-tool-results', 
which see."
                                  (substring s 1)))
                      args))
       (setq output-to-other-buffer-p t)
-      (let ((reduced-prompt             ;For inserting into the gptel buffer as
+      (let* ((reduced-prompt            ;For inserting into the gptel buffer as
                                         ;context, not the prompt used for the
                                         ;request itself
-             (or prompt
-                 (if (use-region-p)
-                     (buffer-substring-no-properties (region-beginning)
-                                                     (region-end))
-                   (buffer-substring-no-properties
-                    (save-excursion
-                      (text-property-search-backward
-                       'gptel 'response
-                       (when (get-char-property (max (point-min) (1- (point)))
-                                                'gptel)
-                         t))
-                      (point))
-                    (gptel--at-word-end (point)))))))
+              (or prompt
+                  (if (use-region-p)
+                      (buffer-substring-no-properties (region-beginning)
+                                                      (region-end))
+                    (buffer-substring-no-properties
+                     (save-excursion
+                       (text-property-search-backward
+                        'gptel 'response
+                        (when (get-char-property (max (point-min) (1- (point)))
+                                                 'gptel)
+                          t))
+                       (point))
+                     (gptel--at-word-end (point))))))
+             (gptel-buffer (get-buffer gptel-buffer-name))
+             (gptel-buffer-mode
+              (if (buffer-live-p gptel-buffer)
+                  (buffer-local-value 'major-mode gptel-buffer)
+                gptel-default-mode)))
+        ;; Add code fences or Org block around prompt
+        (cond ((eq major-mode gptel-buffer-mode))
+              ((provided-mode-derived-p gptel-buffer-mode 'org-mode)
+               (setq reduced-prompt
+                     (concat "#+begin_src " (gptel--strip-mode-suffix 
major-mode)
+                             "\n" reduced-prompt "\n#+end_src")))
+              (t (setq reduced-prompt
+                       (concat "``` " (gptel--strip-mode-suffix major-mode) 
"\n"
+                               reduced-prompt "\n```" ))))
         (cond
-         ((buffer-live-p (get-buffer gptel-buffer-name))
+         ((buffer-live-p gptel-buffer)
           ;; Insert into existing gptel session
-          (progn
-            (setq buffer (get-buffer gptel-buffer-name))
-            (with-current-buffer buffer
-              (goto-char (point-max))
-              (unless (or buffer-read-only
-                          (get-char-property (point) 'read-only))
-                (insert reduced-prompt))
-              (setq position (point))
-              (when (and gptel-mode (not dry-run))
-                (gptel--update-status " Waiting..." 'warning)))))
+          (setq buffer gptel-buffer)
+          (with-current-buffer buffer
+            (goto-char (point-max))
+            (unless (or buffer-read-only
+                        (get-char-property (point) 'read-only))
+              (unless (bolp) (insert "\n"))
+              (insert reduced-prompt))
+            (setq position (point))
+            (when (and gptel-mode (not dry-run))
+              (gptel--update-status " Waiting..." 'warning))))
          ;; Insert into new gptel session
          (t (setq buffer
                   (gptel gptel-buffer-name

Reply via email to