From 149261ee79502284d8886a9f5133e4f6be0ba5ca Mon Sep 17 00:00:00 2001 From: Marten Lienen Date: Wed, 28 Feb 2024 07:36:06 +0100 Subject: [PATCH] gptel-transient: Avoid clashes with the custom directive key (#219) gptel-transient (gptel--system-prompt-setup): When assigning keys to directives, avoid clashes with the system-message edit key (`h`), and use an arbitrary unused key if no mnemonic key assignments are possible. --- gptel-transient.el | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/gptel-transient.el b/gptel-transient.el index 00ae53b9..39810a02 100644 --- a/gptel-transient.el +++ b/gptel-transient.el @@ -185,22 +185,18 @@ which see." (transient-parse-suffixes 'gptel-system-prompt (cl-loop for (type . prompt) in gptel-directives - with taken + ;; Avoid clashes with the custom directive key + with unused-keys = (delete ?h (number-sequence ?a ?z)) with width = (window-width) for name = (symbol-name type) - for key = - (let ((idx 0) pos) - (while (or (not pos) (member pos taken)) - (setq pos (substring name idx (1+ idx))) - (cl-incf idx)) - (push pos taken) - pos) + for key = (seq-find (lambda (k) (member k unused-keys)) name (seq-first unused-keys)) + do (setq unused-keys (delete key unused-keys)) ;; The explicit declaration ":transient transient--do-return" here ;; appears to be required for Transient v0.5 and up. Without it, these ;; are treated as suffixes when invoking `gptel-system-prompt' directly, ;; and infixes when going through `gptel-menu'. ;; TODO: Raise an issue with Transient. - collect (list (key-description key) + collect (list (key-description (list key)) (concat (capitalize name) " " (propertize " " 'display '(space :align-to 20)) (propertize