From 47b218ed15acd00c18cbc3bef604c4f2e0050a08 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Thu, 7 May 2026 19:25:18 -0500 Subject: feat(ai-vterm): add Claude launcher with vertical-split vterm The new module picks a Claude-template project from a filtered completing-read list. It scans the same roots the `ai` shell launcher uses, then opens or reuses a vterm buffer named `claude []` on the right. F9 launches it. The prior `cj/toggle-gptel` binding moves from F9 to C-F9 so both AI tools share the same physical key. The display rule chains reuse-window -> use-some-window -> in-direction (right). The resulting window isn't dedicated. That matters because side-window dedication was breaking `buffer-move` (C-M-arrows) and `switch-to-buffer` replacement on the claude buffer. I also narrowed `vterm-toggle`'s display rule to skip `claude [` buffers. Otherwise it claimed them first with its bottom-split + dedicated treatment. I added 23 tests across 5 files: the buffer-name transform, candidate walker, show-or-create dispatch, picker, and display rule. Design lives at docs/design/ai-vterm.org. --- modules/eshell-vterm-config.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'modules/eshell-vterm-config.el') diff --git a/modules/eshell-vterm-config.el b/modules/eshell-vterm-config.el index df1f3f77..4c22944b 100644 --- a/modules/eshell-vterm-config.el +++ b/modules/eshell-vterm-config.el @@ -231,12 +231,18 @@ ("" . vterm-toggle) :config (setq vterm-toggle-fullscreen-p nil) + ;; This rule covers F12 toggle-shells only. AI-vterm buffers are named + ;; "claude []" and have their own display rule in `ai-vterm.el' + ;; that puts them in a right-direction window without dedication. The + ;; explicit "claude [" exclusion stops this rule from claiming them + ;; first when `:defer' makes vterm-toggle's :config run last. (add-to-list 'display-buffer-alist '((lambda (buffer-or-name _) (let ((buffer (get-buffer buffer-or-name))) (with-current-buffer buffer - (or (equal major-mode 'vterm-mode) - (string-prefix-p vterm-buffer-name (buffer-name buffer)))))) + (and (or (equal major-mode 'vterm-mode) + (string-prefix-p vterm-buffer-name (buffer-name buffer))) + (not (string-prefix-p "claude [" (buffer-name buffer))))))) (display-buffer-reuse-window display-buffer-at-bottom) (dedicated . t) ;dedicated is supported in Emacs 27+ (reusable-frames . visible) -- cgit v1.2.3