]> Sergey Matveev's repositories - nnn.git/commitdiff
Fix #1369: limit symlinked bookmarks to bookmarks dir
authorArun Prakash Jana <engineerarun@gmail.com>
Sat, 28 May 2022 17:44:07 +0000 (23:14 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sat, 28 May 2022 17:44:07 +0000 (23:14 +0530)
nnn.1
src/nnn.c

diff --git a/nnn.1 b/nnn.1
index d4e48bb08c14b04930ea165bc3bdef651e39a225..d6b82d879786c9c33bc6d2e12ade235fe337e7f4 100644 (file)
--- a/nnn.1
+++ b/nnn.1
@@ -348,23 +348,21 @@ selected entries from the listed results.
 .Sh BOOKMARKS
 There are 2 ways (can be used together) to manage bookmarks.
 .Pp
-(1) Bookmark keys: See \fINNN_BMS\fR under \fIENVIORNMENT\fR section on how to
-    set bookmark keys.
-.Pp
-(2) Symlinked bookmarks: A symlinked bookmark to the current directory can be
-    created with the \fIB\fR key.
-    Add prefix \fBn_\fR to the name to open the target of the symlink.
-    Press '-' to return to the original directory.
+(1) Bookmark keys: See \fINNN_BMS\fR under \fIENVIORNMENT\fR section on how to set
+    bookmark keys.
 
-    Symlinks can also be created manually under the "bookmarks" directory in
-    the nnn config directory (~/.config/nnn/bookmarks).
+    The select bookmark key \fIb\fR lists all the bookmark keys set in \fINNN_BMS\fR
+    in the bookmarks prompt.
+.Pp
+(2) Symlinked bookmarks: A symlinked bookmark to the current directory can
+    be created with the \fIB\fR key (or manually under ~/.config/nnn/bookmarks).
 
     Pressing 'Enter' at the bookmarks prompt takes to this directory.
-    If \fINNN_BMS\fR is not set, it happens directly on select bookmark key.
+    If \fINNN_BMS\fR is not set, the select bookmark key directly opens it.
+
+    Press '-' to return to the original directory right after entering a
+    symlinked bookmark.
 .Pp
-Pressing \fIb\fR will list all the bookmark keys set in NNN_BMS. Pressing
-\fIEnter\fR at this prompt will take to the symlink bookmark directory, if
-NNN_BMS is not set, it happens directly on bookmarks key.
 .Sh UNITS
 The minimum file size unit is byte (B). The rest are K, M, G, T, P, E, Z, Y
 (powers of 1024), same as the default units in \fIls\fR.
index 4de7d70b0509065149a4d0cde0783845ebdad12d..e9919d270f105c03db1122c56b86e2341405e61a 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
 #define MSGWAIT         '$'
 #define SELECT          ' '
 #define PROMPT          ">>> "
-#define BM_PREFIX       "n_"
-#define BM_PREFIX_LEN   (sizeof BM_PREFIX - 1)
 #define REGEX_MAX       48
 #define ENTRY_INCR      64 /* Number of dir 'entry' structures to allocate per shot */
 #define NAMEBUF_INCR    0x800 /* 64 dir entries at once, avg. 32 chars per file name = 64*32B = 2KB */
@@ -369,11 +367,12 @@ typedef struct {
        uint_t rangesel   : 1;  /* Range selection on */
        uint_t runctx     : 3;  /* The context in which plugin is to be run */
        uint_t runplugin  : 1;  /* Choose plugin mode */
+       uint_t selbm      : 1;  /* Select a bookmark from bookmarks directory */
        uint_t selmode    : 1;  /* Set when selecting files */
        uint_t stayonsel  : 1;  /* Disable auto-jump on select */
        uint_t trash      : 2;  /* Trash method 0: rm -rf, 1: trash-cli, 2: gio trash */
        uint_t uidgid     : 1;  /* Show owner and group info */
-       uint_t reserved   : 7;  /* Adjust when adding/removing a field */
+       uint_t reserved   : 6;  /* Adjust when adding/removing a field */
 } runstate;
 
 /* Contexts or workspaces */
@@ -686,7 +685,7 @@ static const char * const messages[] = {
        "invalid key",
        "unchanged",
        "dir changed, range sel off",
-       "name (prefix n_ to identify): ",
+       "name: ",
 };
 
 /* Supported configuration environment variables */
@@ -4987,13 +4986,17 @@ static size_t handle_bookmark(const char *bmark, char *newpath)
        r = FALSE;
        if (fd == ',') /* Visit marked directory */
                bmark ? xstrsncpy(newpath, bmark, PATH_MAX) : (r = MSG_NOT_SET);
-       else if (fd == '\r') /* Visit bookmarks directory */
+       else if (fd == '\r') /* Visit bookmarks directory */
                mkpath(cfgpath, toks[TOK_BM], newpath);
-       else if (!get_kv_val(bookmark, newpath, fd, maxbm, NNN_BMS))
+               g_state.selbm = TRUE;
+       } else if (!get_kv_val(bookmark, newpath, fd, maxbm, NNN_BMS))
                r = MSG_INVALID_KEY;
 
-       if (!r && chdir(newpath) == -1)
+       if (!r && chdir(newpath) == -1) {
                r = MSG_ACCESS;
+               if (g_state.selbm)
+                       g_state.selbm = FALSE;
+       }
 
        return r;
 }
@@ -6907,10 +6910,14 @@ nochange:
 
                        pent = &pdents[cur];
                        r = FALSE;
-                       /* Check if it's a symlinked boookmark */
-                       (S_ISLNK(pent->mode) && is_prefix(pent->name, BM_PREFIX, BM_PREFIX_LEN))
-                               ? (realpath(pent->name, newpath) && xstrsncpy(path, lastdir, PATH_MAX))
-                               : mkpath(path, pent->name, newpath);
+
+                       if (g_state.selbm) {
+                               S_ISLNK(pent->mode)
+                                       ? (realpath(pent->name, newpath) && xstrsncpy(path, lastdir, PATH_MAX))
+                                       : mkpath(path, pent->name, newpath);
+                               g_state.selbm = FALSE;
+                       } else
+                               mkpath(path, pent->name, newpath);
                        DPRINTF_S(newpath);
 
                        /* Visit directory */