+60
-9
src/main.zig
+60
-9
src/main.zig
···
20
20
\\ -A, --almost-all Like --all, but skips implicit "." and ".." directories
21
21
\\ -C, --columns Print the output in columns
22
22
\\ --color=WHEN When to use colors (always, auto, never)
23
+
\\ --group=WHEN When to display group (always, auto, never)
23
24
\\ --group-directories-first Print all directories before printing regular files
24
25
\\ --hyperlinks=WHEN When to use OSC 8 hyperlinks (always, auto, never)
25
26
\\ --icons=WHEN When to display icons (always, auto, never)
26
27
\\ -l, --long Display extended file metadata
28
+
\\ --mode=WHEN When to display mode (always, auto, never)
27
29
\\ -r, --reverse Reverse the sort order
28
30
\\ -t, --time Sort the entries by modification time, most recent first
31
+
\\ --user=WHEN When to display user (always, auto, never)
29
32
\\
30
33
;
31
34
···
39
42
@"group-directories-first": bool = true,
40
43
hyperlinks: When = .auto,
41
44
icons: When = .auto,
45
+
mode: When = .auto,
46
+
user: When = .auto,
47
+
group: When = .auto,
42
48
long: bool = false,
43
49
sort_by_mod_time: bool = false,
44
50
reverse_sort: bool = false,
···
109
115
}
110
116
}
111
117
118
+
fn showMode(self: Options) bool {
119
+
switch (self.mode) {
120
+
.never => return false,
121
+
.always => return true,
122
+
.auto => return self.isatty(),
123
+
}
124
+
}
125
+
126
+
fn showUser(self: Options) bool {
127
+
switch (self.user) {
128
+
.never => return false,
129
+
.always => return true,
130
+
.auto => return self.isatty(),
131
+
}
132
+
}
133
+
134
+
fn showGroup(self: Options) bool {
135
+
switch (self.group) {
136
+
.never => return false,
137
+
.always => return true,
138
+
.auto => return self.isatty(),
139
+
}
140
+
}
141
+
112
142
fn useHyperlinks(self: Options) bool {
113
143
switch (self.hyperlinks) {
114
144
.never => return false,
···
213
243
};
214
244
} else if (eql(opt, "icons")) {
215
245
cmd.opts.icons = std.meta.stringToEnum(Options.When, val) orelse {
216
-
try stderr.print("Invalid color option: '{s}'", .{val});
246
+
try stderr.print("Invalid icons option: '{s}'", .{val});
247
+
std.process.exit(1);
248
+
};
249
+
} else if (eql(opt, "mode")) {
250
+
cmd.opts.mode = std.meta.stringToEnum(Options.When, val) orelse {
251
+
try stderr.print("Invalid mode option: '{s}'", .{val});
252
+
std.process.exit(1);
253
+
};
254
+
} else if (eql(opt, "user")) {
255
+
cmd.opts.user = std.meta.stringToEnum(Options.When, val) orelse {
256
+
try stderr.print("Invalid user option: '{s}'", .{val});
257
+
std.process.exit(1);
258
+
};
259
+
} else if (eql(opt, "group")) {
260
+
cmd.opts.group = std.meta.stringToEnum(Options.When, val) orelse {
261
+
try stderr.print("Invalid group option: '{s}'", .{val});
217
262
std.process.exit(1);
218
263
};
219
264
} else if (eql(opt, "columns")) {
···
503
548
504
549
const mode = entry.modeStr();
505
550
506
-
try writer.writeAll(&mode);
507
-
try writer.writeByte(' ');
508
-
try writer.writeAll(user.name);
509
-
try writer.writeByteNTimes(' ', longest_user - user.name.len);
510
-
try writer.writeByte(' ');
511
-
try writer.writeAll(group.name);
512
-
try writer.writeByteNTimes(' ', longest_group - group.name.len);
513
-
try writer.writeByte(' ');
551
+
if (cmd.opts.showMode()) {
552
+
try writer.writeAll(&mode);
553
+
try writer.writeByte(' ');
554
+
}
555
+
if (cmd.opts.showUser()) {
556
+
try writer.writeAll(user.name);
557
+
try writer.writeByteNTimes(' ', longest_user - user.name.len);
558
+
try writer.writeByte(' ');
559
+
}
560
+
if (cmd.opts.showGroup()) {
561
+
try writer.writeAll(group.name);
562
+
try writer.writeByteNTimes(' ', longest_group - group.name.len);
563
+
try writer.writeByte(' ');
564
+
}
514
565
515
566
var size_buf: [16]u8 = undefined;
516
567
const size = try entry.humanReadableSize(&size_buf);