From 4c0210ce2b50dab849874e86f7d61549a667d138 Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Thu, 9 Jan 2020 23:51:41 +0530 Subject: [PATCH] Do not reload dir on sort order change when filter is on --- src/nnn.c | 34 ++++++++++++++++------------------ src/nnn.h | 1 + 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/nnn.c b/src/nnn.c index 969bb2bf..89ad544d 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -2158,7 +2158,7 @@ static int filterentries(char *path, char *lastname) goto end; } end: - if (*ch != '\t' && *ch != KEY_UP && *ch != KEY_DOWN) { + if (*ch != 27 && *ch != '\t' && *ch != KEY_UP && *ch != KEY_DOWN && *ch != CONTROL('T')) { g_ctx[cfg.curctx].c_fltr[0] = g_ctx[cfg.curctx].c_fltr[1] = '\0'; move_cursor(cur, 0); } else if (ndents) @@ -3516,7 +3516,7 @@ static void show_help(const char *path) "cS Disk usage%-14cA Apparent du\n" "cz Size%-20ct Time\n" "cv Version%-17cE Extension\n" - "cR Reverse%-0c\n" + "9R ^T Reverse%-0c\n" "1MISC\n" "9! ^] Shell%-17c; x Execute plugin\n" "c] Cmd prompt%-13c^P Pick plugin\n" @@ -4800,6 +4800,9 @@ nochange: case SEL_MTIME: // fallthrough case SEL_VERSION: // fallthrough case SEL_REVERSE: + if (sel >= SEL_FSIZE && sel < SEL_REVERSE && entrycmpfn == &reventrycmp) + entrycmpfn = &entrycmp; + switch (sel) { case SEL_MFLTR: cfg.filtermode ^= 1; @@ -4828,8 +4831,6 @@ nochange: cfg.apparentsz = 0; cfg.blkorder = 0; cfg.extnorder = 0; - if (!cfg.sizeorder) - entrycmpfn = &entrycmp; break; case SEL_ASIZE: cfg.apparentsz ^= 1; @@ -4852,11 +4853,12 @@ nochange: if (cfg.blkorder) { cfg.showdetail = 1; printptr = &printent_long; - } else - entrycmpfn = &entrycmp; + } cfg.mtimeorder = 0; cfg.sizeorder = 0; cfg.extnorder = 0; + clearfilter(); /* Reload directory */ + endselection(); /* We are going to reload dir */ break; case SEL_EXTN: cfg.extnorder ^= 1; @@ -4864,8 +4866,6 @@ nochange: cfg.mtimeorder = 0; cfg.apparentsz = 0; cfg.blkorder = 0; - if (!cfg.extnorder) - entrycmpfn = &entrycmp; break; case SEL_MTIME: cfg.mtimeorder ^= 1; @@ -4873,28 +4873,26 @@ nochange: cfg.apparentsz = 0; cfg.blkorder = 0; cfg.extnorder = 0; - if (!cfg.mtimeorder) - entrycmpfn = &entrycmp; break; case SEL_VERSION: - if (namecmpfn == &xstrverscasecmp) { - namecmpfn = &xstricmp; - entrycmpfn = &entrycmp; - } else - namecmpfn = &xstrverscasecmp; + namecmpfn = (namecmpfn == &xstrverscasecmp) ? &xstricmp : &xstrverscasecmp; break; default: /* SEL_REVERSE */ entrycmpfn = (entrycmpfn == &entrycmp) ? &reventrycmp : &entrycmp; break; } - clearfilter(); - endselection(); + if (cfg.filtermode) + presel = FILTER; /* Save current */ if (ndents) copycurname(); - goto begin; + + /* If there's no filter, reload the directory */ + if (!g_ctx[cfg.curctx].c_fltr[1]) + goto begin; + break; case SEL_STATS: // fallthrough case SEL_CHMODX: if (ndents) { diff --git a/src/nnn.h b/src/nnn.h index e8ac0ff6..98ce2793 100644 --- a/src/nnn.h +++ b/src/nnn.h @@ -197,6 +197,7 @@ static struct key bindings[] = { { 'v', SEL_VERSION }, /* Toggle reverse sort */ { 'R', SEL_REVERSE }, + { CONTROL('T'), SEL_REVERSE }, /* Redraw window */ { CONTROL('L'), SEL_REDRAW }, { KEY_F(5), SEL_REDRAW },