aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Araps <dylan.araps@gmail.com>2026-03-14 14:16:59 +0200
committerDylan Araps <dylan.araps@gmail.com>2026-03-14 14:16:59 +0200
commit2738107f2af6d789daba7d999595ea9026f7e8d4 (patch)
tree3c695be547c14a895873b0dfcab5887f1e69973d
parent4fbca078e554c38b58c5a16876694cf223caa228 (diff)
dfm: added -q to start in search results
Also made root toggle propagate search
-rw-r--r--README.md1
-rw-r--r--dfm.c35
2 files changed, 35 insertions, 1 deletions
diff --git a/README.md b/README.md
index 80031ab..56ec3d9 100644
--- a/README.md
+++ b/README.md
@@ -149,6 +149,7 @@ options:
-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
+-q <query> start in search results ("*query" for substring)
-s <mode> change default sort
n name
N name reverse
diff --git a/dfm.c b/dfm.c
index 91837f2..bc214d6 100644
--- a/dfm.c
+++ b/dfm.c
@@ -80,6 +80,7 @@ static const char DFM_HELP[] =
"-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"
+ "-q <query> start in search results (\"*query\" for substring)\n"
"-s <mode> change default sort\n"
" n name\n"
" N name reverse\n"
@@ -203,6 +204,7 @@ struct fm {
u8 im;
const char *a0;
+ const char *aq;
cut ast;
};
@@ -2879,10 +2881,21 @@ act_toggle_root(struct fm *p)
str_push_c(&p->ppwd, p->ds);
STR_PUSH(&p->ppwd, " -v ");
str_push_c(&p->ppwd, p->dv);
+ str_push_c(&p->ppwd, ' ');
+ str_push_c(&p->ppwd, p->f & FM_HIDDEN ? '+' : '-');
+ STR_PUSH(&p->ppwd, "H ");
+ str_push(&p->ppwd, c.d, c.l);
if (c.l) {
STR_PUSH(&p->ppwd, " -c ");
str_push(&p->ppwd, c.d, c.l);
}
+ bool q = p->f & FM_SEARCH && p->vql;
+ usize qo = p->ppwd.l + 4;
+ if (q) {
+ STR_PUSH(&p->ppwd, " -q ");
+ if (p->sf == fm_filter_substr) str_push_c(&p->ppwd, '*');
+ str_push(&p->ppwd, p->vq, p->vql);
+ }
str_terminate(&p->ppwd);
p->ppwd.l = o;
if (!strcmp(basename_l(pe.d, pe.l), "su")) {
@@ -2894,7 +2907,9 @@ act_toggle_root(struct fm *p)
char dv[2] = {p->dv, 0 };
const char *const a[] = {
pe.d, "env", p->ppwd.m + 5, p->a0,
- "-s", ds, "-v", dv, c.l ? "-c" : 0, c.d, 0 };
+ p->f & FM_HIDDEN ? "+H" : "-H",
+ "-s", ds, "-v", dv, c.l ? "-c" : 0, c.d,
+ q ? "-q" : 0, p->ppwd.m + qo, 0 };
fm_exec(p, -1, NULL, a, 0, 1);
}
}
@@ -3763,6 +3778,20 @@ fm_run(struct fm *p)
if (fm_term_init(p) < 0) return -1;
rl_init(&p->r, p->col, CUT_NULL);
+ if (p->aq) {
+ if (p->aq[0] == '*') {
+ p->sf = fm_filter_substr;
+ p->aq++;
+ } else
+ p->sf = fm_filter_startswith;
+ str_push_s(&p->r.cl, p->aq);
+ str_terminate(&p->r.cl);
+ rl_cl_sync(&p->r);
+ p->f |= FM_SEARCH;
+ fm_cmd_search(p, &p->r.cl);
+ rl_clear(&p->r);
+ }
+
if (p->ast.l) {
fm_scroll_to(p, p->ast);
fm_cursor_sync(p);
@@ -3818,6 +3847,10 @@ main(int argc, char *argv[])
if (!n) goto arg_no_val;
p.ds = fm_sort_fn(*n) ? *n : 'n';
continue;
+ case 'q':
+ p.aq = arg_next_positional(&A);
+ if (!p.aq) goto arg_no_val;
+ continue;
case 'v':
n = arg_next_positional(&A);
if (!n) goto arg_no_val;