From e54ed037bd47d879d665745dc4d79db5c42807df Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Sat, 8 Apr 2017 13:46:03 +0530 Subject: [PATCH] Key - to jump to last visited directory --- README.md | 2 ++ config.def.h | 3 +++ nnn.1 | 2 ++ nnn.c | 30 +++++++++++++++++++++++++++++- 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 505992f9..e398aba9 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ I chose to fork because: - Directories first - Sort numeric names in numeric order - Case-insensitive alphabetic content listing instead of upper case first + - Key `-` to jump to last visited directory - Roll over at the first and last entries of a directory (with Up/Down keys) - Removed navigation restriction with relative paths (and let permissions handle it) - Sort entries by file size (largest to smallest) @@ -131,6 +132,7 @@ Start nnn (default: current directory): | `Right`, `Enter`, `l`, `^M` | Open file or enter dir | | `Left`, `Backspace`, `h`, `^H` | Go to parent dir | | `~` | Jump to HOME dir | +| `-` | Jump to last visited dir | | `/`, `&` | Filter dir contents | | `c` | Show change dir prompt | | `d` | Toggle detail view | diff --git a/config.def.h b/config.def.h index 7ab38562..7fb03fc4 100644 --- a/config.def.h +++ b/config.def.h @@ -63,7 +63,10 @@ struct key bindings[] = { { '$', SEL_END, "", "" }, /* Change dir */ { 'c', SEL_CD, "", "" }, + /* HOME */ { '~', SEL_CDHOME, "", "" }, + /* Last visited dir */ + { '-', SEL_LAST, "", "" }, /* Toggle hide .dot files */ { '.', SEL_TOGGLEDOT, "", "" }, /* Detailed listing */ diff --git a/nnn.1 b/nnn.1 index 100b66a1..f6790365 100644 --- a/nnn.1 +++ b/nnn.1 @@ -40,6 +40,8 @@ Open file or enter directory Back up one directory level .It Ic ~ Change to the HOME directory +.It Ic - +Change to the last visited directory .It Ic /, & Change filter (more information below) .It Ic c diff --git a/nnn.c b/nnn.c index fedd65bf..387525f5 100644 --- a/nnn.c +++ b/nnn.c @@ -77,6 +77,7 @@ enum action { SEL_END, SEL_CD, SEL_CDHOME, + SEL_LAST, SEL_TOGGLEDOT, SEL_DETAIL, SEL_STATS, @@ -854,6 +855,7 @@ show_help(void) [Right], [Enter], l, ^M Open file or enter dir\n\ [Left], [Backspace], h, ^H Go to parent dir\n\ ~ Jump to HOME dir\n\ + - Jump to last visited dir\n\ /, & Filter dir contents\n\ c Show change dir prompt\n\ d Toggle detail view\n\ @@ -1060,6 +1062,7 @@ static void browse(char *ipath, char *ifilter) { static char path[PATH_MAX], oldpath[PATH_MAX], newpath[PATH_MAX]; + static char lastdir[PATH_MAX]; static char fltr[LINE_MAX]; char *bin, *dir, *tmp, *run, *env; struct stat sb; @@ -1068,6 +1071,7 @@ browse(char *ipath, char *ifilter) enum action sel = SEL_RUNARG + 1; xstrlcpy(path, ipath, sizeof(path)); + xstrlcpy(lastdir, ipath, sizeof(lastdir)); xstrlcpy(fltr, ifilter, sizeof(fltr)); oldpath[0] = '\0'; newpath[0] = '\0'; @@ -1105,6 +1109,10 @@ nochange: } /* Save history */ xstrlcpy(oldpath, path, sizeof(oldpath)); + + /* Save last working directory */ + xstrlcpy(lastdir, path, sizeof(lastdir)); + xstrlcpy(path, dir, sizeof(path)); /* Reset filter */ xstrlcpy(fltr, ifilter, sizeof(fltr)); @@ -1138,6 +1146,10 @@ nochange: printwarn(); goto nochange; } + + /* Save last working directory */ + xstrlcpy(lastdir, path, sizeof(lastdir)); + xstrlcpy(path, newpath, sizeof(path)); /* Reset filter */ xstrlcpy(fltr, ifilter, sizeof(fltr)); @@ -1259,13 +1271,19 @@ nochange: "%s%s", home, tmp + 1); else mkpath(path, tmp, newpath, sizeof(newpath)); - } else + } else if (tmp[0] == '-' && tmp[1] == '\0') + xstrlcpy(newpath, lastdir, sizeof(newpath)); + else mkpath(path, tmp, newpath, sizeof(newpath)); if (canopendir(newpath) == 0) { printwarn(); goto nochange; } + + /* Save last working directory */ + xstrlcpy(lastdir, path, sizeof(lastdir)); + xstrlcpy(path, newpath, sizeof(path)); /* Reset filter */ xstrlcpy(fltr, ifilter, sizeof(fltr)); @@ -1281,11 +1299,21 @@ nochange: printwarn(); goto nochange; } + + /* Save last working directory */ + xstrlcpy(lastdir, path, sizeof(lastdir)); + xstrlcpy(path, tmp, sizeof(path)); /* Reset filter */ xstrlcpy(fltr, ifilter, sizeof(fltr)); DPRINTF_S(path); goto begin; + case SEL_LAST: + xstrlcpy(newpath, lastdir, sizeof(newpath)); + xstrlcpy(lastdir, path, sizeof(lastdir)); + xstrlcpy(path, newpath, sizeof(path)); + DPRINTF_S(path); + goto begin; case SEL_TOGGLEDOT: showhidden ^= 1; initfilter(showhidden, &ifilter);