Ctrl+H (delete previous character) is misinterpreted as Ctrl+Backspace (delete word) under WSL2 due to WT_SESSION leaking from Windows Terminal
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Shell
- Star
- 11.2k
- Fork
- 1.9k
- Merge trung bình
- 14 giờ 16 phút
- Pull request đã merge (30 ngày)
- 6
Mô tả
Description
/help documents ctrl+h as "delete previous character", but under WSL2 it instead deletes the whole previous word (i.e. behaves like ctrl+w/Ctrl+Backspace).
Environment
- Copilot CLI version: 1.0.78-2
- Platform: WSL2 (
Linux ... 6.18.33.2-microsoft-standard-WSL2), Windows Terminal as host, plainxterm-256colorinside (issue reproduces both inside and outside tmux) WSLENV=WT_SESSION:WT_PROFILE_ID:(default WSL/Windows Terminal integration), soWT_SESSIONis present in the WSL shell environment even though the CLI is not running as a native Windows process
Root cause
In the bundled app.js, the raw-byte key decoder special-cases byte 0x08 (\b) — which is exactly what Ctrl+H sends — as Ctrl+Backspace when a ctrlHIsCtrlBackspace flag is set:
function ZDe(t, e=!1) {
return t.length!==1 ? null
: t==="\r" ? {code:"return"}
: ...
: t==="\b" && e ? {code:"backspace", ctrl:!0} // <-- Ctrl+H reinterpreted as Ctrl+Backspace
: t==="\b" || t==="\x7F" ? {code:"backspace"}
: ...
}
The flag is computed once at startup:
reader = new ope({ ctrlHIsCtrlBackspace: fSt() })
function Nk() { return !RA() && !process.env.TMUX && !process.env.STY }
function fSt() { return process.platform==="win32" && Nk() || !!process.env.WT_SESSION }
The intent is reasonable on native Windows (Windows Console/Windows Terminal apps can't distinguish a literal Ctrl+H keypress from Ctrl+Backspace, since both produce byte 0x08), so trading away the Ctrl+H binding there makes sense. However, the || !!process.env.WT_SESSION clause has no accompanying process.platform==="win32" check, so it also fires under WSL2, where WT_SESSION is forwarded into the Linux environment by WSLENV for terminal-integration purposes, but the CLI is actually running in a normal Linux pty where Ctrl+H and Ctrl+Backspace are distinguishable. This causes a false positive: the workaround for a Windows-only ambiguity ends up breaking a real, distinguishable keybinding on WSL.
This also affects users in the reverse scenario, if WT_SESSION is otherwise present in the environment (e.g. propagated through SSH or subshells) on non-Windows platforms.
Steps to reproduce
- Launch Copilot CLI inside WSL2 under Windows Terminal (default
WSLENVintegration). - Type some text, then press Ctrl+H.
- Expected: deletes one character before the cursor (per
/help). - Actual: deletes the entire previous word.
Suggested fix
Gate the WT_SESSION check on process.platform === "win32" as well, e.g.:
function fSt() {
return process.platform === "win32" && (Nk() || !!process.env.WT_SESSION);
}
or otherwise detect WSL (e.g. via /proc/version containing "microsoft" or process.platform !== "win32") and skip the ctrlHIsCtrlBackspace heuristic in that case.
Workaround
unset WT_SESSION before launching copilot restores the documented Ctrl+H behavior.
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu trong app.js được đóng gói tại fSt() và phần khởi tạo reader của nó, sau đó xác minh cách WT_SESSION và process.platform ảnh hưởng đến ctrlHIsCtrlBackspace trước khi kiểm tra ZDe(). Tái hiện trên WSL2 với WT_SESSION được đặt và không được đặt; hoàn tất khi Ctrl+H xóa một ký tự trong khi hành vi gốc của Windows vẫn không thay đổi.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- javascript, linux, node.js
- Lĩnh vực
- cli, operating-systems
- Loại issue
- Lỗi
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức độ hoạt động
- Sôi nổi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức phù hợp với người mới
- 78/100