Skip to content

Commit 30fe4bd

Browse files
authored
Merge pull request #571 from Scott-Guest/kill-buffer
Fix unkillable buffer after major-mode change
2 parents 6b9c44d + d31b9cb commit 30fe4bd

2 files changed

Lines changed: 38 additions & 16 deletions

File tree

agent-shell.el

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2366,22 +2366,21 @@ DIFF should be in the form returned by `agent-shell--make-diff-info':
23662366
"Clean up resources.
23672367

23682368
For example, shut down ACP client."
2369-
(unless (derived-mode-p 'agent-shell-mode)
2370-
(error "Not in a shell"))
2371-
(agent-shell--cancel-idle-timer)
2372-
(agent-shell--emit-event :event 'clean-up)
2373-
(agent-shell--shutdown)
2374-
;; Kill any open diff buffers associated with tool calls.
2375-
(map-do (lambda (_tool-call-id tool-call-data)
2376-
(when-let ((diff-buf (map-elt tool-call-data :diff-buffer)))
2377-
(agent-shell-diff-kill-buffer diff-buf)))
2378-
(map-elt (agent-shell--state) :tool-calls))
2379-
(when-let (((map-elt (agent-shell--state) :buffer))
2380-
(viewport-buffer (agent-shell-viewport--buffer
2381-
:shell-buffer (map-elt (agent-shell--state) :buffer)
2382-
:existing-only t))
2383-
(buffer-live-p viewport-buffer))
2384-
(kill-buffer viewport-buffer)))
2369+
(when (derived-mode-p 'agent-shell-mode)
2370+
(agent-shell--cancel-idle-timer)
2371+
(agent-shell--emit-event :event 'clean-up)
2372+
(agent-shell--shutdown)
2373+
;; Kill any open diff buffers associated with tool calls.
2374+
(map-do (lambda (_tool-call-id tool-call-data)
2375+
(when-let ((diff-buf (map-elt tool-call-data :diff-buffer)))
2376+
(agent-shell-diff-kill-buffer diff-buf)))
2377+
(map-elt (agent-shell--state) :tool-calls))
2378+
(when-let (((map-elt (agent-shell--state) :buffer))
2379+
(viewport-buffer (agent-shell-viewport--buffer
2380+
:shell-buffer (map-elt (agent-shell--state) :buffer)
2381+
:existing-only t))
2382+
(buffer-live-p viewport-buffer))
2383+
(kill-buffer viewport-buffer))))
23852384

23862385
(defun agent-shell--shutdown ()
23872386
"Shut down shell activity."
@@ -2774,6 +2773,7 @@ variable (see makunbound)"))
27742773
(setq-local filter-buffer-substring-function #'agent-shell--filter-buffer-substring)
27752774
(agent-shell--update-header-and-mode-line)
27762775
(add-hook 'kill-buffer-hook #'agent-shell--clean-up nil t)
2776+
(add-hook 'change-major-mode-hook #'agent-shell--clean-up nil t)
27772777
(agent-shell-ui-mode +1)
27782778
(when agent-shell-file-completion-enabled
27792779
(agent-shell-completion-mode +1))

tests/agent-shell-tests.el

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2315,5 +2315,27 @@ that fallback buffer, potentially starting the new shell in the wrong project."
23152315
;; Empty input returns empty output.
23162316
(should (equal (agent-shell--sort-sessions-by-recency '()) '())))
23172317

2318+
(ert-deftest agent-shell--clean-up-tolerates-mode-change-test ()
2319+
"Test `kill-buffer' succeeds after the major mode is manually changed.
2320+
2321+
`kill-buffer-hook' is permanent-local, so the buffer-local
2322+
`agent-shell--clean-up' entry survives a mode change,
2323+
and it must handle that cleanly."
2324+
(let ((shell-buf (generate-new-buffer " *test-shell*")))
2325+
(unwind-protect
2326+
(progn
2327+
(with-current-buffer shell-buf
2328+
(setq major-mode 'agent-shell-mode)
2329+
(setq-local agent-shell--state
2330+
(agent-shell--make-state :buffer shell-buf))
2331+
(add-hook 'kill-buffer-hook #'agent-shell--clean-up nil t)
2332+
(text-mode))
2333+
(kill-buffer shell-buf)
2334+
(should-not (buffer-live-p shell-buf)))
2335+
(when (buffer-live-p shell-buf)
2336+
(with-current-buffer shell-buf
2337+
(remove-hook 'kill-buffer-hook #'agent-shell--clean-up t))
2338+
(kill-buffer shell-buf)))))
2339+
23182340
(provide 'agent-shell-tests)
23192341
;;; agent-shell-tests.el ends here

0 commit comments

Comments
 (0)