From 9f8fc0e5192c68a320201714779aac1568108fb3 Mon Sep 17 00:00:00 2001 From: Karthik Chikmagalur Date: Thu, 9 Mar 2023 22:58:54 -0800 Subject: [PATCH] gptel-transient: Commands to act on region gptel.el (gptel): When calling `gptel' with a selected region, insert it into a new session. gptel-transient.el (gptel--suffix-send-existing, gptel--suffix-send-new): Transient suffixes available when a region is selected. These send the text as a prompt in a existing or new gptel session. --- gptel-transient.el | 30 +++++++++++++++++++++++++++++- gptel.el | 13 +++++++++---- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/gptel-transient.el b/gptel-transient.el index f841820..78545bc 100644 --- a/gptel-transient.el +++ b/gptel-transient.el @@ -25,6 +25,7 @@ ;; ;;; Code: +(eval-when-compile (require 'cl-lib)) (require 'gptel) (require 'transient) @@ -163,8 +164,35 @@ will get progressively longer!" (read-from-minibuffer "Set temperature (0.0-2.0, leave empty for default): " (number-to-string gptel--temperature)))) +(transient-define-suffix gptel--suffix-send-existing () + "Send query in existing chat session." + :if (lambda () (use-region-p)) + :key "E" + :description "Send in existing session" + (interactive) + (when-let* ((this (buffer-name)) + (prompt (buffer-substring (region-beginning) + (region-end))) + (buf + (completing-read + "Send query in buffer: " (mapcar #'buffer-name (buffer-list)) + (lambda (buf) (and (buffer-local-value 'gptel-mode (get-buffer buf)) + (not (equal this buf))))))) + (with-current-buffer buf + (goto-char (point-max)) + (insert prompt) + (pop-to-buffer buf)))) + +(transient-define-suffix gptel--suffix-send-new () + "Send query in new session." + :if (lambda () (use-region-p)) + :description "Send in new session" + :key "N" + (interactive) + (let ((current-prefix-arg t)) (call-interactively #'gptel))) + (transient-define-suffix gptel--suffix-system-message () - "Set Establishing message sent to ChatGPT." + "Set directives sent to ChatGPT." :transient nil :description "Set custom directives" :key "h" diff --git a/gptel.el b/gptel.el index 59ea3e9..9a677a3 100644 --- a/gptel.el +++ b/gptel.el @@ -286,18 +286,23 @@ Return the message received." map)) ;;;###autoload -(defun gptel (name &optional api-key) +(defun gptel (name &optional api-key initial) "Switch to or start ChatGPT session with NAME. With a prefix arg, query for a (new) session name. -Ask for API-KEY if `gptel-api-key' is unset." +Ask for API-KEY if `gptel-api-key' is unset. + +If region is active, use it as the INITIAL prompt." (interactive (list (if current-prefix-arg (read-string "Session name: " (generate-new-buffer-name gptel-default-session)) gptel-default-session) (or gptel-api-key (setq gptel-api-key - (read-passwd "OpenAI API key: "))))) + (read-passwd "OpenAI API key: "))) + (and (use-region-p) + (buffer-substring (region-beginning) + (region-end))))) (unless api-key (user-error "No API key available")) (with-current-buffer (get-buffer-create name) @@ -308,7 +313,7 @@ Ask for API-KEY if `gptel-api-key' is unset." (visual-line-mode 1)) (t (funcall gptel-default-mode))) (unless gptel-mode (gptel-mode 1)) - (if (bobp) (insert 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")