fix: 从xterm直接转发Escape按键

- 在xterm自定义键处理器中发送Vim Escape控制字符
- Radix弹框仅负责阻止Escape关闭窗口
This commit is contained in:
Logan.Li committed 2026-07-26 18:45:36 +08:00
1 parent d666840ed0
commit 57e51ba1cd
1 file changed
+8 -7
@@ -132,8 +132,12 @@ export function TerminalDialog({
const ws = new WebSocket(wsUrl); const ws = new WebSocket(wsUrl);
wsRef.current = ws; wsRef.current = ws;
// Escape 由 Dialog 捕获后直接转发,xterm 跳过同一次事件以免重复发送。 // Logan.Li // xterm 在目标元素阶段直接转发 Escape,避免 Radix 捕获层吞掉 Vim 控制字符。 // Logan.Li
term.attachCustomKeyEventHandler((event) => event.key !== "Escape"); term.attachCustomKeyEventHandler((event) => {
if (event.key !== "Escape") return true;
if (event.type === "keydown") sendTerminalInput("\x1b");
return false;
});
term.onData(sendTerminalInput); term.onData(sendTerminalInput);
ws.onmessage = (event) => { ws.onmessage = (event) => {
@@ -221,11 +225,8 @@ export function TerminalDialog({
<Dialog open={open} onOpenChange={onOpenChange}> <Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent <DialogContent
showCloseButton={false} showCloseButton={false}
// Radix 在捕获阶段收到 Escape,阻止关窗并把控制字符送给远端 Vim。 // Logan.Li // Escape 仅阻止弹框关闭,控制字符由 xterm 键处理器发送。 // Logan.Li
onEscapeKeyDown={(event) => { onEscapeKeyDown={(event) => event.preventDefault()}
event.preventDefault();
sendTerminalInput("\x1b");
}}
className={cn( className={cn(
"min-w-0 overflow-hidden bg-[var(--dg-bg-secondary)] border-[var(--dg-border)] p-0 gap-0", "min-w-0 overflow-hidden bg-[var(--dg-bg-secondary)] border-[var(--dg-border)] p-0 gap-0",
// 禁用 CSS 过渡:终端窗口应该即时缩放,不需要动画 // 禁用 CSS 过渡:终端窗口应该即时缩放,不需要动画