]> Sergey Matveev's repositories - nnn.git/commitdiff
Key - to jump to last visited directory
authorArun Prakash Jana <engineerarun@gmail.com>
Sat, 8 Apr 2017 08:16:03 +0000 (13:46 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sat, 8 Apr 2017 08:16:03 +0000 (13:46 +0530)
README.md
config.def.h
nnn.1
nnn.c

index 505992f9e717df3178bc3370d645e3c491bdb7e8..e398aba9586b20e90da50402fd11735a4c06f973 100644 (file)
--- 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 |
index 7ab38562f3bd3986f7b719e6e1915ebd76d29b9c..7fb03fc4c46dbb76d40272bd4b89474beeb548ba 100644 (file)
@@ -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 100b66a137b234780f267a095634800af2431ab3..f6790365baf96d66f5a8587d725be8d427a08a78 100644 (file)
--- 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 fedd65bfb0e74f2eb12dda1a8b89542db8126d96..387525f5634e7d17dc7651e64b5c23a0d34b34c0 100644 (file)
--- 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);