aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Araps <dylan.araps@gmail.com>2026-03-14 13:06:35 +0200
committerDylan Araps <dylan.araps@gmail.com>2026-03-14 13:06:35 +0200
commit485223ad67d9ebdd591e744e92c9fd4fc6d12413 (patch)
tree3b62703e2348a506c82dcd9aa9a374272ce48af5
parent6b1050575ceaac57976caddf0663d6ce62e855ef (diff)
dfm: add -c to start with cursor on particular entry.
Also makes root toggle keep cursor posiiton.
-rw-r--r--README.md1
-rw-r--r--dfm.c26
2 files changed, 25 insertions, 2 deletions
diff --git a/README.md b/README.md
index 9563d24..80031ab 100644
--- a/README.md
+++ b/README.md
@@ -148,6 +148,7 @@ options:
-H | +H toggle hidden files (-H off, +H on)
-p picker mode (print selected path to stdout and exit)
-o <opener> program to use when opening files (default: xdg-open)
+-c <name> position cursor over 'name' instead of first entry
-s <mode> change default sort
n name
N name reverse
diff --git a/dfm.c b/dfm.c
index 9c21a7d..8aea34c 100644
--- a/dfm.c
+++ b/dfm.c
@@ -79,6 +79,7 @@ static const char DFM_HELP[] =
"-H | +H toggle hidden files (-H off, +H on)\n"
"-p picker mode (print selected path to stdout and exit)\n"
"-o <opener> program to use when opening files (default: xdg-open)\n"
+ "-c <name> position cursor over 'name' instead of first entry\n"
"-s <mode> change default sort\n"
" n name\n"
" N name reverse\n"
@@ -169,6 +170,7 @@ struct fm {
u64 v[BITSET_W(DFM_DIR_MAX)];
u16 vp[BITSET_W(DFM_DIR_MAX)];
usize vl;
+
char vq[DFM_NAME_MAX];
usize vql;
usize vqw;
@@ -196,9 +198,12 @@ struct fm {
fm_filter sf;
s64 tz;
+
u8 nl;
u8 im;
+
const char *a0;
+ cut ast;
};
// Entry Virtual {{{
@@ -2864,19 +2869,25 @@ act_toggle_root(struct fm *p)
else if (!pe.l)
fm_draw_err(p, S("DFM_SU not set"), 0);
else {
+ cut c = p->c == SIZE_MAX ? CUT_NULL : fm_ent(p, p->c);
usize o = p->ppwd.l;
STR_PUSH(&p->ppwd, "env DFM_LEVEL=");
str_push_c(&p->ppwd, p->nl ? p->nl : '0');
str_push_c(&p->ppwd, ' ');
str_push_s(&p->ppwd, p->a0);
+ if (c.l) {
+ STR_PUSH(&p->ppwd, " -c ");
+ str_push(&p->ppwd, c.d, c.l);
+ }
str_terminate(&p->ppwd);
p->ppwd.l = o;
if (!strcmp(basename_l(pe.d, pe.l), "su")) {
- const char *const a[] = { pe.d, "-c", p->ppwd.m + o, NULL };
+ const char *const a[] = { pe.d, "-c", p->ppwd.m + o, 0 };
fm_exec(p, -1, NULL, a, 0, 1);
} else {
p->ppwd.m[o + 15] = 0;
- const char *const a[] = { pe.d, "env", p->ppwd.m + 5, p->a0, NULL };
+ const char *const a[] = {
+ pe.d, "env", p->ppwd.m + 5, p->a0, c.l ? "-c" : 0, c.d, 0 };
fm_exec(p, -1, NULL, a, 0, 1);
}
}
@@ -3744,6 +3755,12 @@ fm_run(struct fm *p)
{
if (fm_term_init(p) < 0) return -1;
rl_init(&p->r, p->col, CUT_NULL);
+
+ if (p->ast.l) {
+ fm_scroll_to(p, p->ast);
+ fm_cursor_sync(p);
+ }
+
for (; likely(!term_dead(&p->t)); ) {
fm_update(p);
fm_draw(p);
@@ -3799,6 +3816,11 @@ main(int argc, char *argv[])
if (!n) goto arg_no_val;
p.dv = *n;
continue;
+ case 'c':
+ n = arg_next_positional(&A);
+ if (!n) goto arg_no_val;
+ p.ast = (cut){ n, strlen(n) };
+ continue;
case '-':
if (!strcmp(a.pos, "--help")) {
STR_PUSH(s, DFM_HELP);