瀏覽代碼

Add option -b to open bookmark directly

master
Arun Prakash Jana 7 年之前
父節點
當前提交
d9537e6d49
沒有發現已知的金鑰在資料庫的簽署中 GPG Key ID: A75979F35C080412
共有 3 個文件被更改,包括 67 次插入35 次删除
  1. +2
    -0
      README.md
  2. +4
    -0
      nnn.1
  3. +61
    -35
      nnn.c

+ 2
- 0
README.md 查看文件

@@ -87,6 +87,7 @@ Have fun with it! PRs are welcome. Check out [#1](https://github.com/jarun/nnn/i
- Familiar shortcuts
- *Navigate-as-you-type* mode
- Bookmarks support; pin and visit a directory
- Open a bookmarked directory on start
- Jump HOME or to the last visited directory (as usual!)
- Jump to initial dir, chdir prompt, cd ..... (with . as PWD)
- Roll-over at edges, page through entries
@@ -189,6 +190,7 @@ positional arguments:
PATH directory to open [default: current dir]

optional arguments:
-b key specify bookmark key to open
-c N specify dir color, disables if N>7
-e use exiftool instead of mediainfo
-i start in navigate-as-you-type mode


+ 4
- 0
nnn.1 查看文件

@@ -6,6 +6,7 @@
.Nd the missing terminal file browser for X
.Sh SYNOPSIS
.Nm
.Op Ar -b key
.Op Ar -c N
.Op Ar -e
.Op Ar -i
@@ -118,6 +119,9 @@ PAGER. Please use the PAGER-specific keys in these screens.
.Nm
supports the following options:
.Pp
.Fl "b key"
specify bookmark key to open
.Pp
.Fl "c N"
specify dir color (default blue), disables if N>7
0-black, 1-red, 2-green, 3-yellow, 4-blue, 5-magenta, 6-cyan, 7-white


+ 61
- 35
nnn.c 查看文件

@@ -268,6 +268,7 @@ static char *STR_NFTWFAIL = "nftw(3) failed";
static char *STR_ATROOT = "You are at /";
static char *STR_NOHOME = "HOME not set";
static char *STR_INPUT = "No traversal delimiter allowed";
static char *STR_INVBM = "Invalid bookmark";

/* For use in functions which are isolated and don't return the buffer */
static char g_buf[MAX_CMD_LEN];
@@ -1155,6 +1156,39 @@ parsebmstr(char *bms)
}
}

/*
* Get the real path to a bookmark
*
* NULL is returned in case of no match, path resolution failure etc.
* buf would be modified, so check return value before access
*/
static char *
get_bm_loc(char *key, char *buf)
{
if (!key || !key[0])
return NULL;

for (int r = 0; bookmark[r].key && r < BM_MAX; ++r) {
if (xstrcmp(bookmark[r].key, key) == 0) {
if (bookmark[r].loc[0] == '~') {
char *home = getenv("HOME");
if (!home) {
DPRINTF_S(STR_NOHOME);
return NULL;
}

snprintf(buf, PATH_MAX, "%s%s", home, bookmark[r].loc + 1);
} else
xstrlcpy(buf, bookmark[r].loc, PATH_MAX);

return buf;
}
}

DPRINTF_S("Invalid key");
return NULL;
}

static void
resetdircolor(mode_t mode)
{
@@ -2499,37 +2533,18 @@ nochange:
if (tmp == NULL)
break;

for (r = 0; bookmark[r].key && r < BM_MAX; ++r) {
if (xstrcmp(bookmark[r].key, tmp) != 0)
continue;

if (bookmark[r].loc[0] == '~') {
/* Expand ~ to HOME */
char *home = getenv("HOME");

if (home)
snprintf(newpath, PATH_MAX, "%s%s", home, bookmark[r].loc + 1);
else {
printmsg(STR_NOHOME);
goto nochange;
}
} else
mkpath(path, bookmark[r].loc, newpath, PATH_MAX);

if (!xdiraccess(newpath))
goto nochange;
if (get_bm_loc(tmp, newpath) == NULL) {
printmsg(STR_INVBM);
goto nochange;
}

if (xstrcmp(path, newpath) == 0)
break;
if (!xdiraccess(newpath))
goto nochange;

oldpath[0] = '\0';
if (xstrcmp(path, newpath) == 0)
break;
}

if (!bookmark[r].key) {
printmsg("No matching bookmark");
goto nochange;
}
oldpath[0] = '\0';

/* Save last working directory */
xstrlcpy(lastdir, path, PATH_MAX);
@@ -2820,6 +2835,7 @@ The missing terminal file browser for X.\n\n\
positional arguments:\n\
PATH directory to open [default: current dir]\n\n\
optional arguments:\n\
-b key specify bookmark key to open\n\
-c N specify dir color, disables if N>7\n\
-e use exiftool instead of mediainfo\n\
-i start in navigate-as-you-type mode\n\
@@ -2836,7 +2852,7 @@ int
main(int argc, char *argv[])
{
static char cwd[PATH_MAX];
char *ipath, *ifilter, *bmstr;
char *ipath = NULL, *ifilter, *bmstr;
int opt;

/* Confirm we are in a terminal */
@@ -2845,7 +2861,7 @@ main(int argc, char *argv[])
exit(1);
}

while ((opt = getopt(argc, argv, "Slic:ep:vh")) != -1) {
while ((opt = getopt(argc, argv, "Slib:c:ep:vh")) != -1) {
switch (opt) {
case 'S':
cfg.blkorder = 1;
@@ -2857,6 +2873,9 @@ main(int argc, char *argv[])
case 'i':
cfg.filtermode = 1;
break;
case 'b':
ipath = optarg;
break;
case 'c':
if (atoi(optarg) > 7)
cfg.showcolor = 0;
@@ -2878,7 +2897,19 @@ main(int argc, char *argv[])
}
}

if (argc == optind) {
/* Parse bookmarks string, if available */
bmstr = getenv("NNN_BMS");
if (bmstr)
parsebmstr(bmstr);

if (ipath) { /* Open a bookmark directly */
if (get_bm_loc(ipath, cwd) == NULL) {
fprintf(stderr, "%s\n", STR_INVBM);
exit(1);
}

ipath = cwd;
} else if (argc == optind) {
/* Start in the current directory */
ipath = getcwd(cwd, PATH_MAX);
if (ipath == NULL)
@@ -2916,11 +2947,6 @@ main(int argc, char *argv[])
gtimeout.tv_nsec = 0;
#endif

/* Parse bookmarks string, if available */
bmstr = getenv("NNN_BMS");
if (bmstr)
parsebmstr(bmstr);

/* Edit text in EDITOR, if opted */
if (getenv("NNN_USE_EDITOR"))
editor = xgetenv("EDITOR", "vi");


Loading…
取消
儲存