summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/exec.zig22
-rw-r--r--src/pardes.zig6
-rw-r--r--test/snapshots/chordcut.golden7
-rw-r--r--test/snapshots/cmdexit.golden9
-rw-r--r--test/snapshots/cmdword.golden13
-rw-r--r--test/snapshots/layout-open.golden5
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