diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-27 20:48:12 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-27 20:48:12 -0500 |
| commit | 7833fb8bc0e3f9ece01ab2fe6fe07ded0efc4af4 (patch) | |
| tree | 28234f51c546258fa57d40fe02bf0d30280182f1 /modules/ai-vterm.el | |
| parent | 822e7a3798d431910eeff677ae751eff8b48731a (diff) | |
| download | dotemacs-7833fb8bc0e3f9ece01ab2fe6fe07ded0efc4af4.tar.gz dotemacs-7833fb8bc0e3f9ece01ab2fe6fe07ded0efc4af4.zip | |
fix(vterm): never reopen the F9/F12 windows from the top
F9 brought the agent window down from the top of the frame. The toggle remembers where the window last sat and replays it, and "above" was a position it could capture and replay: move the window to the top with the buffer-move keys, toggle off, and the next toggle reopened it up there. The host default never picks the top, so a remembered "above" was the only way in.
I added an optional allowed-directions list to cj/window-toggle-capture-state, the helper both F9 (ai-vterm) and F12 (vterm-config) share. When the captured direction isn't in the list, it falls back to the default direction and clears the saved size, since that size was measured on the disallowed axis and wouldn't transfer. Both dispatchers now pass (right below left), so neither can remember a top placement. They go through the same helper, so the rule stays in one place.
Three tests cover the new branch: a permitted direction is kept, a disallowed one falls back with the size cleared, and an omitted list preserves the old unconstrained behavior so existing callers are unaffected.
Diffstat (limited to 'modules/ai-vterm.el')
| -rw-r--r-- | modules/ai-vterm.el | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/modules/ai-vterm.el b/modules/ai-vterm.el index d932b0e9..70395ecc 100644 --- a/modules/ai-vterm.el +++ b/modules/ai-vterm.el @@ -391,10 +391,13 @@ on a desktop -- pairing with the axis chosen by (defvar cj/--ai-vterm-last-direction nil "Last user-chosen direction for the AI-vterm display. -Symbol: right, below, left, or above. nil means no agent window -has been toggled off yet this session, so the default direction -applies. Captured at toggle-off by `cj/--ai-vterm-capture-state' -and consumed by `cj/--ai-vterm-display-saved'.") +Symbol: right, below, or left. `above' is never stored -- the agent +window must not be remembered at the top of the frame, so a top +placement falls back to the host default at capture time. nil means no +agent window has been toggled off yet this session, so the default +direction applies. Captured at toggle-off by +`cj/--ai-vterm-capture-state' and consumed by +`cj/--ai-vterm-display-saved'.") (defvar cj/--ai-vterm-last-was-bury nil "Non-nil when the last F9 toggle-off used `bury-buffer'. @@ -444,7 +447,8 @@ is not live." (cj/window-toggle-capture-state window (cj/--ai-vterm-default-direction) 'cj/--ai-vterm-last-direction - 'cj/--ai-vterm-last-size)) + 'cj/--ai-vterm-last-size + '(right below left))) (defun cj/--ai-vterm-reuse-existing-agent (buffer _alist) "Display-buffer action: reuse any window in this frame already showing |
