diff options
| -rw-r--r-- | src/exec.zig | 22 | ||||
| -rw-r--r-- | src/pardes.zig | 6 | ||||
| -rw-r--r-- | test/snapshots/chordcut.golden | 7 | ||||
| -rw-r--r-- | test/snapshots/cmdexit.golden | 9 | ||||
| -rw-r--r-- | test/snapshots/cmdword.golden | 13 | ||||
| -rw-r--r-- | test/snapshots/layout-open.golden | 5 |
6 files changed, 39 insertions, 23 deletions
diff --git a/src/exec.zig b/src/exec.zig index 84a0ad5f..fa915b16 100644 --- a/src/exec.zig +++ b/src/exec.zig @@ -534,14 +534,7 @@ fn runCommand(p: *Pardes, from: usize, line: []const u8) ?usize { // shown, then a soft reset (DECSTR) for the rest. if (panes.Terminal.onAlternateScreen(pane)) panes.Terminal.feedOutput(p, pane, "\x1b[?1049l"); panes.Terminal.feedOutput(p, pane, "\x1b[?1000l\x1b[?1002l\x1b[?1003l\x1b[?1006l\x1b[?2004l\x1b[?25h\x1b[!p"); - // The line as it runs, its newlines the terminal's, so a multi-line - // command does not staircase. - var buf: [2 * command_max + 8]u8 = undefined; - var w = std.Io.Writer.fixed(&buf); - w.writeAll(if (panes.Terminal.gridCursor(pane).x != 0) "\r\n% " else "% ") catch {}; - for (line) |c| (if (c == '\n') w.writeAll("\r\n") else w.writeByte(c)) catch {}; - w.writeAll("\r\n") catch {}; - panes.Terminal.feedOutput(p, pane, w.buffered()); + echoCommand(p, pane, line); p.emit(.{ .spawn = .{ .pane = @intCast(id), .serial = pane.serial, .cwd = .from(pane.cwdSlice()) } }); noteRun(p, pane, "run", line); return id; @@ -554,6 +547,7 @@ fn runCommand(p: *Pardes, from: usize, line: []const u8) ?usize { p.reportError(from, "exec", err); return null; }; + echoCommand(p, pane, line); const rc = if (p.ncol > 0) p.ncol - 1 else 0; if (p.col_n[rc] > 0) { const parent = layout.splitParent(p, p.col_panes[rc][p.col_n[rc] - 1]); @@ -565,6 +559,18 @@ fn runCommand(p: *Pardes, from: usize, line: []const u8) ?usize { return free; } +/// `% line` above a command's output, every command, as a shell echoes +/// what it was given; its newlines the terminal's, so a multi-line command +/// does not staircase. +fn echoCommand(p: *Pardes, pane: *Pane, line: []const u8) void { + var buf: [2 * command_max + 8]u8 = undefined; + var w = std.Io.Writer.fixed(&buf); + w.writeAll(if (panes.Terminal.gridCursor(pane).x != 0) "\r\n% " else "% ") catch {}; + for (line) |c| (if (c == '\n') w.writeAll("\r\n") else w.writeByte(c)) catch {}; + w.writeAll("\r\n") catch {}; + panes.Terminal.feedOutput(p, pane, w.buffered()); +} + /// `run <serial> <word>` or `exit <serial> <N|?>` in the log. fn noteRun(p: *Pardes, pane: *Pane, what: []const u8, said: []const u8) void { var buf: [96]u8 = undefined; diff --git a/src/pardes.zig b/src/pardes.zig index 80a20a0d..5e86f0fd 100644 --- a/src/pardes.zig +++ b/src/pardes.zig @@ -1538,6 +1538,12 @@ test "a command pane shows how its command ended, and the next command there run const dst = exec.execute(p, 1, "make -j8") orelse return error.NoCommandPane; while (p.nextEffect()) |_| {} const pane = p.panes[dst].?; + // Its first command is echoed as every later one is. + { + const first = try panes.Terminal.screenTextAlloc(pane, gpa); + defer gpa.free(first); + try std.testing.expect(std.mem.startsWith(u8, first, "% make -j8")); + } var frame = std.heap.ArenaAllocator.init(gpa); defer frame.deinit(); try std.testing.expect(std.mem.endsWith(u8, try tagline.tagPrefix(p, pane), "(make -j8) running")); diff --git a/test/snapshots/chordcut.golden b/test/snapshots/chordcut.golden index 8bcf12b1..d5266717 100644 --- a/test/snapshots/chordcut.golden +++ b/test/snapshots/chordcut.golden @@ -31,10 +31,11 @@ |8: 2 2echo B''OO g.txt == snap execafter grid=120x31 cursor=25,8 |6: /tmp/pardes-snap/chordcut/cwd/f.txt * Save Tty Collapse D /tmp/pardes-snap/chordcut/cwd (echo B''OO) exit 0 Kill Sa -|7: 1 line 1 Exec BOO -|8: 2 2echo B''OO g.txt exit 0 +|7: 1 line 1 Exec % echo B''OO +|8: 2 2echo B''OO g.txt BOO +|9: 3 line 3 exit 0 == snap cancellook grid=120x31 cursor=25,8 -|7: 1 line 1 BOO +|7: 1 line 1 % echo B''OO == snap lookafter grid=120x31 cursor=7,13 |12: /tmp/pardes-snap/chordcut/cwd/g.txt Save Tty Collapse Del |13: 1 line 1 diff --git a/test/snapshots/cmdexit.golden b/test/snapshots/cmdexit.golden index 58412752..de95c383 100644 --- a/test/snapshots/cmdexit.golden +++ b/test/snapshots/cmdexit.golden @@ -6,9 +6,10 @@ | 2 exec </dev/null >/dev/null 2>&1; sleep 1; false == snap background grid=120x31 cursor=7,3 |17: /tmp/pardes-snap/cmdexit/cwd (sleep 30 & echo BG''STARTED) exit 0 Kill Save Collapse Del -|18: BGSTARTED -|19: exit 0 +|18: % sleep 30 & echo BG''STARTED +|19: BGSTARTED +|20: exit 0 == snap letgo grid=120x31 cursor=7,3 |17: /tmp/pardes-snap/cmdexit/cwd (exec </dev/null >/dev/null 2>&1; sleep 1; false) exit 1 Kill Save Collapse Del -|20: % exec </dev/null >/dev/null 2>&1; sleep 1; false -|21: exit 1 +|21: % exec </dev/null >/dev/null 2>&1; sleep 1; false +|22: exit 1 diff --git a/test/snapshots/cmdword.golden b/test/snapshots/cmdword.golden index 6911bcab..eec32bcb 100644 --- a/test/snapshots/cmdword.golden +++ b/test/snapshots/cmdword.golden @@ -5,13 +5,14 @@ | 1 @`echo ZZ''E` @`echo ZZ''L` Look p.txt @`Look .` == snap atexec grid=120x31 cursor=7,3 |17: /tmp/pardes-snap/cmdword/cwd (echo ZZ''E) exit 0 Kill Save Collapse Del -|18: ZZE -|19: exit 0 -== snap atlook grid=120x31 cursor=2,23 +|18: % echo ZZ''E +|19: ZZE +|20: exit 0 +== snap atlook grid=120x31 cursor=2,24 |17: /tmp/pardes-snap/cmdword/cwd (echo ZZ''L) exit 0 Kill Save Collapse Del -|20: % echo ZZ''L -|21: ZZL -|22: exit 0 +|21: % echo ZZ''L +|22: ZZL +|23: exit 0 == snap lookword grid=120x31 cursor=7,11 |10: /tmp/pardes-snap/cmdword/cwd/p.txt Save Tty Collapse Del |11: 1 just text diff --git a/test/snapshots/layout-open.golden b/test/snapshots/layout-open.golden index 672fb709..79492382 100644 --- a/test/snapshots/layout-open.golden +++ b/test/snapshots/layout-open.golden @@ -32,5 +32,6 @@ |22: 1 echo 'TTY'OK == snap ttydir grid=100x31 cursor=7,22 |10: /tmp/pardes-snap/layout-open/cwd/sub (echo 'TTY -|11: TTYOK -|12: exit 0 +|11: % echo 'TTY'OK +|12: TTYOK +|13: exit 0 |
