summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-09-28 15:35:43 -0300
committerGabriel Schneider <[email protected]>2026-10-01 00:12:15 -0300
commitf2091c52e06b0935f69914ac2d76941361cbb969 (patch)
tree18e19eec9765ae5b114779848dec02c58d1faa1f
parent830e936da4aca7ea802a6a862fa40c0086defd2f (diff)
downloadpardes-f2091c52e06b0935f69914ac2d76941361cbb969.tar.gz
pardes-f2091c52e06b0935f69914ac2d76941361cbb969.zip
A command pane echoes its first command as it does the later ones
Only a reused pane showed '% line' above its command, so the first command's output stood with nothing saying what made it. Every command is echoed now, the first too. The goldens of chordcut, cmdexit, cmdword and layout-open gain that line and the rows below it move down one. Co-Authored-By: Claude Opus 5.5 <[email protected]>
-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