branch: elpa/gptel commit f5e0766a4aa7efb9f3b8dca1be1b3c5776d817a5 Author: Karthik Chikmagalur <karthikchikmaga...@gmail.com> Commit: Karthik Chikmagalur <karthikchikmaga...@gmail.com>
gptel-rewrite: Add rewrite as a merge conflict * gptel-rewrite.el (gptel--rewrite-merge, gptel--rewrite-key-help, gptel--suffix-rewrite-merge, gptel-rewrite-menu, gptel-rewrite-actions-map): Add command to add LLM rewrite as a merge conflict. --- gptel-rewrite.el | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/gptel-rewrite.el b/gptel-rewrite.el index bb6c6e4def..9f8c6f0158 100644 --- a/gptel-rewrite.el +++ b/gptel-rewrite.el @@ -56,7 +56,8 @@ for a particular major-mode." "C-c C-d" #'gptel--rewrite-diff "C-c C-e" #'gptel--rewrite-ediff "C-c C-n" #'gptel--rewrite-next - "C-c C-p" #'gptel--rewrite-previous) + "C-c C-p" #'gptel--rewrite-previous + "C-c C-m" #'gptel--rewrite-merge) (defvar-local gptel--rewrite-overlays nil "List of active rewrite overlays in the buffer.") @@ -93,7 +94,7 @@ CALLBACK is supplied by Eldoc, see (when (and gptel--rewrite-overlays (get-char-property (point) 'gptel-rewrite)) (funcall callback - (format (substitute-command-keys "%s rewrite available: apply \\[gptel--rewrite-apply], clear \\[gptel--rewrite-clear], diff \\[gptel--rewrite-diff] or ediff \\[gptel--rewrite-ediff]") + (format (substitute-command-keys "%s rewrite available: accept \\[gptel--rewrite-apply], clear \\[gptel--rewrite-clear], merge \\[gptel--rewrite-merge], diff \\[gptel--rewrite-diff] or ediff \\[gptel--rewrite-ediff]") (propertize (concat (gptel-backend-name gptel-backend) ":" gptel-model) 'face 'mode-line-emphasis))))) @@ -216,6 +217,26 @@ the changed regions. BUF is the (current) buffer." (add-hook 'ediff-quit-hook gptel--ediff-restore) (ediff-buffers (current-buffer) newbuf))) +(defun gptel--rewrite-merge (&optional ovs) + "Insert pending LLM responses in OVS as merge conflicts." + (interactive (list (gptel--rewrite-overlay-at))) + (let ((changed)) + (dolist (ov (ensure-list ovs)) + (save-excursion + (when-let (new-str (overlay-get ov 'gptel-rewrite)) + ;; Insert merge + (goto-char (overlay-start ov)) + (unless (bolp) (insert "\n")) + (insert-before-markers "<<<<<<< original\n") + (goto-char (overlay-end ov)) + (unless (bolp) (insert "\n")) + (insert + "=======\n" new-str + "\n>>>>>>> " (gptel-backend-name gptel-backend) "\n") + (setq changed t)))) + (when changed (smerge-mode 1))) + (gptel--rewrite-clear ovs)) + ;; * Transient Prefix for rewriting/refactoring ;;;###autoload (autoload 'gptel-rewrite-menu "gptel-rewrite" nil t) @@ -241,6 +262,7 @@ the changed regions. BUF is the (current) buffer." :if (lambda () (gptel--rewrite-sanitize-overlays)) (gptel--suffix-rewrite-diff) (gptel--suffix-rewrite-ediff) + (gptel--suffix-rewrite-merge) (gptel--suffix-rewrite-apply) "Cancel" (gptel--suffix-rewrite-clear)]] @@ -326,8 +348,9 @@ the changed regions. BUF is the (current) buffer." (propertize hint-str 'face 'success))) (overlay-put ov 'help-echo (format "%s rewrite available: -- apply \\[gptel--rewrite-apply], +- accept \\[gptel--rewrite-apply], - clear \\[gptel--rewrite-clear], +- merge \\[gptel--accept-merge], - diff \\[gptel--rewrite-diff], - ediff \\[gptel--rewrite-ediff]" (propertize (concat (gptel-backend-name gptel-backend) @@ -360,11 +383,20 @@ the changed regions. BUF is the (current) buffer." (interactive) (gptel--rewrite-ediff gptel--rewrite-overlays)) +(transient-define-suffix gptel--suffix-rewrite-merge () + "Insert LLM output as merge conflicts" + :if (lambda () gptel--rewrite-overlays) + :key "ce" + :description (concat "LLM " (downcase (gptel--refactor-or-rewrite)) + "s as merge conflicts") + (interactive) + (gptel--rewrite-merge gptel--rewrite-overlays)) + (transient-define-suffix gptel--suffix-rewrite-apply () - "Apply pending LLM rewrites." + "Accept pending LLM rewrites." :if (lambda () gptel--rewrite-overlays) :key "ca" - :description (concat "Apply all pending LLM " + :description (concat "Accept all pending LLM " (downcase (gptel--refactor-or-rewrite)) "s") (interactive)