summaryrefslogtreecommitdiff
path: root/src/Output.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/Output.zig')
-rw-r--r--src/Output.zig15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/Output.zig b/src/Output.zig
index 5422411f..3bae9ecf 100644
--- a/src/Output.zig
+++ b/src/Output.zig
@@ -31,6 +31,8 @@ pub const Origin = union(enum) {
/// The panes a refusal (Exit, Restore, Del, Delcol, get) is over, kept
/// in +Unsaved rather than a notice that goes.
unsaved,
+ /// A directory's entries (Dir.zig), the pane named for it.
+ dir,
};
pub const max_arg = dump.max_origin_arg;
@@ -228,6 +230,8 @@ pub fn traits(o: Origin) Traits {
.errors => .{ .name = config.errors_buffer, .doc = true },
.pdf_links => .{ .name = config.pdf_links_buffer, .steps = true, .locations = true },
.unsaved => .{ .name = config.unsaved_buffer, .doc = true },
+ // Named for its directory, not a `+` name in it.
+ .dir => .{ .name = "", .doc = true },
.cmd => |b| builtins.registry.outputTraits(b) orelse unreachable,
.query => |k| switch (k) {
.hover => .{ .name = config.hover_buffer },
@@ -288,15 +292,20 @@ pub fn word(o: Origin) []const u8 {
.errors => config.errors_buffer,
.pdf_links => config.pdf_links_buffer,
.unsaved => config.unsaved_buffer,
+ .dir => dir_word,
};
}
+/// A directory pane's origin as a dump names it.
+const dir_word = "dir";
+
pub fn fromWord(w: []const u8) ?Origin {
if (w.len == 0) return null;
if (std.mem.eql(u8, w, "/")) return .search;
if (std.mem.eql(u8, w, config.errors_buffer)) return .errors;
if (std.mem.eql(u8, w, config.pdf_links_buffer)) return .pdf_links;
if (std.mem.eql(u8, w, config.unsaved_buffer)) return .unsaved;
+ if (std.mem.eql(u8, w, dir_word)) return .dir;
if (std.meta.stringToEnum(Builtin, w)) |b|
if (builtins.registry.outputTraits(b) != null) return .{ .cmd = b };
if (std.meta.stringToEnum(lsp.Kind, w)) |k| return .{ .query = k };
@@ -359,7 +368,7 @@ fn sortResults(arena: std.mem.Allocator, from: Origin, content: []u8, anchor: ?u
=> {},
else => return anchor,
},
- .errors, .pdf_links, .unsaved => return anchor,
+ .errors, .pdf_links, .unsaved, .dir => return anchor,
}
if (content.len == 0) return anchor;
const path_only = std.meta.eql(from, Origin{ .cmd = .Find });
@@ -666,7 +675,7 @@ pub fn openUnsaved(p: *Pardes, id: usize, content: []u8) void {
return;
}
const pane = p.panes[id] orelse return p.gpa.free(content);
- const own = if (pane.file) |f| (std.fs.path.dirname(f.path) orelse "/") else pane.cwdSlice();
+ const own = if (pane.file) |f| panes.Dir.ofName(f.path) else pane.cwdSlice();
// Its directory gone (or never there, a name not yet saved): the list
// goes in the session's, where a look from it can still resolve.
const dir = if (comptime pardes.hosted) (if (pardes.filesystem.localPath(own)) |local| (if (exec.isDirectory(local)) own else p.sessionDir()) else own) else own;
@@ -820,7 +829,7 @@ pub fn openFonts(p: *Pardes, id: usize) !void {
fn openStepped(p: *Pardes, id: usize, from: Origin, content: []u8) !void {
errdefer p.gpa.free(content);
const pane = p.panes[id] orelse return error.MissingPane;
- const own = if (pane.file) |f| (std.fs.path.dirname(f.path) orelse "/") else pane.cwdSlice();
+ const own = if (pane.file) |f| panes.Dir.ofName(f.path) else pane.cwdSlice();
// A terminal whose shell has not said where it is yet (an init file's
// word at boot): the session's directory, not `/`.
const dir = if (own.len == 0) p.sessionDir() else own;