summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/tags.md23
-rw-r--r--src/exec.zig7
-rw-r--r--src/ninep/cols.zig21
-rw-r--r--test/snapshots/headersweep-restored.golden23
-rw-r--r--test/snapshots/headersweep.golden39
5 files changed, 78 insertions, 35 deletions
diff --git a/docs/tags.md b/docs/tags.md
index eb16cb2a..81ae99a7 100644
--- a/docs/tags.md
+++ b/docs/tags.md
@@ -1,12 +1,23 @@
# Tags and columns
Pardes has three levels of command text: the workspace tag, a tag per
-column, and each pane's tag. A column tag's words act on that column and run
-in its active pane (its first pane when focus comes from another column). A
-command or `Tty` run from the workspace or a column tag starts in the
-session's directory (where pardes started), as acme's row and column tags
-have none of their own; one run from a pane's tag or text starts in that
-pane's directory. Over 9P the tags are `/tag`, `/col/<n>/tag` and
+column, and each pane's tag. The rule for the workspace and column tags:
+
+- A builtin that acts on a pane (`Del`, `Save`, `Undo`) acts on the
+ column's active pane (its first pane when focus comes from another
+ column); from the workspace tag, on the pane with the keyboard.
+- A column's own words (`New`, `Tty`, `Delcol`) act on that column.
+- A shell command runs as a command pane of its own, with `run` and `exit`
+ records, in the session's directory (where pardes started), as acme's row
+ and column tags have none of their own. It is never typed into the
+ terminal that has the keyboard. `Tty` starts there too.
+- Over 9P (`/tagexec`, `col/<n>/exec`) there is no click to say which pane
+ is meant, so a pane's word written there is refused, pointing at
+ `pane/<n>/ctl`; the tag's own words and shell commands run as above.
+
+One run from a pane's tag or text starts in that pane's directory, and a
+shell command there is typed into the pane when it is a terminal at its
+prompt. Over 9P the tags are `/tag`, `/col/<n>/tag` and
`/pane/<n>/tag` ([fs.md](fs.md#columns-and-tags)).
## Default words
diff --git a/src/exec.zig b/src/exec.zig
index ea20f969..2b3ca40c 100644
--- a/src/exec.zig
+++ b/src/exec.zig
@@ -728,7 +728,10 @@ pub fn executeFrom(p: *Pardes, id: usize, txt: []const u8, from_body: bool) ?usi
p.reportFailure(id, std.fmt.bufPrint(&said, "{s} is {s}, invalid here", .{ word, why }) catch "GUI-only, invalid here");
return null;
}
- if (!takesCommandLine(p, id)) return runCommand(p, id, cmd);
+ // A command from a column's or the workspace's tag is that tag's: a
+ // command pane in the session's directory, never typed into whichever
+ // terminal has the keyboard.
+ if (p.exec_header or !takesCommandLine(p, id)) return runCommand(p, id, cmd);
panes.terminal.padOutputBelowEdits(p, id);
panes.terminal.noteCommand(pane, cmd);
if (panes.terminal.queuePendingCommand(pane, cmd) catch |err| {
@@ -771,7 +774,7 @@ fn runCommand(p: *Pardes, from: usize, line: []const u8) ?usize {
// would hang that job up.
// From a column's tag, only a finished pane in that column is reused,
// as the new one goes in that column (placeNew).
- const reuse: ?usize = if (p.exec_column == null and src != null and src.?.command != null and src.?.command_done and !src.?.command_pty) from else for (p.panes, 0..) |slot, i| {
+ const reuse: ?usize = if (!p.exec_header and p.exec_column == null and src != null and src.?.command != null and src.?.command_done and !src.?.command_pty) from else for (p.panes, 0..) |slot, i| {
const other = slot orelse continue;
if (p.exec_column) |c| if (if (layout.findPane(p, i)) |f| f.col != c else true) continue;
if (other.command != null and other.command_done and !other.command_pty and std.mem.eql(u8, other.cwdSlice(), dir)) break i;
diff --git a/src/ninep/cols.zig b/src/ninep/cols.zig
index 7afcfbd8..6828612c 100644
--- a/src/ninep/cols.zig
+++ b/src/ninep/cols.zig
@@ -426,6 +426,27 @@ test "Help and Find at /tagexec act in the session's directory, not the keyboard
}
}
+test "a shell command at /tagexec or a column's exec is a command pane in the session's directory, never typed into the keyboard's terminal" {
+ if (comptime !pardes.hosted) return;
+ const p = try Pardes.init(testing.allocator, .{ .tty_only = true, .cols = 80, .rows = 30 });
+ defer p.deinit();
+ while (p.nextEffect()) |_| {}
+ const term = p.panes[p.active].?;
+ try testing.expect(pardes.exec.takesCommandLine(p, p.active));
+ const col_exec = tree.Node.ofCol(layout.columnSerial(p, 0), .exec);
+ for ([_]u64{ @intFromEnum(tree.TopFile.tagexec), col_exec }) |node| {
+ p.active = p.paneBySerial(term.serial).?;
+ const before = p.next_serial;
+ const r = th.wr(p, node, "echo from-the-tag\n");
+ try testing.expectEqual(tree.Status.ok, r.reply.status);
+ try testing.expectEqualStrings("", r.pty());
+ try testing.expectEqual(before + 1, p.next_serial);
+ const made = p.panes[p.paneBySerial(p.next_serial).?].?; // the newest
+ try testing.expectEqualStrings("echo from-the-tag", made.command.?);
+ try testing.expectEqualStrings(p.sessionDir(), made.cwdSlice());
+ }
+}
+
test "New and Tty run at /tagexec and a column's exec, with no pane at all too" {
const p = try th.withFile(testing.allocator, "x\n");
defer p.deinit();
diff --git a/test/snapshots/headersweep-restored.golden b/test/snapshots/headersweep-restored.golden
index 38b505e7..176520dd 100644
--- a/test/snapshots/headersweep-restored.golden
+++ b/test/snapshots/headersweep-restored.golden
@@ -20,7 +20,7 @@
|18: 0-0 d,#608269, 1-59 d,#0d1410, 60-60 d,#608269, 61-119 d,#0d1410,
|19: 0-0 d,#608269, 1-59 d,#0d1410, 60-60 d,#608269, 61-119 d,#0d1410,
|20: 0-0 d,#608269, 1-59 d,#0d1410, 60-60 d,#608269, 61-119 d,#0d1410,
-== snap col-swept grid=120x21 cursor=4,9
+== snap col-swept grid=120x21 cursor=4,7
|Newcol Joincol Find Grep Help Changelog Tutor Dump Themes Config Debug Exit Restore /tmp/pardes-snap/headersweep-restore
| New Tty Find Grep Joincol Delcol echo RE''STORED-COL New Tty Find Grep Joincol Delcol
| /tmp/pardes-snap/headersweep-restored/cwd Tty+bash Save M /tmp/pardes-snap/headersweep-restored/cwd Tty+bash Save M
@@ -28,22 +28,27 @@
| $ ls $ ls
| $ $
| ── restored history ── ── restored history ──
-| echo RE''STORED-COL
-| RESTORED-COL
+|
+|
|
|
|
| /tmp/pardes-snap/headersweep-restored/cwd Tty+bash Save M
| ode Filter Collapse Del
-| $ ls
| $
| ── restored history ──
+|
+| /tmp/pardes-snap/headersweep-restored/cwd (echo RE''STORE
+| D-COL) exit 0 Kill Save Collapse Del
+| exit 0
== style ws-sweeping grid=120x21
|0: 0-100 #b2c3b8,#1d2824, 101-108 #f5f7ee,#5b7e5a, 109-119 #b2c3b8,#1d2824,
|1: 0-1 d,#887455, 2-2 d,#314738, 3-59 #becfc4,#314738, 60-61 #becfc4,#887455, 62-62 #becfc4,#1d2824, 63-119 #b2c3b8,#1d2824,
-|7: 0-0 d,#608269, 1-1 d,#0d1410, 2-59 #e5eee5,#0d1410, 60-60 #e5eee5,#608269, 61-119 #e5eee5,#0d1410,
-|8: 0-0 d,#608269, 1-1 d,#0d1410, 2-59 #e5eee5,#0d1410, 60-60 #e5eee5,#608269, 61-119 #e5eee5,#0d1410,
-== snap ws-swept grid=120x21 cursor=4,11
+|15: 0-0 d,#608269, 1-1 d,#0d1410, 2-23 #e5eee5,#0d1410,f 24-59 #e5eee5,#0d1410, 60-60 #e5eee5,#608269, 61-119 #e5eee5,#0d1410,
+|16: 0-0 d,#152019, 1-59 d,#0d1410, 60-60 d,#608269, 61-119 d,#0d1410,
+|17: 0-1 d,#496656, 2-2 d,#1d2824, 3-59 #b2c3b8,#1d2824, 60-60 #b2c3b8,#608269, 61-119 #b2c3b8,#0d1410,
+|18: 0-2 d,#1d2824, 3-59 #b2c3b8,#1d2824, 60-60 #b2c3b8,#608269, 61-119 #b2c3b8,#0d1410,
+|19: 0-0 d,#152019, 1-1 d,#0d1410, 2-59 #e5eee5,#0d1410, 60-60 #e5eee5,#608269, 61-119 #e5eee5,#0d1410,
+== snap ws-swept grid=120x21 cursor=4,7
|0: Newcol Joincol Find Grep Help Changelog Tutor Dump Themes Config Debug Exit Restore /tmp/pardes-snap/headersweep-rest ec
-|9: echo RE''STORED-WS
-|10: RESTORED-WS
+|18: D-WS) exit 0 Kill Save Collapse Del
diff --git a/test/snapshots/headersweep.golden b/test/snapshots/headersweep.golden
index 38004c08..c22120ca 100644
--- a/test/snapshots/headersweep.golden
+++ b/test/snapshots/headersweep.golden
@@ -20,15 +20,15 @@
|18: 0-0 d,#608269, 1-59 d,#0d1410, 60-60 d,#608269, 61-119 d,#0d1410,
|19: 0-0 d,#608269, 1-59 d,#0d1410, 60-60 d,#608269, 61-119 d,#0d1410,
|20: 0-0 d,#608269, 1-59 d,#0d1410, 60-60 d,#608269, 61-119 d,#0d1410,
-== snap col-swept grid=120x21 cursor=4,8
+== snap col-swept grid=120x21 cursor=4,6
|Newcol Joincol Find Grep Help Changelog Tutor Dump Themes Config Debug Exit
| New Tty Find Grep Joincol Delcol echo SW''EPT-COL New Tty Find Grep Joincol Delcol
| /tmp/pardes-snap/headersweep/cwd Tty+bash Save Mode Filte /tmp/pardes-snap/headersweep/cwd Tty+bash Save Mode Filte
| r Collapse Del r Collapse Del
| ls ls
| hay.txt hay.txt
-| echo SW''EPT-COL
-| SWEPT-COL
+|
+|
|
|
|
@@ -37,24 +37,27 @@
| r Collapse Del
| ls
| hay.txt
-== snap ws-swept grid=120x21 cursor=4,10
+|
+| /tmp/pardes-snap/headersweep/cwd (echo SW''EPT-COL) exit
+| 0 Kill Save Collapse Del
+| exit 0
+== snap ws-swept grid=120x21 cursor=4,6
|0: Newcol Joincol Find Grep Help Changelog Tutor Dump Themes Config Debug Exit echo SW''EPT-WS
-|8: echo SW''EPT-WS
-|9: SWEPT-WS
-== snap ws-looked grid=120x21 cursor=7,19
+|17: /tmp/pardes-snap/headersweep/cwd (echo SW''EPT-WS) exit 0
+|18: Kill Save Collapse Del
+== snap ws-looked grid=120x21 cursor=7,9
|0: Newcol Joincol Find Grep Help Changelog Tutor Dump Themes Config Debug Exit echo SW''EPT-WS xxhay.txtxx
-|17: /tmp/pardes-snap/headersweep/cwd/hay.txt Save Tty Collaps
-|18: e Del
-|19: 1 ZQNEEDLE
-== snap cancelled grid=120x21 cursor=7,19
+|7: /tmp/pardes-snap/headersweep/cwd/hay.txt Save Tty Collaps
+|8: e Del
+|9: 1 ZQNEEDLE
+== snap cancelled grid=120x21 cursor=7,9
== style selected grid=120x21
|1: 0-1 d,#887455, 2-2 d,#1d2824, 3-59 #b2c3b8,#1d2824, 60-61 #b2c3b8,#887455, 62-62 #b2c3b8,#314738, 63-70 #becfc4,#314738, 71-79 #f5f7ee,#3c614a, 80-80 #f5f7ee,#314738, 81-119 #becfc4,#314738,
|2: 0-1 d,#496656, 2-2 d,#1d2824, 3-35 #b2c3b8,#1d2824, 36-44 #d3b0d9,#1d2824, 45-59 #b2c3b8,#1d2824, 60-61 #b2c3b8,#add38a, 62-62 #b2c3b8,#314738, 63-95 #becfc4,#314738, 96-104 #dfbce5,#314738, 105-119 #becfc4,#314738,
|3: 0-2 d,#1d2824, 3-59 #b2c3b8,#1d2824, 60-62 #b2c3b8,#314738, 63-119 #becfc4,#314738,
-|6: 0-0 d,#608269, 1-1 d,#0d1410, 2-59 #e5eee5,#0d1410, 60-60 #e5eee5,#608269, 61-119 #e5eee5,#0d1410,
-|7: 0-0 d,#608269, 1-1 d,#0d1410, 2-59 #e5eee5,#0d1410, 60-60 #e5eee5,#608269, 61-119 #e5eee5,#0d1410,
-|8: 0-0 d,#608269, 1-1 d,#0d1410, 2-59 #e5eee5,#0d1410, 60-60 #e5eee5,#608269, 61-119 #e5eee5,#0d1410,
-|9: 0-0 d,#608269, 1-1 d,#0d1410, 2-59 #e5eee5,#0d1410, 60-60 #e5eee5,#608269, 61-119 #e5eee5,#0d1410,
-|17: 0-1 d,#496656, 2-2 d,#1d2824, 3-35 #b2c3b8,#1d2824, 36-43 #d3b0d9,#1d2824, 44-59 #b2c3b8,#1d2824, 60-60 #b2c3b8,#608269, 61-119 #b2c3b8,#0d1410,
-|18: 0-2 d,#1d2824, 3-59 #b2c3b8,#1d2824, 60-60 #b2c3b8,#608269, 61-119 #b2c3b8,#0d1410,
-|19: 0-0 d,#608269, 1-4 d,#0d1410, 5-6 #59675c,#0d1410, 7-59 #e5eee5,#0d1410, 60-60 #e5eee5,#608269, 61-119 #e5eee5,#0d1410,
+|7: 0-1 d,#496656, 2-2 d,#1d2824, 3-35 #b2c3b8,#1d2824, 36-43 #d3b0d9,#1d2824, 44-59 #b2c3b8,#1d2824, 60-60 #b2c3b8,#608269, 61-119 #b2c3b8,#0d1410,
+|8: 0-2 d,#1d2824, 3-59 #b2c3b8,#1d2824, 60-60 #b2c3b8,#608269, 61-119 #b2c3b8,#0d1410,
+|9: 0-0 d,#608269, 1-4 d,#0d1410, 5-6 #59675c,#0d1410, 7-59 #e5eee5,#0d1410, 60-60 #e5eee5,#608269, 61-119 #e5eee5,#0d1410,
+|17: 0-1 d,#496656, 2-2 d,#1d2824, 3-59 #b2c3b8,#1d2824, 60-60 #b2c3b8,#608269, 61-119 #b2c3b8,#0d1410,
+|18: 0-3 d,#1d2824, 4-59 #b2c3b8,#1d2824, 60-60 #b2c3b8,#608269, 61-119 #b2c3b8,#0d1410,
+|19: 0-0 d,#152019, 1-1 d,#0d1410, 2-59 #e5eee5,#0d1410, 60-60 #e5eee5,#608269, 61-119 #e5eee5,#0d1410,