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"]) }