diff options
| author | Gabriel Schneider <[email protected]> | 2026-09-29 08:04:16 -0300 |
|---|---|---|
| committer | Gabriel Schneider <[email protected]> | 2026-10-01 00:12:16 -0300 |
| commit | aa1d8a848585dcc1b3f1775e0b98435824f28e7d (patch) | |
| tree | 3a1a6061b927601dcb7220f7d368b0eb37c8b02d | |
| parent | 0ec8d0dc6217486446f2fe2156dff136173a4ef5 (diff) | |
| download | pardes-aa1d8a848585dcc1b3f1775e0b98435824f28e7d.tar.gz pardes-aa1d8a848585dcc1b3f1775e0b98435824f28e7d.zip | |
`@p<terminal>:N` past the terminal's last line is a miss, as in a file
The line-past-end check read only a file pane's lines, so a terminal's
look went nowhere and said nothing. A terminal's lines are its logical
lines, as a +Search of it lists them.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
| -rw-r--r-- | src/look.zig | 10 | ||||
| -rw-r--r-- | src/ninep/ctl.zig | 6 |
2 files changed, 14 insertions, 2 deletions
diff --git a/src/look.zig b/src/look.zig index 4ee5a638..87dcede3 100644 --- a/src/look.zig +++ b/src/look.zig @@ -1379,8 +1379,14 @@ pub fn lookAt(p: *Pardes, id: usize, operand: []const u8) void { const found = resolveLookTarget(p, id, txt, &realbuf); // A line past the end of an open pane is a miss (the target's line is // already clamped, so the one written is asked). - if (found == .pane and found.pane.id < MAX_PANES) if (p.panes[found.pane.id]) |shown| if (shown.file) |*f| if (pl.at.line > panes.File.nlines(p.gpa, f)) - return missedLine(p, id, trimmed, pl.at.line); + if (found == .pane and found.pane.id < MAX_PANES) if (p.panes[found.pane.id]) |shown| { + // A terminal's lines are its logical lines, as a +Search lists them. + const n = if (shown.file) |*f| panes.File.nlines(p.gpa, f) else if (shown.isTerminal()) + if (edit.paneCursorLines(p, &shown.body)) |ls| ls.len else |_| std.math.maxInt(usize) + else + std.math.maxInt(usize); + if (pl.at.line > n) return missedLine(p, id, trimmed, pl.at.line); + }; // A miss changes nothing, the selection included; a look that stays in // this pane starts from a clean one. One that goes to another pane // leaves this one's dot alone, as acme's does: only the click's own diff --git a/src/ninep/ctl.zig b/src/ninep/ctl.zig index 9bb9c044..58fcdf3a 100644 --- a/src/ninep/ctl.zig +++ b/src/ninep/ctl.zig @@ -2134,4 +2134,10 @@ test "@p<terminal>:<address> takes any address over the terminal's lines, select try testing.expectEqual(@as(i32, 1), pane.body.cur_col); _ = wr(p, root, try std.fmt.bufPrint(&line, "@p{d}:/zzqq/\n", .{serial})); try testing.expect(th.logHas(p, "look: no match for regexp")); + // A line past its last is a miss, as in a file. + const row_before = pane.body.cur_row; + _ = wr(p, root, try std.fmt.bufPrint(&line, "@p{d}:999\n", .{serial})); + try testing.expect(th.logHas(p, "has no line 999")); + try testing.expectEqual(row_before, pane.body.cur_row); + try testing.expectEqualStrings("", rd(p, root, 0, 64).bytes); } |
