aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nnn.c138
-rw-r--r--src/nnn.h19
2 files changed, 75 insertions, 82 deletions
diff --git a/src/nnn.c b/src/nnn.c
index c0c23b8..bd1fb00 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -473,6 +473,7 @@ static char * const utils[] = {
#define MSG_PLUGIN_KEYS 35
#define MSG_BOOKMARK_KEYS 36
#define MSG_INVALID_REG 37
+#define MSG_ORDER 38
static const char * const messages[] = {
"no traversal",
@@ -513,6 +514,7 @@ static const char * const messages[] = {
"plugin keys:",
"bookmark keys:",
"invalid regex",
+ "toggle 'a'u / 'd'u / 'e'xtn / 'r'everse / 's'ize / 't'ime / 'v'ersion?",
};
/* Supported configuration environment variables */
@@ -3608,11 +3610,7 @@ static void show_help(const char *path)
"cV Move sel here%-10c^V Copy/move sel as\n"
"cX Delete sel%-13c^X Delete entry\n"
"cy List sel%-15c^Y Edit sel\n"
- "1ORDER TOGGLES\n"
- "cS Disk usage%-14cA Apparent du\n"
- "cz Size%-20ct Time\n"
- "cv Version%-17cE Extension\n"
- "9R ^T Reverse (tac)%-0c\n"
+ "9o ^T Order toggele%-0c\n"
"1MISC\n"
"9! ^] Shell%-16c; ^F Fire plugin\n"
"c] Cmd prompt%-13c^P Pick plugin\n"
@@ -4231,7 +4229,7 @@ static void statusbar(char *path)
if (cfg.mtimeorder)
sort[0] = cfg.mtime ? 'T' : 'A';
else if (cfg.sizeorder)
- sort[0] = 'Z';
+ sort[0] = 'S';
else if (cfg.extnorder)
sort[0] = 'E';
@@ -4945,16 +4943,7 @@ nochange:
case SEL_MFLTR: // fallthrough
case SEL_TOGGLEDOT: // fallthrough
case SEL_DETAIL: // fallthrough
- case SEL_FSIZE: // fallthrough
- case SEL_ASIZE: // fallthrough
- case SEL_BSIZE: // fallthrough
- case SEL_EXTN: // fallthrough
- case SEL_MTIME: // fallthrough
- case SEL_REVERSE: // fallthrough
- case SEL_VERSION:
- if (sel >= SEL_FSIZE && sel < SEL_REVERSE && entrycmpfn == &reventrycmp)
- entrycmpfn = &entrycmp;
-
+ case SEL_ORDER:
switch (sel) {
case SEL_MFLTR:
cfg.filtermode ^= 1;
@@ -4980,60 +4969,75 @@ nochange:
cfg.showdetail ? (printptr = &printent_long) : (printptr = &printent);
cfg.blkorder = 0;
continue;
- case SEL_FSIZE:
- cfg.sizeorder ^= 1;
- cfg.mtimeorder = 0;
- cfg.apparentsz = 0;
- cfg.blkorder = 0;
- cfg.extnorder = 0;
- break;
- case SEL_ASIZE:
- cfg.apparentsz ^= 1;
- if (cfg.apparentsz) {
- nftw_fn = &sum_sizes;
- cfg.blkorder = 1;
- blk_shift = 0;
- } else
+ case SEL_ORDER:
+ r = get_input(messages[MSG_ORDER]);
+
+ if ((r == 'a' || r == 'd' || r == 'e'
+ || r == 'r' || r == 's' || r == 't')
+ && (entrycmpfn == &reventrycmp))
+ entrycmpfn = &entrycmp;
+
+ switch (r) {
+ case 'a': /* Apparent du */
+ cfg.apparentsz ^= 1;
+ if (cfg.apparentsz) {
+ nftw_fn = &sum_sizes;
+ cfg.blkorder = 1;
+ blk_shift = 0;
+ } else
+ cfg.blkorder = 0;
+ // fallthrough
+ case 'd': /* Disk usage */
+ if (sel == SEL_BSIZE) {
+ if (!cfg.apparentsz)
+ cfg.blkorder ^= 1;
+ nftw_fn = &sum_bsizes;
+ cfg.apparentsz = 0;
+ blk_shift = ffs(S_BLKSIZE) - 1;
+ }
+
+ if (cfg.blkorder) {
+ cfg.showdetail = 1;
+ printptr = &printent_long;
+ }
+ cfg.mtimeorder = 0;
+ cfg.sizeorder = 0;
+ cfg.extnorder = 0;
+ clearfilter(); /* Reload directory */
+ endselection(); /* We are going to reload dir */
+ break;
+ case 'e': /* File extension */
+ cfg.extnorder ^= 1;
+ cfg.sizeorder = 0;
+ cfg.mtimeorder = 0;
+ cfg.apparentsz = 0;
cfg.blkorder = 0;
- // fallthrough
- case SEL_BSIZE:
- if (sel == SEL_BSIZE) {
- if (!cfg.apparentsz)
- cfg.blkorder ^= 1;
- nftw_fn = &sum_bsizes;
+ break;
+ case 'r': /* Reverse sort */
+ entrycmpfn = (entrycmpfn == &entrycmp) ? &reventrycmp : &entrycmp;
+ break;
+ case 's': /* File size */
+ cfg.sizeorder ^= 1;
+ cfg.mtimeorder = 0;
cfg.apparentsz = 0;
- blk_shift = ffs(S_BLKSIZE) - 1;
- }
-
- if (cfg.blkorder) {
- cfg.showdetail = 1;
- printptr = &printent_long;
+ cfg.blkorder = 0;
+ cfg.extnorder = 0;
+ break;
+ case 't': /* Modification or access time */
+ cfg.mtimeorder ^= 1;
+ cfg.sizeorder = 0;
+ cfg.apparentsz = 0;
+ cfg.blkorder = 0;
+ cfg.extnorder = 0;
+ break;
+ case 'v': /* Version */
+ namecmpfn = (namecmpfn == &xstrverscasecmp) ? &xstricmp : &xstrverscasecmp;
+ break;
+ default:
+ cfg.filtermode ? presel = FILTER : statusbar(path);
+ goto nochange;
}
- 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;
- cfg.sizeorder = 0;
- cfg.mtimeorder = 0;
- cfg.apparentsz = 0;
- cfg.blkorder = 0;
- break;
- case SEL_MTIME:
- cfg.mtimeorder ^= 1;
- cfg.sizeorder = 0;
- cfg.apparentsz = 0;
- cfg.blkorder = 0;
- cfg.extnorder = 0;
- break;
- case SEL_REVERSE:
- entrycmpfn = (entrycmpfn == &entrycmp) ? &reventrycmp : &entrycmp;
- break;
- default: /* SEL_VERSION */
- namecmpfn = (namecmpfn == &xstrverscasecmp) ? &xstricmp : &xstrverscasecmp;
+ default:
break;
}
diff --git a/src/nnn.h b/src/nnn.h
index 7d150ed..a572119 100644
--- a/src/nnn.h
+++ b/src/nnn.h
@@ -67,6 +67,7 @@ enum action {
SEL_STATS,
SEL_CHMODX,
SEL_ARCHIVE,
+ SEL_ORDER,
SEL_FSIZE, /* file size */
SEL_ASIZE, /* apparent size */
SEL_BSIZE, /* block size */
@@ -183,21 +184,9 @@ static struct key bindings[] = {
{ '*', SEL_CHMODX },
/* Create archive */
{ 'i', SEL_ARCHIVE },
- /* Toggle sort by size */
- { 'z', SEL_FSIZE },
- /* Sort by apparent size including dir contents */
- { 'A', SEL_ASIZE },
- /* Sort by total block count including dir contents */
- { 'S', SEL_BSIZE },
- /* Sort by file extension */
- { 'E', SEL_EXTN },
- /* Toggle sort by time */
- { 't', SEL_MTIME },
- /* Toggle reverse sort */
- { 'R', SEL_REVERSE },
- { CONTROL('T'), SEL_REVERSE },
- /* Toggle version sort */
- { 'v', SEL_VERSION },
+ /* Order toggle */
+ { 'o', SEL_ORDER },
+ { CONTROL('T'), SEL_ORDER },
/* Redraw window */
{ CONTROL('L'), SEL_REDRAW },
{ KEY_F(5), SEL_REDRAW },