From 5ebaf361f1d96801f913943ce6d57f703abfb594 Mon Sep 17 00:00:00 2001 From: Karthik Chikmagalur Date: Fri, 24 Mar 2023 16:43:51 -0700 Subject: [PATCH] gptel: Handle the prompt prefix string automatically * gptel.el (gptel-prompt-prefix-alist, gptel--playback, gptel, gptel--insert-response, gptel-prompt-string): The prompt prefix string is chosen automatically from the new variable `gptel-prompt-prefix-alist', which maps major modes to the prefix string to insert. --- gptel.el | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/gptel.el b/gptel.el index 7feaca5..0e58997 100644 --- a/gptel.el +++ b/gptel.el @@ -108,7 +108,18 @@ return the transformed string." (defvar gptel-default-mode (if (featurep 'markdown-mode) 'markdown-mode 'text-mode)) -(defvar gptel-prompt-string "### ") + +;; TODO: Handle `prog-mode' using the `comment-start' variable +(defcustom gptel-prompt-prefix-alist + '((markdown-mode . "### ") + (org-mode . "*** ") + (text-mode . "### ")) + "String inserted after the response from ChatGPT. + +This is an alist mapping major modes to the prefix strings. This +is only inserted in dedicated gptel buffers." + :group 'gptel + :type '(alist :key-type symbol :value-type string)) ;; Model and interaction parameters (defvar-local gptel--system-message @@ -153,6 +164,9 @@ By default, \"openai.com\" is used as HOST and \"apikey\" as USER." "Ensure VAL is a number." (if (stringp val) (string-to-number val) val)) +(defun gptel-prompt-string () + (or (alist-get major-mode gptel-prompt-prefix-alist) "")) + (defvar-local gptel--old-header-line nil) (define-minor-mode gptel-mode "Minor mode for interacting with ChatGPT." @@ -222,7 +236,7 @@ See `gptel--url-get-response' for details." (insert content-str) (pulse-momentary-highlight-region p (point))) (when gptel-mode - (insert "\n\n" gptel-prompt-string) + (insert "\n\n" (gptel-prompt-string)) (gptel--update-header-line " Ready" 'success)))) (goto-char (- (point) 2))) (gptel--update-header-line @@ -398,7 +412,7 @@ buffer created or switched to." (visual-line-mode 1)) (t (funcall gptel-default-mode))) (unless gptel-mode (gptel-mode 1)) - (if (bobp) (insert (or initial gptel-prompt-string))) + (if (bobp) (insert (or initial (gptel-prompt-string)))) (pop-to-buffer (current-buffer)) (goto-char (point-max)) (skip-chars-backward "\t\r\n") @@ -471,7 +485,7 @@ Begin at START-PT." (min content-length (+ idx 16)))) (setq idx (+ idx 16))) (when gptel-mode - (insert "\n\n" gptel-prompt-string) + (insert "\n\n" (gptel-prompt-string)) (gptel--update-header-line " Ready" 'success)) (when start-pt (goto-char (marker-position start-pt))) (accept-change-group (symbol-value handle))