From 85379a703bb698eb69447a1fc2a717e8f2813717 Mon Sep 17 00:00:00 2001
From: Arun Prakash Jana <engineerarun@gmail.com>
Date: Wed, 18 Mar 2020 02:35:05 +0530
Subject: [PATCH] Option -T to change default sort order

---
 misc/auto-completion/bash/nnn-completion.bash |  4 ++++
 misc/auto-completion/fish/nnn.fish            |  1 +
 misc/auto-completion/zsh/_nnn                 |  1 +
 nnn.1                                         |  5 +++++
 src/nnn.c                                     | 18 ++++++++++++------
 5 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/misc/auto-completion/bash/nnn-completion.bash b/misc/auto-completion/bash/nnn-completion.bash
index b6e370da..64dff7a6 100644
--- a/misc/auto-completion/bash/nnn-completion.bash
+++ b/misc/auto-completion/bash/nnn-completion.bash
@@ -31,6 +31,7 @@ _nnn ()
         -s
         -S
         -t
+        -T
         -v
         -V
         -x
@@ -46,6 +47,9 @@ _nnn ()
         COMPREPLY=( $(cd "$sessions_dir" && compgen -f -d -- "$cur") )
     elif [[ $prev == -t ]]; then
         return 1
+    elif [[ $prev == -T ]]; then
+        local keys=$(echo "a d e r s t v" | awk -v RS=' ' '{print $0}')
+        COMPREPLY=( $(compgen -W "$keys" -- "$cur") )
     elif [[ $cur == -* ]]; then
         COMPREPLY=( $(compgen -W "${opts[*]}" -- "$cur") )
     else
diff --git a/misc/auto-completion/fish/nnn.fish b/misc/auto-completion/fish/nnn.fish
index 99c857aa..6bc3e0e0 100644
--- a/misc/auto-completion/fish/nnn.fish
+++ b/misc/auto-completion/fish/nnn.fish
@@ -30,6 +30,7 @@ complete -c nnn -s R    -d 'disable rollover at edges'
 complete -c nnn -s s -r -d 'load session by name' -x -a '@\t"last session" (ls $sessions_dir)'
 complete -c nnn -s S    -d 'start in disk usage analyzer mode'
 complete -c nnn -s t -r -d 'timeout in seconds to lock'
+complete -c nnn -s T -r -d 'a d e r s t v'
 complete -c nnn -s v    -d 'use version compare to sort files'
 complete -c nnn -s V    -d 'show program version and exit'
 complete -c nnn -s x    -d 'notis, sel to system clipboard'
diff --git a/misc/auto-completion/zsh/_nnn b/misc/auto-completion/zsh/_nnn
index bd6e926e..f355263b 100644
--- a/misc/auto-completion/zsh/_nnn
+++ b/misc/auto-completion/zsh/_nnn
@@ -28,6 +28,7 @@ args=(
     '(-s)-s[load session]:session name'
     '(-S)-S[start in disk usage analyzer mode]'
     '(-t)-t[timeout to lock]:seconds'
+    '(-T)-T[a d e r s t v]:key'
     '(-v)-v[use version compare to sort files]'
     '(-V)-V[show program version and exit]'
     '(-x)-x[notis, sel to system clipboard]'
diff --git a/nnn.1 b/nnn.1
index 307a508a..0b5310ab 100644
--- a/nnn.1
+++ b/nnn.1
@@ -24,6 +24,7 @@
 .Op Ar -s name
 .Op Ar -S
 .Op Ar -t secs
+.Op Ar -T key
 .Op Ar -v
 .Op Ar -V
 .Op Ar -x
@@ -110,6 +111,10 @@ supports the following options:
 .Fl "t secs"
         idle timeout in seconds to lock terminal
 .Pp
+.Fl "T key"
+        sort order
+        keys: 'a'u / 'd'u / 'e'xtension / 'r'everse / 's'ize / 't'ime / 'v'ersion
+.Pp
 .Fl v
         use case-insensitive version compare to sort files
 .Pp
diff --git a/src/nnn.c b/src/nnn.c
index da9ddddf..6e2113e4 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -4664,10 +4664,8 @@ static int handle_context_switch(enum action sel, char *newpath)
 	return r;
 }
 
-static bool set_sort_flags(void)
+static bool set_sort_flags(int r)
 {
-	int r = get_input(messages[MSG_ORDER]);
-
 	switch (r) {
 	case 'a': /* Apparent du */
 		cfg.apparentsz ^= 1;
@@ -5559,7 +5557,7 @@ nochange:
 				cfg.blkorder = 0;
 				continue;
 			default: /* SEL_SORT */
-				if (!set_sort_flags()) {
+				if (!set_sort_flags(get_input(messages[MSG_ORDER]))) {
 					if (cfg.filtermode)
 						presel = FILTER;
 					printwait(messages[MSG_INVALID_KEY], &presel);
@@ -6491,6 +6489,7 @@ static void usage(void)
 		" -s name load session by name\n"
 		" -S      du mode\n"
 		" -t secs timeout to lock\n"
+		" -T key  sort order [a/d/e/r/s/t/v]\n"
 		" -v      version sort\n"
 		" -V      show version\n"
 		" -x      notis, sel to system clipboard\n"
@@ -6626,7 +6625,7 @@ int main(int argc, char *argv[])
 {
 	char *arg = NULL;
 	char *session = NULL;
-	int opt;
+	int opt, sort = 0;
 #ifndef NOMOUSE
 	mmask_t mask;
 	char *middle_click_env = xgetenv(env_cfg[NNN_MCLICK], "\0");
@@ -6640,7 +6639,7 @@ int main(int argc, char *argv[])
 
 	while ((opt = (env_opts_id > 0
 		       ? env_opts[--env_opts_id]
-		       : getopt(argc, argv, "aAb:cdeEgHKnop:QrRs:St:vVxh"))) != -1) {
+		       : getopt(argc, argv, "aAb:cdeEgHKnop:QrRs:St:T:vVxh"))) != -1) {
 		switch (opt) {
 		case 'a':
 			cfg.mtime = 0;
@@ -6724,6 +6723,10 @@ int main(int argc, char *argv[])
 			if (env_opts_id < 0)
 				idletimeout = atoi(optarg);
 			break;
+		case 'T':
+			if (env_opts_id < 0)
+				sort = optarg[0];
+			break;
 		case 'v':
 			namecmpfn = &xstrverscasecmp;
 			break;
@@ -6938,6 +6941,9 @@ int main(int argc, char *argv[])
 #endif
 		return _FAILURE;
 
+	if (sort)
+		set_sort_flags(sort);
+
 	opt = browse(initpath, session);
 
 #ifndef NOMOUSE
-- 
2.51.0