Support mark a directory

In certain workflows you know you would have revisit a directory. Mark it!
This commit is contained in:
Arun Prakash Jana 2017-08-20 16:47:23 +05:30
parent 29961f060c
commit 3d89b3f945
No known key found for this signature in database
GPG key ID: A75979F35C080412
4 changed files with 38 additions and 13 deletions

View file

@ -203,6 +203,8 @@ Home, g, ^, ^A | Jump to first entry
^/ | Open desktop search tool ^/ | Open desktop search tool
. | Toggle hide .dot files . | Toggle hide .dot files
b | Show bookmark key prompt b | Show bookmark key prompt
^B | Mark current dir
^V | Visit marked dir
c | Show change dir prompt c | Show change dir prompt
d | Toggle detail view d | Toggle detail view
D | Show current file details D | Show current file details

View file

@ -21,6 +21,8 @@ enum action {
SEL_CDBEGIN, SEL_CDBEGIN,
SEL_CDLAST, SEL_CDLAST,
SEL_CDBM, SEL_CDBM,
SEL_MARK,
SEL_VISIT,
SEL_TOGGLEDOT, SEL_TOGGLEDOT,
SEL_DETAIL, SEL_DETAIL,
SEL_STATS, SEL_STATS,
@ -111,6 +113,10 @@ static struct key bindings[] = {
{ '-', SEL_CDLAST, "", "" }, { '-', SEL_CDLAST, "", "" },
/* Change dir using bookmark */ /* Change dir using bookmark */
{ 'b', SEL_CDBM, "", "" }, { 'b', SEL_CDBM, "", "" },
/* Mark a path to visit later */
{ CONTROL('B'), SEL_MARK, "", "" },
/* Visit marked directory */
{ CONTROL('V'), SEL_VISIT, "", "" },
/* Toggle hide .dot files */ /* Toggle hide .dot files */
{ '.', SEL_TOGGLEDOT, "", "" }, { '.', SEL_TOGGLEDOT, "", "" },
/* Detailed listing */ /* Detailed listing */
@ -129,6 +135,7 @@ static struct key bindings[] = {
{ 'S', SEL_BSIZE, "", "" }, { 'S', SEL_BSIZE, "", "" },
/* Toggle sort by time */ /* Toggle sort by time */
{ 't', SEL_MTIME, "", "" }, { 't', SEL_MTIME, "", "" },
/* Redraw window */
{ CONTROL('L'), SEL_REDRAW, "", "" }, { CONTROL('L'), SEL_REDRAW, "", "" },
{ KEY_F(2), SEL_REDRAW, "", "" }, { KEY_F(2), SEL_REDRAW, "", "" },
/* Copy currently selected file path */ /* Copy currently selected file path */

4
nnn.1
View file

@ -61,6 +61,10 @@ Search directory in desktop search tool
Toggle hide .dot files Toggle hide .dot files
.It Ic b .It Ic b
Show bookmark key prompt Show bookmark key prompt
.It Ic ^B
Mark current dir
.It Ic ^V
Visit marked dir
.It Ic c .It Ic c
Show change dir prompt Show change dir prompt
.It Ic d .It Ic d

38
nnn.c
View file

@ -1500,6 +1500,8 @@ Home, g, ^, ^A | Jump to first entry\n\
^/ | Open desktop search tool\n\ ^/ | Open desktop search tool\n\
. | Toggle hide .dot files\n\ . | Toggle hide .dot files\n\
b | Show bookmark key prompt\n\ b | Show bookmark key prompt\n\
^B | Mark current dir\n\
^V | Visit marked dir\n\
c | Show change dir prompt\n\ c | Show change dir prompt\n\
d | Toggle detail view\n\ d | Toggle detail view\n\
D | Show current file details\n\ D | Show current file details\n\
@ -1854,9 +1856,8 @@ redraw(char *path)
static void static void
browse(char *ipath, char *ifilter) browse(char *ipath, char *ifilter)
{ {
char path[PATH_MAX], oldpath[PATH_MAX], newpath[PATH_MAX]; static char path[PATH_MAX], oldpath[PATH_MAX], newpath[PATH_MAX], lastdir[PATH_MAX], mark[PATH_MAX];
char lastdir[PATH_MAX]; static char fltr[LINE_MAX];
char fltr[LINE_MAX];
char *dir, *tmp, *run, *env, *tgt = NULL; char *dir, *tmp, *run, *env, *tgt = NULL;
struct stat sb; struct stat sb;
int r, fd, presel; int r, fd, presel;
@ -1864,9 +1865,7 @@ browse(char *ipath, char *ifilter)
xstrlcpy(path, ipath, PATH_MAX); xstrlcpy(path, ipath, PATH_MAX);
xstrlcpy(fltr, ifilter, LINE_MAX); xstrlcpy(fltr, ifilter, LINE_MAX);
oldpath[0] = '\0'; oldpath[0] = newpath[0] = lastdir[0] = mark[0] = '\0';
newpath[0] = '\0';
lastdir[0] = '\0'; /* Can't move back from initial directory */
if (cfg.filtermode) if (cfg.filtermode)
presel = FILTER; presel = FILTER;
@ -2228,18 +2227,27 @@ nochange:
presel = FILTER; presel = FILTER;
tgt = NULL; tgt = NULL;
goto begin; goto begin;
case SEL_CDLAST: case SEL_CDLAST: // fallthrough
if (lastdir[0] == '\0') { case SEL_VISIT:
printmsg("Hit end of history..."); if (sel == SEL_VISIT) {
if (xstrcmp(mark, path) == 0)
break;
tmp = mark;
} else
tmp = lastdir;
if (tmp[0] == '\0') {
printmsg("Not set...");
goto nochange; goto nochange;
} }
if (access(lastdir, R_OK) == -1) { if (access(tmp, R_OK) == -1) {
printwarn(); printwarn();
goto nochange; goto nochange;
} }
xstrlcpy(newpath, lastdir, PATH_MAX); xstrlcpy(newpath, tmp, PATH_MAX);
xstrlcpy(lastdir, path, PATH_MAX); xstrlcpy(lastdir, path, PATH_MAX);
xstrlcpy(path, newpath, PATH_MAX); xstrlcpy(path, newpath, PATH_MAX);
oldpath[0] = '\0'; oldpath[0] = '\0';
@ -2309,6 +2317,10 @@ nochange:
if (cfg.filtermode) if (cfg.filtermode)
presel = FILTER; presel = FILTER;
goto begin; goto begin;
case SEL_MARK:
xstrlcpy(mark, path, PATH_MAX);
printmsg(mark);
goto nochange;
case SEL_TOGGLEDOT: case SEL_TOGGLEDOT:
cfg.showhidden ^= 1; cfg.showhidden ^= 1;
initfilter(cfg.showhidden, &ifilter); initfilter(cfg.showhidden, &ifilter);
@ -2468,8 +2480,8 @@ Webpage: https://github.com/jarun/nnn\n", VERSION);
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
char cwd[PATH_MAX], *ipath; static char cwd[PATH_MAX];
char *ifilter, *bmstr; char *ipath, *ifilter, *bmstr;
int opt; int opt;
/* Confirm we are in a terminal */ /* Confirm we are in a terminal */