From 48490e9fa2e0500401d67a14b3c65cd6fd1a2dd1 Mon Sep 17 00:00:00 2001 From: WormHeamer Date: Thu, 1 Jan 2026 18:11:07 -0500 Subject: strip off the largest shared prefix between paths in select_buf() --- main.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index d6e39b1..3fa36f5 100644 --- a/main.c +++ b/main.c @@ -77,6 +77,8 @@ typedef struct { u32 search_char; int search_char_dir; int search_char_incl; + + Str homedir; } Editor; Editor e = { 0 }; @@ -1204,11 +1206,26 @@ Str select_file(void) { return s; } +Str minimum_prefix(Str *s, u32 n) { + if (!n) return (Str) { 0, 0 }; + Str p = s[0]; + for (u32 i = 1; i < n; i++) { + u32 pn = 0; + while (pn < s[i].n && p.s[pn] == s[i].s[pn]) pn++; + if (pn < p.n) p.n = pn; + } + return p; +} + int select_buf(void) { DYNARR(Str) opt = { 0 }; for (u32 i = 0; i < e.bufn; i++) { DA_APUSH(&opt, &e.scratch, e.buf[i].path); } + Str prefix = minimum_prefix(opt.v, opt.n); + while (prefix.n > 0 && prefix.s[prefix.n-1] != '/') prefix.n--; + for (u32 i = 0; i < opt.n; i++) + opt.v[i] = str_skip(opt.v[i], prefix.n); int o = select_opt(opt.v, opt.c, S("Buffer: ")); if (o == -1) return -1; return o; @@ -1216,6 +1233,7 @@ int select_buf(void) { int main(int argc, const char **argv) { ed_init(&e); + e.homedir = str_from_cstr(getenv("HOME")); if (argc > 1) { ed_buf_close(&e, 0); /* close scratch buffer */ @@ -1381,7 +1399,7 @@ int main(int argc, const char **argv) { e.bufi = ed_buf_open(&e, str_to_cstr(s, &e.scratch)); } } break; - case 'b': { + case 's': { int b = select_buf(); if (b != -1) e.bufi = b; } break; -- cgit v1.2.3