# Description: Enter and exit type-to-nav mode when entering/leaving # bookmark and plugin directory through . # Allows for more seamless bookmark navigation. # # Author: Luuk van Baal diff --git a/src/nnn.c b/src/nnn.c index 1465f4ab..fda99616 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -368,6 +368,7 @@ typedef struct { 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 filtermode : 2; /* Store type-to-nav when entering plugin/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 */ @@ -3446,8 +3447,8 @@ static int filterentries(char *path, char *lastname) } /* If the only match is a dir, auto-enter and cd into it */ - if (ndents == 1 && cfg.filtermode - && cfg.autoenter && (pdents[0].flags & DIR_OR_DIRLNK)) { + if (ndents == 1 && cfg.autoenter && (((pdents[0].flags & DIR_OR_DIRLNK) && + cfg.filtermode) || (g_state.selbm || g_state.runplugin))) { *ch = KEY_ENTER; cur = 0; goto end; @@ -4988,14 +4989,14 @@ static size_t handle_bookmark(const char *bmark, char *newpath) bmark ? xstrsncpy(newpath, bmark, PATH_MAX) : (r = MSG_NOT_SET); else if (fd == '\r') { /* Visit bookmarks directory */ mkpath(cfgpath, toks[TOK_BM], newpath); - g_state.selbm = 1; + g_state.filtermode = cfg.filtermode + 1; + g_state.selbm = cfg.filtermode = 1; } else if (!get_kv_val(bookmark, newpath, fd, maxbm, NNN_BMS)) r = MSG_INVALID_KEY; if (!r && chdir(newpath) == -1) { r = MSG_ACCESS; - if (g_state.selbm) - g_state.selbm = 0; + g_state.selbm = 0; } return r; @@ -6680,6 +6681,12 @@ begin: setdirwatch(); } + if (g_state.filtermode) { + cfg.filtermode = g_state.filtermode - 1; + if (!g_state.selbm) + g_state.filtermode = 0; + } + #ifndef NOX11 xterm_cfg(path); #endif @@ -7769,6 +7776,8 @@ nochange: g_state.runplugin = 1; } + g_state.filtermode = cfg.filtermode + 1; + cfg.filtermode = 1; xstrsncpy(lastdir, path, PATH_MAX); xstrsncpy(path, plgpath, PATH_MAX); if (ndents)