From 9459b15672007c97110bbe4094b59620f3603c17 Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Fri, 14 Aug 2020 08:20:01 +0530 Subject: [PATCH] Simplify and preprocess archive handling --- nnn.1 | 4 ++-- src/nnn.c | 30 ++++++++++++++++++------------ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/nnn.1 b/nnn.1 index 3aa4ab22..ec8df824 100644 --- a/nnn.1 +++ b/nnn.1 @@ -455,9 +455,9 @@ separated by \fI;\fR: If xterm 256 colors aren't supported, earlier colorscheme will be used. .Ed .Pp -\fBNNN_ARCHIVE:\fR archive types to be handled silently (default: bzip2, (g)zip, tar). +\fBNNN_ARCHIVE:\fR archive extensions to be handled silently (default: bzip2, (g)zip, tar). .Bd -literal - export NNN_ARCHIVE="\\\\.(7z|bz2|gz|tar|tgz|zip)$" + export NNN_ARCHIVE="(7z|bz2|gz|tar|tgz|zip)$" NOTE: Non-default formats may require a third-party utility. .Ed diff --git a/src/nnn.c b/src/nnn.c index 1f0386ba..0b8a7785 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -663,7 +663,7 @@ static const char * const patterns[] = { "sed -i 's|^\\(\\(.*/\\)\\(.*\\)$\\)|#\\1\\n\\3|' %s", "sed 's|^\\([^#/][^/]\\?.*\\)$|%s/\\1|;s|^#\\(/.*\\)$|\\1|' " "%s | tr '\\n' '\\0' | xargs -0 -n2 sh -c '%s \"$0\" \"$@\" < /dev/tty'", - "\\.(bz|bz2|gz|tar|taz|tbz|tbz2|tgz|z|zip)$", + "(bz|bz2|gz|tar|taz|tbz|tbz2|tgz|z|zip)$", "sed -i 's|^%s\\(.*\\)$|%s\\1|' %s", }; @@ -5587,6 +5587,7 @@ static bool browse(char *ipath, const char *session, int pkey) char rundir[PATH_MAX] __attribute__ ((aligned)); char runfile[NAME_MAX + 1] __attribute__ ((aligned)); char *path, *lastdir, *lastname, *dir, *tmp; + pEntry pent; enum action sel; struct stat sb; int r = -1, presel, selstartid = 0, selendid = 0; @@ -5863,11 +5864,12 @@ nochange: if (!ndents) goto begin; - mkpath(path, pdents[cur].name, newpath); + pent = &pdents[cur]; + mkpath(path, pent->name, newpath); DPRINTF_S(newpath); /* Visit directory */ - if (pdents[cur].flags & DIR_OR_LINK_TO_DIR) { + if (pent->flags & DIR_OR_LINK_TO_DIR) { if (chdir(newpath) == -1) { printwarn(&presel); goto nochange; @@ -5892,16 +5894,16 @@ nochange: /* If opened as vim plugin and Enter/^M pressed, pick */ if (g_state.picker && sel == SEL_GOIN) { - appendfpath(newpath, mkpath(path, pdents[cur].name, newpath)); + appendfpath(newpath, mkpath(path, pent->name, newpath)); writesel(pselbuf, selbufpos - 1); return EXIT_SUCCESS; } if (sel == SEL_NAV_IN) { /* If in listing dir, go to target on `l` or Right on symlink */ - if (listpath && S_ISLNK(pdents[cur].mode) + if (listpath && S_ISLNK(pent->mode) && is_prefix(path, listpath, xstrlen(listpath))) { - if (!realpath(pdents[cur].name, newpath)) { + if (!realpath(pent->name, newpath)) { printwarn(&presel); goto nochange; } @@ -5919,7 +5921,7 @@ nochange: cdprep(lastdir, NULL, path, newpath) ? (presel = FILTER) : (watch = TRUE); - xstrsncpy(lastname, pdents[cur].name, NAME_MAX + 1); + xstrsncpy(lastname, pent->name, NAME_MAX + 1); goto begin; } @@ -5939,7 +5941,7 @@ nochange: rundir[0] = '\0'; if (chdir(path) == -1 - || !run_selected_plugin(&path, pdents[cur].name, + || !run_selected_plugin(&path, pent->name, runfile, &lastname, &lastdir)) { DPRINTF_S("plugin failed!"); } @@ -5971,15 +5973,19 @@ nochange: continue; } + /* Get the extension for regext match */ + tmp = xextension(pent->name, pent->nlen - 1); + if (tmp) + ++tmp; #ifdef PCRE - if (!pcre_exec(archive_pcre, NULL, pdents[cur].name, - xstrlen(pdents[cur].name), 0, 0, NULL, 0)) { + if (tmp && !pcre_exec(archive_pcre, NULL, tmp, + pent->nlen - (tmp - pent->name) - 1, 0, 0, NULL, 0)) { #else - if (!regexec(&archive_re, pdents[cur].name, 0, NULL, 0)) { + if (tmp && !regexec(&archive_re, tmp, 0, NULL, 0)) { #endif r = get_input(messages[MSG_ARCHIVE_OPTS]); if (r == 'l' || r == 'x') { - mkpath(path, pdents[cur].name, newpath); + mkpath(path, pent->name, newpath); handle_archive(newpath, r); if (r == 'l') { statusbar(path);