summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWormHeamer2026-01-01 18:11:07 -0500
committerWormHeamer2026-01-01 18:11:07 -0500
commit48490e9fa2e0500401d67a14b3c65cd6fd1a2dd1 (patch)
tree177caae3c08db450f1269caedda9e24b4be35204
parent15647d632973d8aafa163f2e19af11b999195853 (diff)
strip off the largest shared prefix between paths in select_buf()
-rw-r--r--main.c20
1 files changed, 19 insertions, 1 deletions
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;