aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--config.h7
-rw-r--r--nnn.14
-rw-r--r--nnn.c38
4 files changed, 38 insertions, 13 deletions
diff --git a/README.md b/README.md
index c580bf3..ab2276d 100644
--- a/README.md
+++ b/README.md
@@ -203,6 +203,8 @@ Home, g, ^, ^A | Jump to first entry
^/ | Open desktop search tool
. | Toggle hide .dot files
b | Show bookmark key prompt
+ ^B | Mark current dir
+ ^V | Visit marked dir
c | Show change dir prompt
d | Toggle detail view
D | Show current file details
diff --git a/config.h b/config.h
index 45f036e..275de03 100644
--- a/config.h
+++ b/config.h
@@ -21,6 +21,8 @@ enum action {
SEL_CDBEGIN,
SEL_CDLAST,
SEL_CDBM,
+ SEL_MARK,
+ SEL_VISIT,
SEL_TOGGLEDOT,
SEL_DETAIL,
SEL_STATS,
@@ -111,6 +113,10 @@ static struct key bindings[] = {
{ '-', SEL_CDLAST, "", "" },
/* Change dir using bookmark */
{ 'b', SEL_CDBM, "", "" },
+ /* Mark a path to visit later */
+ { CONTROL('B'), SEL_MARK, "", "" },
+ /* Visit marked directory */
+ { CONTROL('V'), SEL_VISIT, "", "" },
/* Toggle hide .dot files */
{ '.', SEL_TOGGLEDOT, "", "" },
/* Detailed listing */
@@ -129,6 +135,7 @@ static struct key bindings[] = {
{ 'S', SEL_BSIZE, "", "" },
/* Toggle sort by time */
{ 't', SEL_MTIME, "", "" },
+ /* Redraw window */
{ CONTROL('L'), SEL_REDRAW, "", "" },
{ KEY_F(2), SEL_REDRAW, "", "" },
/* Copy currently selected file path */
diff --git a/nnn.1 b/nnn.1
index 562041d..7cece0d 100644
--- a/nnn.1
+++ b/nnn.1
@@ -61,6 +61,10 @@ Search directory in desktop search tool
Toggle hide .dot files
.It Ic b
Show bookmark key prompt
+.It Ic ^B
+Mark current dir
+.It Ic ^V
+Visit marked dir
.It Ic c
Show change dir prompt
.It Ic d
diff --git a/nnn.c b/nnn.c
index 17506fd..2991482 100644
--- a/nnn.c
+++ b/nnn.c
@@ -1500,6 +1500,8 @@ Home, g, ^, ^A | Jump to first entry\n\
^/ | Open desktop search tool\n\
. | Toggle hide .dot files\n\
b | Show bookmark key prompt\n\
+ ^B | Mark current dir\n\
+ ^V | Visit marked dir\n\
c | Show change dir prompt\n\
d | Toggle detail view\n\
D | Show current file details\n\
@@ -1854,9 +1856,8 @@ redraw(char *path)
static void
browse(char *ipath, char *ifilter)
{
- char path[PATH_MAX], oldpath[PATH_MAX], newpath[PATH_MAX];
- char lastdir[PATH_MAX];
- char fltr[LINE_MAX];
+ static char path[PATH_MAX], oldpath[PATH_MAX], newpath[PATH_MAX], lastdir[PATH_MAX], mark[PATH_MAX];
+ static char fltr[LINE_MAX];
char *dir, *tmp, *run, *env, *tgt = NULL;
struct stat sb;
int r, fd, presel;
@@ -1864,9 +1865,7 @@ browse(char *ipath, char *ifilter)
xstrlcpy(path, ipath, PATH_MAX);
xstrlcpy(fltr, ifilter, LINE_MAX);
- oldpath[0] = '\0';
- newpath[0] = '\0';
- lastdir[0] = '\0'; /* Can't move back from initial directory */
+ oldpath[0] = newpath[0] = lastdir[0] = mark[0] = '\0';
if (cfg.filtermode)
presel = FILTER;
@@ -2228,18 +2227,27 @@ nochange:
presel = FILTER;
tgt = NULL;
goto begin;
- case SEL_CDLAST:
- if (lastdir[0] == '\0') {
- printmsg("Hit end of history...");
+ case SEL_CDLAST: // fallthrough
+ case SEL_VISIT:
+ if (sel == SEL_VISIT) {
+ if (xstrcmp(mark, path) == 0)
+ break;
+
+ tmp = mark;
+ } else
+ tmp = lastdir;
+
+ if (tmp[0] == '\0') {
+ printmsg("Not set...");
goto nochange;
}
- if (access(lastdir, R_OK) == -1) {
+ if (access(tmp, R_OK) == -1) {
printwarn();
goto nochange;
}
- xstrlcpy(newpath, lastdir, PATH_MAX);
+ xstrlcpy(newpath, tmp, PATH_MAX);
xstrlcpy(lastdir, path, PATH_MAX);
xstrlcpy(path, newpath, PATH_MAX);
oldpath[0] = '\0';
@@ -2309,6 +2317,10 @@ nochange:
if (cfg.filtermode)
presel = FILTER;
goto begin;
+ case SEL_MARK:
+ xstrlcpy(mark, path, PATH_MAX);
+ printmsg(mark);
+ goto nochange;
case SEL_TOGGLEDOT:
cfg.showhidden ^= 1;
initfilter(cfg.showhidden, &ifilter);
@@ -2468,8 +2480,8 @@ Webpage: https://github.com/jarun/nnn\n", VERSION);
int
main(int argc, char *argv[])
{
- char cwd[PATH_MAX], *ipath;
- char *ifilter, *bmstr;
+ static char cwd[PATH_MAX];
+ char *ipath, *ifilter, *bmstr;
int opt;
/* Confirm we are in a terminal */