From 4407f29dd388ef38538642da28d325ca8076df00 Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Sun, 11 Nov 2018 04:59:26 +0530 Subject: [PATCH] Support file cp, mv, rm through selection --- README.md | 2 +- src/nnn.c | 40 +++++++++++++++++++++++++++++++++++++++- src/nnn.h | 16 ++++++++++++++-- 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 05353235..b665f900 100644 --- a/README.md +++ b/README.md @@ -254,7 +254,7 @@ optional args: ? Help, settings q Quit context ^G Quit and cd - Q, ^X Quit + Q, ^Q Quit ``` Help & settings, file details, media info and archive listing are shown in the PAGER. Please use the PAGER-specific keys in these screens. diff --git a/src/nnn.c b/src/nnn.c index 75044b68..8feb6104 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -782,6 +782,7 @@ static void spawn(const char *file, const char *arg1, const char *arg2, const ch if (flag & F_SIGINT) signal(SIGINT, SIG_DFL); + execlp(file, file, arg1, arg2, NULL); _exit(1); } else { @@ -2007,7 +2008,7 @@ static int show_help(char *path) "e? Help, settings\n" "eq Quit context\n" "d^G Quit and cd\n" - "aQ, ^X Quit\n\n"}; + "aQ, ^Q Quit\n\n"}; if (fd == -1) return -1; @@ -2984,6 +2985,7 @@ nochange: r = mkpath(path, dents[cur].name, newpath, PATH_MAX); if (!appendfpath(newpath, r)) goto nochange; + ++ncp; printmsg(newpath); } else if (cfg.quote) { @@ -3013,6 +3015,7 @@ nochange: writecp(newpath, r - 1); /* Truncate NULL from end */ else spawn(copier, newpath, NULL, NULL, F_NOTRACE); + printmsg(newpath); } goto nochange; @@ -3067,6 +3070,41 @@ nochange: else printmsg("multi-copy off"); goto nochange; + case SEL_CP: + case SEL_MV: + case SEL_RMMUL: + { + char *cmd; + + if (!g_cppath[0]) { + printmsg("copy file not found"); + goto nochange; + } + + if (sel == SEL_CP) + r = asprintf(&cmd, "xargs -0 -d \'\n\' -a %s cp -ir --preserve=all -t .", g_cppath); + else if (sel == SEL_MV) + r = asprintf(&cmd, "xargs -0 -d \'\n\' -a %s mv -i -t .", g_cppath); + else /* SEL_RMMUL */ + r = asprintf(&cmd, "xargs -0 -d \'\n\' -a %s rm -Ir", g_cppath); + + if (r == -1) { + printwarn(); + goto nochange; + } + spawn("sh", "-c", cmd, path, F_NORMAL | F_SIGINT); + free(cmd); + + copycurname(); + if (cfg.filtermode) + presel = FILTER; + goto begin; + } + case SEL_RM: + lastname[0] = '\0'; + if (cfg.filtermode) + presel = FILTER; + goto begin; case SEL_QUOTE: cfg.quote ^= 1; DPRINTF_D(cfg.quote); diff --git a/src/nnn.h b/src/nnn.h index 1fa7af60..cfbd15e6 100644 --- a/src/nnn.h +++ b/src/nnn.h @@ -69,6 +69,10 @@ enum action { SEL_COPY, SEL_COPYMUL, SEL_COPYLIST, + SEL_CP, + SEL_MV, + SEL_RMMUL, + SEL_RM, SEL_QUOTE, SEL_OPEN, SEL_NEW, @@ -192,6 +196,14 @@ static struct key bindings[] = { { CONTROL('Y'), SEL_COPYMUL, "", "" }, /* Show list of copied files */ { 'y', SEL_COPYLIST, "", "" }, + /* Copy from copy buffer */ + { 'P', SEL_CP, "", "" }, + /* Move from copy buffer */ + { 'V', SEL_MV, "", "" }, + /* Delete from copy buffer */ + { CONTROL('X'), SEL_RMMUL, "", "" }, + /* Delete currently selected */ + { 'X', SEL_RM, "", "" }, /* Toggle quote on while copy */ { CONTROL('T'), SEL_QUOTE, "", "" }, /* Open in a custom application */ @@ -220,6 +232,6 @@ static struct key bindings[] = { /* Change dir on quit */ { CONTROL('G'), SEL_CDQUIT, "", "" }, /* Quit */ - { 'Q', SEL_QUIT, "", "" }, - { CONTROL('X'), SEL_QUIT, "", "" }, + { 'Q', SEL_QUIT, "", "" }, + { CONTROL('Q'), SEL_QUIT, "", "" }, };