summaryrefslogtreecommitdiff
path: root/src/builtins.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/builtins.zig')
-rw-r--r--src/builtins.zig35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/builtins.zig b/src/builtins.zig
index 8fcc3c01..780d0bb7 100644
--- a/src/builtins.zig
+++ b/src/builtins.zig
@@ -1159,6 +1159,41 @@ pub const Putall = struct {
}
};
+/// acme's Incl, for the session: `Incl dir ...` adds directories a look at a
+/// name found nowhere else is tried in (`stdio.h`, `<foo.h>`), bare lists
+/// them, `Incl -` empties the list.
+pub const Incl = struct {
+ pub const scope: Scope = .session;
+ pub const takes_arg = true;
+ pub fn run(c: Ctx) void {
+ const p = c.p;
+ const typed = std.mem.trim(u8, c.arg orelse "", " \t\r\n");
+ if (std.mem.eql(u8, typed, "-")) {
+ for (p.incl.items) |dir| p.gpa.free(dir);
+ p.incl.clearRetainingCapacity();
+ return p.setMessage(c.id, "Incl: none");
+ }
+ var words = std.mem.tokenizeAny(u8, typed, " \t");
+ while (words.next()) |dir_word| {
+ var home_buf: [4096]u8 = undefined;
+ const full = std.fs.path.resolvePosix(p.scratch.allocator(), &.{ Pardes.paneDir(c.pane), @import("fs.zig").expandHome(dir_word, &home_buf) }) catch return;
+ if (!std.fs.path.isAbsolute(full)) return p.reportFailure(c.id, "Incl: invalid directory");
+ for (p.incl.items) |dir| {
+ if (std.mem.eql(u8, dir, full)) break;
+ } else {
+ const copy = p.gpa.dupe(u8, full) catch return;
+ p.incl.append(p.gpa, copy) catch return p.gpa.free(copy);
+ }
+ }
+ if (typed.len > 0) return;
+ var list: std.Io.Writer.Allocating = .init(p.scratch.allocator());
+ list.writer.writeAll("Incl:") catch return;
+ for (p.incl.items) |dir| list.writer.print(" {s}", .{dir}) catch return;
+ if (p.incl.items.len == 0) list.writer.writeAll(" none") catch return;
+ p.setMessage(c.id, list.written());
+ }
+};
+
/// Write the pane's text to its file, or to the file its argument names.
pub const Save = struct {
pub const takes_arg = true;