@@ 8,6 8,8 @@ use strings;
export fn main() void = {
for (let i = 1z; i < len(os::args); i += 1) {
let segfn: nullable *fn() str = switch (os::args[i]) {
+ case "cwd" =>
+ yield &segs::seg_cwd;
case "hostname" =>
yield &segs::seg_hostname;
case "tail" =>
@@ 0,0 1,33 @@
+use os;
+use strings;
+
+// CWD with contracted path
+export fn seg_cwd() str = {
+ let cwd = os::getcwd();
+ const home = os::tryenv("HOME", "");
+
+ if (strings::hasprefix(cwd, home) == true) {
+ cwd = strings::concat("~", strings::cut(cwd, home).1);
+ };
+
+ const ss = strings::split(cwd, "/");
+ cwd = "";
+ for (let i = 0z; i < len(ss); i += 1) {
+ const s = ss[i];
+ if (i == len(ss) - 1) {
+ cwd = strings::concat(cwd, s);
+ } else {
+ if (len(s) == 0) {
+ cwd = strings::concat(cwd, "/");
+ continue;
+ };
+ if (strings::hasprefix(s, ".")) {
+ cwd = strings::concat(cwd, strings::sub(s, 0, 2), "/");
+ } else {
+ cwd = strings::concat(cwd, strings::sub(s, 0, 1), "/");
+ };
+ };
+ };
+
+ return cwd;
+};