From 1f10ea49e33c5f09a43e95bc30e818899bf4826d Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Fri, 26 Jun 2026 05:37:25 -0400 Subject: fix(eat): make Escape the unified copy-mode exit EAT's semi-char mode left the bare escape key unbound and treated ESC only as the Meta prefix, so a lone Escape never reached the pty. That is why C-'s tmux copy-mode could not be exited with Escape: tmux's own Escape=cancel binding never saw the key. Bind to forward ESC to the terminal, so it cancels tmux copy-mode and still works in TUIs like vim. Also bind in eat-mode-map to return to semi-char, so the same key exits EAT's own emacs and char modes. One exit key for both copy views; q is no longer required. --- tests/test-term-tmux-history.el | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'tests') diff --git a/tests/test-term-tmux-history.el b/tests/test-term-tmux-history.el index 633d7a02c..c7154e5d2 100644 --- a/tests/test-term-tmux-history.el +++ b/tests/test-term-tmux-history.el @@ -273,5 +273,20 @@ up-arrow -- it does not re-enter and reset the cursor." (should (eq (keymap-lookup eat-semi-char-mode-map "C-") #'cj/term-copy-mode-up))) +(ert-deftest test-term-escape-bound-as-unified-exit () + "Normal: Escape sends ESC in semi-char mode (cancels tmux copy-mode) and +returns to semi-char from EAT's emacs/char mode -- one exit key for both." + (should (eq (keymap-lookup eat-semi-char-mode-map "") + #'cj/term-send-escape)) + (should (eq (keymap-lookup eat-mode-map "") #'eat-semi-char-mode))) + +(ert-deftest test-term-send-escape-writes-esc-to-pty () + "Normal: `cj/term-send-escape' sends a bare ESC to the terminal process." + (let ((sent nil)) + (cl-letf (((symbol-function 'cj/--term-send-string) + (lambda (s) (push s sent)))) + (cj/term-send-escape) + (should (equal sent '("\e")))))) + (provide 'test-term-tmux-history) ;;; test-term-tmux-history.el ends here -- cgit v1.2.3