diff --git a/src/nnn.c b/src/nnn.c index 31400388..20214a66 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -676,6 +676,7 @@ static haiku_nm_h haiku_hnd; #define cleartimeout() timeout(-1) #define errexit() printerr(__LINE__) #define setdirwatch() (cfg.filtermode ? (presel = FILTER) : (dir_changed = TRUE)) +#define filterset() (g_ctx[cfg.curctx].c_fltr[1]) /* We don't care about the return value from strcmp() */ #define xstrcmp(a, b) (*(a) != *(b) ? -1 : strcmp((a), (b))) /* A faster version of xisdigit */ @@ -1969,7 +1970,7 @@ finish: return ret; } -static void get_archive_cmd(char *cmd, char *archive) +static void get_archive_cmd(char *cmd, const char *archive) { uchar i = 3; const char *arcmd[] = {"atool -a", "bsdtar -acvf", "zip -r", "tar -acvf"}; @@ -2310,7 +2311,7 @@ static int nextsel(int presel) //DPRINTF_S(keyname(c)); if (c == ERR && presel == MSGWAIT) - c = (cfg.filtermode) ? FILTER : CONTROL('L'); + c = (cfg.filtermode || filterset()) ? FILTER : CONTROL('L'); else if (c == FILTER || c == CONTROL('L')) /* Clear previous filter when manually starting */ clearfilter(); @@ -2497,6 +2498,9 @@ static int filterentries(char *path, char *lastname) redraw(path); } + if (!cfg.filtermode) + return 0; + len = mbstowcs(wln, ln, REGEX_MAX); } else { ln[0] = wln[0] = cfg.regex ? RFILTER : FILTER; @@ -2657,11 +2661,6 @@ end: if (ln[1]) ln[REGEX_MAX - 1] = ln[1]; - if (*ch != 27 && *ch != '\t' && *ch != KEY_UP && *ch != KEY_DOWN && *ch != CONTROL('T')) { - ln[0] = ln[1] = '\0'; - move_cursor(cur, 0); - } - /* Save current */ if (ndents) copycurname(); @@ -4741,7 +4740,7 @@ static int handle_context_switch(enum action sel, char *newpath) return r; } -static bool set_sort_flags(int r) +static int set_sort_flags(int r) { switch (r) { case 'a': /* Apparent du */ @@ -4770,7 +4769,6 @@ static bool set_sort_flags(int r) cfg.sizeorder = 0; cfg.extnorder = 0; entrycmpfn = &entrycmp; - clearfilter(); /* Reload directory */ endselection(); /* We are going to reload dir */ break; case 'c': @@ -4813,10 +4811,10 @@ static bool set_sort_flags(int r) namecmpfn = (namecmpfn == &xstrverscasecmp) ? &xstricmp : &xstrverscasecmp; break; default: - return FALSE; + return 0; } - return TRUE; + return r; } static bool set_time_type(int *presel) @@ -4974,6 +4972,8 @@ static void redraw(char *path) xlines = LINES; xcols = COLS; + DPRINTF_S(__FUNCTION__); + int ncols = (xcols <= PATH_MAX) ? xcols : PATH_MAX; int onscreen = xlines - 4; int i; @@ -5342,8 +5342,13 @@ nochange: > DOUBLECLICK_INTERVAL_NS) break; mousetimings[currentmouse].tv_sec = 0; - } else + } else { + if (cfg.filtermode || filterset()) + presel = FILTER; + if (ndents) + copycurname(); goto nochange; + } #endif // fallthrough case SEL_NAV_IN: // fallthrough @@ -5445,6 +5450,10 @@ nochange: mkpath(path, dents[cur].name, newpath); handle_archive(newpath, path, r); copycurname(); + if (r == 'l') { + statusbar(path); + goto nochange; + } goto begin; } @@ -5478,7 +5487,6 @@ nochange: /* Move cursor to the next entry if not the last entry */ if ((g_states & STATE_AUTONEXT) && cur != ndents - 1) move_cursor((cur + 1) % ndents, 0); - continue; } default: @@ -5653,24 +5661,23 @@ nochange: cfg.blkorder = 0; continue; default: /* SEL_SORT */ - if (!set_sort_flags(get_input(messages[MSG_ORDER]))) { + r = set_sort_flags(get_input(messages[MSG_ORDER])); + if (!r) { printwait(messages[MSG_INVALID_KEY], &presel); goto nochange; } } - if (!cfg.blkorder && cfg.filtermode) - presel = FILTER; - /* Save current */ if (ndents) copycurname(); - /* If there's no filter, reload the directory */ - if (!g_ctx[cfg.curctx].c_fltr[1]) + if (cfg.filtermode || filterset()) + presel = FILTER; + + if (r == 'd' || r == 'a') goto begin; - presel = FILTER; /* If there's a filter, apply it */ break; case SEL_STATS: // fallthrough case SEL_CHMODX: @@ -5692,6 +5699,7 @@ nochange: case SEL_REDRAW: // fallthrough case SEL_RENAMEMUL: // fallthrough case SEL_HELP: // fallthrough + case SEL_AUTONEXT: // fallthrough case SEL_EDIT: // fallthrough case SEL_LOCK: { @@ -5718,10 +5726,15 @@ nochange: refresh = TRUE; break; case SEL_HELP: - show_help(path); + show_help(path); // fallthrough + case SEL_AUTONEXT: + if (sel == SEL_AUTONEXT) + g_states ^= STATE_AUTONEXT; if (cfg.filtermode) presel = FILTER; - continue; + if (ndents) + copycurname(); + goto nochange; case SEL_EDIT: spawn(editor, dents[cur].name, NULL, path, F_CLI); continue; @@ -5733,7 +5746,7 @@ nochange: /* In case of successful operation, reload contents */ /* Continue in navigate-as-you-type mode, if enabled */ - if (cfg.filtermode && !refresh) + if ((cfg.filtermode || filterset()) && !refresh) break; /* Save current */ @@ -5874,13 +5887,15 @@ nochange: mkpath(tmp, dents[cur].name, newpath); xrm(newpath); - if (cfg.filtermode) + if (cfg.filtermode || filterset()) presel = FILTER; if (access(newpath, F_OK) == 0) { /* File not removed */ copycurname(); + if (!cfg.filtermode) + statusbar(path); goto nochange; - } else if (cur) { + } else if (ndents) { cur += (cur != (ndents - 1)) ? 1 : -1; copycurname(); } else @@ -5998,25 +6013,30 @@ nochange: (r == 's') ? archive_selection(newpath, tmp, path) : spawn(newpath, tmp, dents[cur].name, path, F_NORMAL | F_MULTI); - // fallthrough + + mkpath(path, tmp, newpath); + if (access(newpath, F_OK) == 0) { /* File created */ + xstrlcpy(lastname, tmp, NAME_MAX + 1); + clearfilter(); /* Archive name may not match */ + } else { + if (cfg.filtermode) + presel = FILTER; + copycurname(); + } + goto begin; case SEL_OPENWITH: - if (sel == SEL_OPENWITH) { - /* Confirm if app is CLI or GUI */ - r = get_input(messages[MSG_CLI_MODE]); - r = (r == 'c' ? F_CLI : - (r == 'g' ? F_NOWAIT | F_NOTRACE | F_MULTI : 0)); - if (!r) { - cfg.filtermode ? presel = FILTER : statusbar(path); - goto nochange; - } + /* Confirm if app is CLI or GUI */ + r = get_input(messages[MSG_CLI_MODE]); + r = (r == 'c' ? F_CLI : + (r == 'g' ? F_NOWAIT | F_NOTRACE | F_MULTI : 0)); + if (r) { mkpath(path, dents[cur].name, newpath); spawn(tmp, newpath, NULL, path, r); } - if (cfg.filtermode) - presel = FILTER; + cfg.filtermode ? presel = FILTER : statusbar(path); copycurname(); - goto begin; + goto nochange; case SEL_RENAME: /* Skip renaming to same name */ if (strcmp(tmp, dents[cur].name) == 0) { @@ -6081,7 +6101,6 @@ nochange: mkpath(path, tmp, newpath); ret = xmktree(newpath, TRUE); } else if (r == 's' || r == 'h') { - if (tmp[0] == '@' && tmp[1] == '\0') tmp[0] = '\0'; ret = xlink(tmp, path, (ndents ? dents[cur].name : NULL), @@ -6101,6 +6120,7 @@ nochange: presel = FILTER; copycurname(); } + clearfilter(); } goto begin; @@ -6192,8 +6212,11 @@ nochange: if (cfg.filtermode) presel = FILTER; + if (ndents) + copycurname(); goto nochange; default: /* SEL_RUNCMD */ + r = TRUE; #ifndef NORL if (cfg.picker) { #endif @@ -6208,11 +6231,8 @@ nochange: #endif if (tmp && *tmp) // NOLINT prompt_run(tmp, (ndents ? dents[cur].name : ""), path); - else { - if (cfg.filtermode) - presel = FILTER; - goto nochange; - } + else + r = FALSE; } /* Continue in navigate-as-you-type mode, if enabled */ @@ -6222,6 +6242,10 @@ nochange: /* Save current */ if (ndents) copycurname(); + + if (!r) + goto nochange; + /* Repopulate as directory content may have changed */ goto begin; case SEL_REMOTE: @@ -6256,11 +6280,6 @@ nochange: statusbar(path); goto nochange; - case SEL_AUTONEXT: - g_states ^= STATE_AUTONEXT; - if (cfg.filtermode) - presel = FILTER; - goto nochange; case SEL_QUITCTX: // fallthrough case SEL_QUITCD: // fallthrough case SEL_QUIT: @@ -6323,17 +6342,21 @@ nochange: goto nochange; goto begin; default: - if (xlines != LINES || xcols != COLS) + r = FALSE; + if (xlines != LINES || xcols != COLS) { setdirwatch(); /* Terminal resized */ - else if (idletimeout && idle == idletimeout) + r = TRUE; + } else if (idletimeout && idle == idletimeout) lock_terminal(); /* Locker */ - else - goto nochange; idle = 0; if (ndents) copycurname(); - goto begin; + + if (r) + continue; + + goto nochange; } /* switch (sel) */ } } diff --git a/src/nnn.h b/src/nnn.h index 4ffce081..c7ce2737 100644 --- a/src/nnn.h +++ b/src/nnn.h @@ -84,6 +84,7 @@ enum action { SEL_REMOTE, SEL_UMOUNT, SEL_HELP, + SEL_AUTONEXT, SEL_EDIT, SEL_PLUGIN, SEL_SHELL, @@ -91,7 +92,6 @@ enum action { SEL_RUNCMD, SEL_LOCK, SEL_SESSIONS, - SEL_AUTONEXT, SEL_QUITCTX, SEL_QUITCD, SEL_QUIT, @@ -223,6 +223,8 @@ static struct key bindings[] = { { 'u', SEL_UMOUNT }, /* Show help */ { '?', SEL_HELP }, + /* Quit a context */ + { '+', SEL_AUTONEXT }, /* Edit in EDITOR */ { 'e', SEL_EDIT }, /* Run a plugin */ @@ -240,8 +242,6 @@ static struct key bindings[] = { /* Manage sessions */ { 's', SEL_SESSIONS }, /* Quit a context */ - { '+', SEL_AUTONEXT }, - /* Quit a context */ { 'q', SEL_QUITCTX }, /* Change dir on quit */ { CONTROL('G'), SEL_QUITCD }, @@ -249,7 +249,9 @@ static struct key bindings[] = { { CONTROL('Q'), SEL_QUIT }, /* Quit with an error code */ { 'Q', SEL_QUITFAIL }, + /* Export list */ { '>', SEL_EXPORT }, + /* Set time type */ { 'T', SEL_TIMETYPE }, #ifndef NOMOUSE { KEY_MOUSE, SEL_CLICK },