]> Sergey Matveev's repositories - nnn.git/commitdiff
Support file cp, mv, rm through selection
authorArun Prakash Jana <engineerarun@gmail.com>
Sat, 10 Nov 2018 23:29:26 +0000 (04:59 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sat, 10 Nov 2018 23:30:37 +0000 (05:00 +0530)
README.md
src/nnn.c
src/nnn.h

index 05353235bcdfbc15abd785eeb7ab203e3690f355..b665f9006a7cfb3bb6a318449c297ba31102886f 100644 (file)
--- 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.
index 75044b68b5f66d5b45847c69f1fbf1d6ae5c5bd9..8feb6104a4055b0594edb91842e8004ddfd3ba26 100644 (file)
--- 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);
index 1fa7af608df40feb73680e70b70a27bafd5d5eab..cfbd15e6f79e75ad4428beefe6ae4fe31f4db468 100644 (file)
--- 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,      "",     "" },
 };