Ctrl+H (delete previous character) is misinterpreted as Ctrl+Backspace (delete word) under WSL2 due to WT_SESSION leaking from Windows Terminal
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 78/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- javascript, linux, node.js
- Bereich
- cli, operating-systems
Rechercherichtung
Beginne in der gebündelten app.js bei fSt() und dessen Reader-Initialisierung. Prüfe anschließend, wie WT_SESSION und process.platform ctrlHIsCtrlBackspace beeinflussen, bevor du ZDe() überprüfst. Reproduziere das unter WSL2 mit gesetztem und nicht gesetztem WT_SESSION; fertig ist es, wenn Ctrl+H ein Zeichen löscht, während das native Windows-Verhalten unverändert bleibt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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.
- Vorherrschende Sprache
- Shell
- Sterne
- 11.2k
- Forks
- 1.9k
- Ø Merge
- 14 Std. 16 Min.
- Gemergte PRs (30 T.)
- 6
Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus github/copilot-cli
-
triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
github/copilot-cli#4932 ·
-
triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
github/copilot-cli#4909 ·
-
triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
github/copilot-cli#4906 ·
-
triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
github/copilot-cli#4848 ·
-
area:agents area:mcp
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
github/copilot-cli#4729 ·
Alle Issues in github/copilot-cli
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
huggingface/Repo2RLEnv#163 · 1 Kommentar ·
-
setup tools wizard offers no GitHub auth path, and setup summary doesn't recognize `gh` CLI auth Offenarea/auth comp/cli P3 tool/skills type/bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
NousResearch/hermes-agent#121131 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
bradcypert/plum#53 ·
-
tmp_watchgod.sh exceeds the 1000-line cap; the Zone A guard helpers are a clean extraction seam Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
WingedGuardian/GENesis-AGI#2301 ·