aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Arun Prakash Jana <engineerarun@gmail.com>2020-06-09 22:26:35 +0530
committerGravatar Arun Prakash Jana <engineerarun@gmail.com>2020-06-09 22:26:35 +0530
commitb481b23280df43c2def5e90874095dab47b9d361 (patch)
treed37fef52dc27f8e55116f5d70068e62700fbb325
parenteeb802280dac4534a0b1a373ddeb2cd35f74cb39 (diff)
downloadnnn-b481b23280df43c2def5e90874095dab47b9d361.tar.gz
Retain order on session load
-rw-r--r--src/nnn.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/nnn.c b/src/nnn.c
index 49fd70b..20ced40 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -258,7 +258,9 @@ typedef struct {
uint selmode : 1; /* Set when selecting files */
uint showdetail : 1; /* Clear to show fewer file info */
uint ctxactive : 1; /* Context active or not */
- uint reserved1 : 3;
+ uint reverse : 1; /* Reverse sort */
+ uint version : 1; /* Version sort */
+ uint reserved1 : 1;
/* The following settings are global */
uint curctx : 3; /* Current context number */
uint picker : 1; /* Write selection to user-specified file */
@@ -325,6 +327,8 @@ static settings cfg = {
0, /* selmode */
0, /* showdetail */
1, /* ctxactive */
+ 0, /* reverse */
+ 0, /* version */
0, /* reserved1 */
0, /* curctx */
0, /* picker */
@@ -708,6 +712,7 @@ static inline bool getutil(char *util);
static size_t mkpath(const char *dir, const char *name, char *out);
static bool plugscript(const char *plugin, uchar flags);
static char *load_input(int fd, const char *path);
+static int set_sort_flags(int r);
/* Functions */
@@ -3563,6 +3568,7 @@ static bool load_session(const char *sname, char **path, char **lastdir, char **
*lastdir = g_ctx[cfg.curctx].c_last;
*lastname = g_ctx[cfg.curctx].c_name;
printptr = cfg.showdetail ? &printent_long : &printent;
+ set_sort_flags('\0'); /* Set correct sort options */
status = TRUE;
END:
@@ -4937,6 +4943,25 @@ static int handle_context_switch(enum action sel)
static int set_sort_flags(int r)
{
+ bool session = !r;
+
+ /* Set the correct input in case of a session load */
+ if (session) {
+ if (cfg.apparentsz) {
+ cfg.apparentsz = 0;
+ r = 'a';
+ } else if (cfg.blkorder) {
+ cfg.blkorder = 0;
+ r = 'd';
+ }
+
+ if (cfg.version)
+ namecmpfn = &xstrverscasecmp;
+
+ if (cfg.reverse)
+ entrycmpfn = &reventrycmp;
+ }
+
switch (r) {
case 'a': /* Apparent du */
cfg.apparentsz ^= 1;
@@ -4963,7 +4988,10 @@ static int set_sort_flags(int r)
cfg.timeorder = 0;
cfg.sizeorder = 0;
cfg.extnorder = 0;
- entrycmpfn = &entrycmp;
+ if (!session) {
+ cfg.reverse = 0;
+ entrycmpfn = &entrycmp;
+ }
endselection(); /* We are going to reload dir */
break;
case 'c':
@@ -4972,6 +5000,8 @@ static int set_sort_flags(int r)
cfg.apparentsz = 0;
cfg.blkorder = 0;
cfg.extnorder = 0;
+ cfg.reverse = 0;
+ cfg.version = 0;
entrycmpfn = &entrycmp;
namecmpfn = &xstricmp;
break;
@@ -4981,10 +5011,12 @@ static int set_sort_flags(int r)
cfg.timeorder = 0;
cfg.apparentsz = 0;
cfg.blkorder = 0;
+ cfg.reverse = 0;
entrycmpfn = &entrycmp;
break;
case 'r': /* Reverse sort */
- entrycmpfn = (entrycmpfn == &entrycmp) ? &reventrycmp : &entrycmp;
+ cfg.reverse ^= 1;
+ entrycmpfn = cfg.reverse ? &reventrycmp : &entrycmp;
break;
case 's': /* File size */
cfg.sizeorder ^= 1;
@@ -4992,6 +5024,7 @@ static int set_sort_flags(int r)
cfg.apparentsz = 0;
cfg.blkorder = 0;
cfg.extnorder = 0;
+ cfg.reverse = 0;
entrycmpfn = &entrycmp;
break;
case 't': /* Time */
@@ -5000,10 +5033,12 @@ static int set_sort_flags(int r)
cfg.apparentsz = 0;
cfg.blkorder = 0;
cfg.extnorder = 0;
+ cfg.reverse = 0;
entrycmpfn = &entrycmp;
break;
case 'v': /* Version */
- namecmpfn = (namecmpfn == &xstrverscasecmp) ? &xstricmp : &xstrverscasecmp;
+ cfg.version ^= 1;
+ namecmpfn = cfg.version ? &xstrverscasecmp : &xstricmp;
cfg.timeorder = 0;
cfg.sizeorder = 0;
cfg.apparentsz = 0;