diff options
Diffstat (limited to 'src/look.zig')
| -rw-r--r-- | src/look.zig | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/look.zig b/src/look.zig index 922504c0..105b7717 100644 --- a/src/look.zig +++ b/src/look.zig @@ -1357,9 +1357,11 @@ fn addressed(tok: []const u8) ?struct { path: []const u8, expr: []const u8 } { if (std.mem.indexOfAny(u8, tok[0..colon], " \t") != null) return null; if (std.mem.indexOfAny(u8, expr, " \t") != null and std.mem.indexOfAny(u8, expr, "/?") == null) return null; if (expr.len == 0 or std.mem.indexOfScalar(u8, "0123456789+-/?$.#,;", expr[0]) == null) return null; + // `file:12` is a path's line, looked at as a path; a bare `:12` (`:12:5`) + // has no path, and is this pane's line, an address like any other. if (std.ascii.isDigit(expr[0])) { const pl = parsePathLine(tok); - if (pl.at.line != 0 and pl.end == tok.len) return null; + if (pl.at.line != 0 and pl.end == tok.len and pl.path.len > 0) return null; } return .{ .path = tok[0..colon], .expr = expr }; } @@ -1441,7 +1443,7 @@ fn lookAddress(p: *Pardes, id: usize, path: []const u8, expr: []const u8) void { const pane = p.panes[target] orelse return; const f = pane.file orelse { if (comptime pdf_enabled) if (pane.pdf) |*pv| return lookPdfPage(p, id, target, pv, expr); - if (by_serial and pane.isTerminal()) return lookTerminalAddress(p, id, target, expr); + if ((by_serial or path.len == 0) and pane.isTerminal()) return lookTerminalAddress(p, id, target, expr); // Named as the pane is, the bare `:addr` (path empty) included. var serial_name: [32]u8 = undefined; const subject = if (pane.image) |iv| iv.path else if (path.len > 0) path else std.fmt.bufPrint(&serial_name, config.pane_addr ++ "{d}", .{pane.serial}) catch "the pane"; @@ -1469,8 +1471,9 @@ fn lookAddress(p: *Pardes, id: usize, path: []const u8, expr: []const u8) void { /// other address is refused with what it takes. fn lookPdfPage(p: *Pardes, id: usize, target: usize, pv: anytype, expr: []const u8) void { var cut: [miss_path_cap + "…".len]u8 = undefined; - const page = std.fmt.parseInt(usize, std.mem.trim(u8, expr, " \t"), 10) catch 0; - if (page == 0) return missed(p, id, "{s}: a PDF has no text to address; its address is a page, :N", .{missText(pv.path, &cut)}); + const page = std.fmt.parseInt(usize, std.mem.trim(u8, expr, " \t"), 10) catch + return missed(p, id, "{s}: a PDF has no text to address; its address is a page, :N", .{missText(pv.path, &cut)}); + if (page == 0) return missedPage(p, id, pv.path, 0); if (page > pv.page_count) return missedPage(p, id, pv.path, page); const pane = p.panes[target].?; clearNavigationSelection(p, pane); |
