]> Sergey Matveev's repositories - nnn.git/commitdiff
Experimental: retain filter in normal mode
authorArun Prakash Jana <engineerarun@gmail.com>
Sat, 28 Mar 2020 19:12:20 +0000 (00:42 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sat, 28 Mar 2020 20:28:07 +0000 (01:58 +0530)
src/nnn.c
src/nnn.h

index 3140038857eabbea9392d17ed47b82c3bb372391..20214a66784d1fc56c6a35fdff8995355dcc78bd 100644 (file)
--- 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) */
        }
 }
index 4ffce081e4a298ff4d329ae7d9e1bbc4a8e5daed..c7ce27372703da541792e46790e319eb596701cf 100644 (file)
--- 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 },