]> Sergey Matveev's repositories - nnn.git/commitdiff
Support duplicate file/dir
authorArun Prakash Jana <engineerarun@gmail.com>
Sun, 4 Aug 2019 02:02:37 +0000 (07:32 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sun, 4 Aug 2019 02:59:32 +0000 (08:29 +0530)
README.md
src/nnn.c

index 12313a34c88d7376e3bbd681bbe96443aceedd96..df705cfe80fffee912778625610a16c943fabc5b 100644 (file)
--- a/README.md
+++ b/README.md
@@ -122,7 +122,7 @@ Here's a video of [`nnn` on Termux (Android)](https://www.youtube.com/watch?v=Ab
   - FreeDesktop compliant trash (needs trash-cli)
   - SSHFS mounts (needs sshfs)
   - Mouse support
-  - Create, rename files and directories
+  - Create, rename, duplicate files and directories
   - Show copy, move progress on Linux (needs avdcpmv)
   - Per-context directory color (default: blue)
   - Spawn a shell in the current directory
@@ -285,7 +285,7 @@ Press <kbd>?</kbd> in `nnn` to see the list anytime.
          Q ^Q  Quit              ?  Help, config
  FILES
            ^O  Open with...      n  Create new/link
-            D  File details     ^R  Rename entry
+            D  File details     ^R  Rename/duplicate
      ⎵ ^K / Y  Select entry/all  r  Batch rename
          K ^Y  Toggle selection  y  List selection
             P  Copy selection    X  Delete selection
index 874b2052a8d6c89934676fb77ca8f372eaf45a41..fb8cf10f89229bbe3a5640e0a77d099421d70042 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -2814,7 +2814,7 @@ static bool show_help(const char *path)
               "9Q ^Q  Quit              ?  Help, config\n"
                "1FILES\n"
                 "b^O  Open with...      n  Create new/link\n"
-                 "cD  File details     ^R  Rename entry\n"
+                 "cD  File details     ^R  Rename/duplicate\n"
           "5⎵ ^K / Y  Select entry/all  r  Batch rename\n"
               "9K ^Y  Toggle selection  y  List selection\n"
                  "cP  Copy selection    X  Delete selection\n"
@@ -4160,6 +4160,8 @@ nochange:
                case SEL_ARCHIVE: // fallthrough
                case SEL_NEW:
                {
+                       int dup = 'n';
+
                        switch (sel) {
                        case SEL_ARCHIVE:
                                r = get_input("archive selection (else current)? [y/Y confirms]");
@@ -4190,6 +4192,7 @@ nochange:
                                tmp = xreadline(NULL, "name/link suffix [@ for none]: ");
                                break;
                        default: /* SEL_RENAME */
+                               dup = get_input("duplicate? [y/Y confirms]");
                                tmp = xreadline(dents[cur].name, "");
                                break;
                        }
@@ -4274,7 +4277,9 @@ nochange:
 
                        if (sel == SEL_RENAME) {
                                /* Rename the file */
-                               if (renameat(fd, dents[cur].name, fd, tmp) != 0) {
+                               if (dup == 'y' || dup == 'Y') {
+                                       spawn("cp -r", dents[cur].name, tmp, path, F_CLI | F_NOTRACE);
+                               } else if (renameat(fd, dents[cur].name, fd, tmp) != 0) {
                                        close(fd);
                                        printwarn(&presel);
                                        goto nochange;