From af88e12eccdea7715db2088e2ff51f6f82e70781 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sat, 20 Jun 2026 22:04:24 -0400 Subject: feat(ai-term): add s-F9 step-to-next-agent, drop C-S-F9 close alias s-F9 (cj/ai-term-next) steps through the open agent buffers in name order. It's the "switch among existing agents" surface F9's toggle never provided. The cycle logic lives in a pure helper (cj/--ai-term-next-agent-buffer) with Normal/Boundary/Error coverage. The command is a thin window-mutating wrapper. I dropped the C-S-F9 close alias, leaving M-F9 as the sole close binding. I moved cj/server-shutdown off C- to C-x C so the key keeps forwarding to the terminal program inside an agent buffer. I also removed the now-unused F10 entries from term-config's ghostel exceptions. --- tests/test-ai-term--f9-in-term.el | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'tests/test-ai-term--f9-in-term.el') diff --git a/tests/test-ai-term--f9-in-term.el b/tests/test-ai-term--f9-in-term.el index dad11ffc..0477f251 100644 --- a/tests/test-ai-term--f9-in-term.el +++ b/tests/test-ai-term--f9-in-term.el @@ -26,27 +26,29 @@ (should (eq (keymap-lookup ghostel-mode-map "") #'cj/ai-term))) (ert-deftest test-ai-term-f9-family-bound-in-ghostel-mode-map () - "Normal: the C-/M-/C-S- F9 variants are bound in `ghostel-mode-map' too. -`M-' and `C-S-' both close an agent via `cj/ai-term-close'." + "Normal: the C-/s-/M- F9 variants are bound in `ghostel-mode-map' too. +`s-' steps to the next agent; `M-' closes an agent via +`cj/ai-term-close'." (should (eq (keymap-lookup ghostel-mode-map "C-") #'cj/ai-term-pick-project)) - (should (eq (keymap-lookup ghostel-mode-map "M-") #'cj/ai-term-close)) - (should (eq (keymap-lookup ghostel-mode-map "C-S-") #'cj/ai-term-close))) + (should (eq (keymap-lookup ghostel-mode-map "s-") #'cj/ai-term-next)) + (should (eq (keymap-lookup ghostel-mode-map "M-") #'cj/ai-term-close))) (ert-deftest test-ai-term-f9-still-bound-globally () "Normal: the global F9 family bindings are intact. `' toggles the ai-term agent window; `C-' picks a project -agent; `M-' and `C-S-' close an agent via `cj/ai-term-close'." +agent; `s-' steps to the next agent; `M-' closes an agent +via `cj/ai-term-close'." (should (eq (lookup-key (current-global-map) (kbd "")) #'cj/ai-term)) (should (eq (lookup-key (current-global-map) (kbd "C-")) #'cj/ai-term-pick-project)) - (should (eq (lookup-key (current-global-map) (kbd "M-")) #'cj/ai-term-close)) - (should (eq (lookup-key (current-global-map) (kbd "C-S-")) #'cj/ai-term-close))) + (should (eq (lookup-key (current-global-map) (kbd "s-")) #'cj/ai-term-next)) + (should (eq (lookup-key (current-global-map) (kbd "M-")) #'cj/ai-term-close))) (ert-deftest test-ai-term-f9-family-in-keymap-exceptions () "Regression: the F9 family is in `ghostel-keymap-exceptions' so semi-char mode lets it reach Emacs instead of forwarding it to the terminal program. Binding in `ghostel-mode-map' alone is not enough -- the semi-char map outranks it and forwards any key not in the exceptions to the pty." - (dolist (key '("" "C-" "M-" "C-S-")) + (dolist (key '("" "C-" "s-" "M-")) (should (member key ghostel-keymap-exceptions))) ;; The rebuilt semi-char map must no longer forward to the pty. (should-not (eq (keymap-lookup ghostel-semi-char-mode-map "") -- cgit v1.2.3