From 43b75a3c79e204b758df8d361c213364dc4fe064 Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Thu, 1 Oct 2026 02:44:38 -0300 Subject: A look line's trailing colon is dropped, as a click leaves it off, and a look whose address fails never leaves the file it opened `a.txt:2:3:`, as a compiler prints a place, failed as bad address syntax, and still opened a.txt: the file was opened to read the address in, and stayed when the address failed. The trailing colon is now no part of the place, and a pane opened only to evaluate an address that fails goes again, the miss said from the pane looked from. Co-Authored-By: Claude Opus 5.5 --- src/ninep/ctl.zig | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/ninep/ctl.zig') diff --git a/src/ninep/ctl.zig b/src/ninep/ctl.zig index 6326b1c0..9092a307 100644 --- a/src/ninep/ctl.zig +++ b/src/ninep/ctl.zig @@ -1852,6 +1852,36 @@ test "a bad setting value is quoted, so two different bad values log as two reco try testing.expect(!th.logHas(p, "(x2)")); } +test "a look line's trailing colon is dropped, and a look whose address fails never leaves its file open" { + const p = try withFile(testing.allocator, "x\n"); + defer p.deinit(); + var tmp = testing.tmpDir(.{}); + defer tmp.cleanup(); + try tmp.dir.writeFile(testing.io, .{ .sub_path = "a.txt", .data = "one\ntwo\nthree\n" }); + var dir_buf: [4096]u8 = undefined; + const dir = dir_buf[0..try tmp.dir.realPath(testing.io, &dir_buf)]; + var line: [4200]u8 = undefined; + const count = struct { + fn of(pp: *Pardes) usize { + var n: usize = 0; + for (pp.panes) |slot| n += @intFromBool(slot != null); + return n; + } + }.of; + const before = count(p); + // Failing addresses: nothing opened, the write still answered. + inline for ([_][]const u8{ "{s}/a.txt:/nomatch/\n", "{s}/a.txt:9:\n" }) |fmt| { + _ = wr(p, root_look, try std.fmt.bufPrint(&line, fmt, .{dir})); + try testing.expectEqual(before, count(p)); + } + // `a.txt:2:3:` is `a.txt:2:3`: it opens there. + try testing.expectEqual(Status.ok, wr(p, root_look, try std.fmt.bufPrint(&line, "{s}/a.txt:2:3:\n", .{dir})).reply.status); + try testing.expectEqual(before + 1, count(p)); + const opened = p.panes[p.active].?; + try testing.expect(std.mem.endsWith(u8, opened.file.?.path, "/a.txt")); + try testing.expectEqual(@as(i32, 1), opened.body.cur_row); +} + test "a bare :N or :N:M look addresses the pane itself, from its look, the root's and event write-back" { const p = try withFile(testing.allocator, "alpha\nbeta\ngamma\n"); defer p.deinit(); -- cgit v1.3