From 9bb7d8b79ba5cc86d6a6c48f50fe34449937a18e Mon Sep 17 00:00:00 2001 From: infCraft <2319359689@qq.com> Date: Wed, 29 Jul 2026 22:16:37 +0800 Subject: [PATCH] fix(pty): emit BackTab sequence for Shift+Tab --- .../TerminalCore/PTY/PTYTerminalEngine.swift | 2 +- Tests/ProGhosttyCoreTests/PTYLaunchTests.swift | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Sources/ProGhosttyCore/TerminalCore/PTY/PTYTerminalEngine.swift b/Sources/ProGhosttyCore/TerminalCore/PTY/PTYTerminalEngine.swift index 7712888..4fead60 100644 --- a/Sources/ProGhosttyCore/TerminalCore/PTY/PTYTerminalEngine.swift +++ b/Sources/ProGhosttyCore/TerminalCore/PTY/PTYTerminalEngine.swift @@ -48,7 +48,7 @@ func terminalControlInputData(for event: NSEvent) -> Data? { case UInt32(NSEnterCharacter), UInt32(NSCarriageReturnCharacter): return event.modifierFlags.contains(.shift) ? Data([0x0A]) : Data([0x0D]) case UInt32(NSTabCharacter): - return Data([0x09]) + return event.modifierFlags.contains(.shift) ? Data("\u{1B}[Z".utf8) : Data([0x09]) case UInt32(NSBackspaceCharacter): return Data([0x7F]) case 0x1B: diff --git a/Tests/ProGhosttyCoreTests/PTYLaunchTests.swift b/Tests/ProGhosttyCoreTests/PTYLaunchTests.swift index 028a093..0900d15 100644 --- a/Tests/ProGhosttyCoreTests/PTYLaunchTests.swift +++ b/Tests/ProGhosttyCoreTests/PTYLaunchTests.swift @@ -29,6 +29,17 @@ struct PTYLaunchTests { #expect(terminalControlInputData(for: event) == Data([0x0D])) } + @Test func shiftTabProducesBackTabSequence() throws { + let event = try #require(makeKeyEvent( + keyCode: 48, + characters: "\t", + charactersIgnoringModifiers: "\t", + modifierFlags: [.shift] + )) + + #expect(terminalControlInputData(for: event) == Data("\u{1B}[Z".utf8)) + } + @Test func shellArgumentsUseShellBasename() { #expect(PTYLaunch.shellArguments(shellPath: "/bin/zsh") == ["zsh"]) }