diff --git a/src/terminal/Terminal.zig b/src/terminal/Terminal.zig index 0f20beb18..29f80c6f7 100644 --- a/src/terminal/Terminal.zig +++ b/src/terminal/Terminal.zig @@ -1070,6 +1070,7 @@ pub fn semanticPrompt( ) !void { switch (cmd.action) { .fresh_line => try self.semanticPromptFreshLine(), + .fresh_line_new_prompt => { // "First do a fresh-line." try self.semanticPromptFreshLine(); @@ -1092,6 +1093,12 @@ pub fn semanticPrompt( // command but we don't yet handle these in any meaningful way. }, + .end_prompt_start_input => { + // End of prompt and start of user input, terminated by a OSC + // "133;C" or another prompt (OSC "133;P"). + self.screens.active.cursor.semantic_content = .input; + }, + else => {}, } } diff --git a/src/terminal/stream_readonly.zig b/src/terminal/stream_readonly.zig index 6eb7353ea..fcb6d123f 100644 --- a/src/terminal/stream_readonly.zig +++ b/src/terminal/stream_readonly.zig @@ -933,3 +933,18 @@ test "semantic prompt fresh line new prompt" { try s.nextSlice("\x1b]133;A;redraw=1\x07"); try testing.expect(t.flags.shell_redraws_prompt); } + +test "semantic prompt end prompt start input" { + var t: Terminal = try .init(testing.allocator, .{ .cols = 10, .rows = 10 }); + defer t.deinit(testing.allocator); + + var s: Stream = .initAlloc(testing.allocator, .init(&t)); + defer s.deinit(); + + // Write some text and then send OSC 133;A (fresh_line_new_prompt) + try s.nextSlice("Hello"); + try s.nextSlice("\x1b]133;A\x07"); + try s.nextSlice("prompt$ "); + try s.nextSlice("\x1b]133;B\x07"); + try testing.expectEqual(.input, t.screens.active.cursor.semantic_content); +}