From 847bda438065ec7a842d9f7f24edf0715d31a770 Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Tue, 10 Dec 2019 03:56:38 +0530 Subject: [PATCH] Combine archive operations --- README.md | 3 +-- src/nnn.c | 38 ++++++++++++++++++++------------------ src/nnn.h | 11 +++-------- 3 files changed, 24 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 97343d62..c90ccd72 100644 --- a/README.md +++ b/README.md @@ -223,8 +223,7 @@ The list below is from the **dev branch**. Press ? in `nnn` to see th P Copy selection K Edit, flush sel V Move selection w Copy/move sel as X Del selection ^X Del entry - f Create archive T Mount archive - ^F Extract archive F List archive + f Archive o ^F Archive ops e Edit in EDITOR p Open in PAGER ORDER TOGGLES A Apparent du S du diff --git a/src/nnn.c b/src/nnn.c index d6a1a515..aaf4c33a 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -456,6 +456,7 @@ static char * const utils[] = { #define MSG_REMOTE_OPTS 39 #define MSG_RCLONE_DELAY 40 #define MSG_APP_NAME 41 +#define MSG_ARCHIVE_OPTS 42 static const char * const messages[] = { "no traversal", @@ -500,6 +501,7 @@ static const char * const messages[] = { "'s'shfs / 'r'clone?", "may take a while, try refresh", "app name: ", + "e'x'tract / 'l'ist / 'm'ount?", }; /* Supported configuration environment variables */ @@ -3506,8 +3508,7 @@ static void show_help(const char *path) "cP Copy selection K Edit, flush sel\n" "cV Move selection w Copy/move sel as\n" "cX Del selection ^X Del entry\n" - "cf Create archive T Mount archive\n" - "b^F Extract archive F List archive\n" + "cf Archive o ^F Archive ops\n" "ce Edit in EDITOR p Open in PAGER\n" "1ORDER TOGGLES\n" "cA Apparent du S du\n" @@ -4775,8 +4776,6 @@ nochange: } } break; - case SEL_ARCHIVELS: // fallthrough - case SEL_EXTRACT: // fallthrough case SEL_REDRAW: // fallthrough case SEL_RENAMEMUL: // fallthrough case SEL_HELP: // fallthrough @@ -4788,19 +4787,10 @@ nochange: if (ndents) mkpath(path, dents[cur].name, newpath); - else if (sel == SEL_ARCHIVELS || sel == SEL_EXTRACT - || sel == SEL_RUNEDIT || sel == SEL_RUNPAGE) + else if (sel == SEL_RUNEDIT || sel == SEL_RUNPAGE) break; switch (sel) { - case SEL_ARCHIVELS: - handle_archive(newpath, path, 'l'); - refresh = TRUE; - break; - case SEL_EXTRACT: - handle_archive(newpath, path, 'x'); - refresh = TRUE; - break; case SEL_REDRAW: refresh = TRUE; break; @@ -5010,9 +5000,10 @@ nochange: } tmp = NULL; - } else if (!ndents) + } else if (r != 'c' || !ndents) { + clearprompt(); goto nochange; - else + } else tmp = dents[cur].name; tmp = xreadline(tmp, messages[MSG_ARCHIVE_NAME]); break; @@ -5305,8 +5296,19 @@ nochange: /* Repopulate as directory content may have changed */ goto begin; - case SEL_ARCHIVEMNT: - if (!ndents || !archive_mount(dents[cur].name, path, newpath, &presel)) + case SEL_ARCHIVEOPS: + if (!ndents) + goto nochange; + + r = get_input(messages[MSG_ARCHIVE_OPTS]); + if (r == 'l' || r == 'x') { + mkpath(path, dents[cur].name, newpath); + handle_archive(newpath, path, r); + copycurname(); + goto begin; + } + + if (r != 'm' || !archive_mount(dents[cur].name, path, newpath, &presel)) goto nochange; // fallthrough case SEL_REMOTE: if (sel == SEL_REMOTE && !remote_mount(newpath, &presel)) diff --git a/src/nnn.h b/src/nnn.h index c5892ec0..9d4e490d 100644 --- a/src/nnn.h +++ b/src/nnn.h @@ -67,8 +67,6 @@ enum action { SEL_DETAIL, SEL_STATS, SEL_ARCHIVE, - SEL_ARCHIVELS, - SEL_EXTRACT, SEL_FSIZE, /* file size */ SEL_ASIZE, /* apparent size */ SEL_BSIZE, /* block size */ @@ -89,7 +87,7 @@ enum action { SEL_NEW, SEL_RENAME, SEL_RENAMEMUL, - SEL_ARCHIVEMNT, + SEL_ARCHIVEOPS, SEL_REMOTE, SEL_UMOUNT, SEL_HELP, @@ -186,10 +184,6 @@ static struct key bindings[] = { { 'D', SEL_STATS }, /* Create archive */ { 'f', SEL_ARCHIVE }, - /* List archive */ - { 'F', SEL_ARCHIVELS }, - /* Extract archive */ - { CONTROL('F'), SEL_EXTRACT }, /* Toggle sort by size */ { 'z', SEL_FSIZE }, /* Sort by apparent size including dir contents */ @@ -235,7 +229,8 @@ static struct key bindings[] = { /* Rename contents of current dir */ { 'r', SEL_RENAMEMUL }, /* Mount an archive */ - { 'T', SEL_ARCHIVEMNT }, + { 'o', SEL_ARCHIVEOPS }, + { CONTROL('F'), SEL_ARCHIVEOPS }, /* Connect to server over SSHFS */ { 'c', SEL_REMOTE }, /* Disconnect a SSHFS mount point */