]> Sergey Matveev's repositories - nnn.git/commitdiff
Handle argument ordering in spawn()
authorArun Prakash Jana <engineerarun@gmail.com>
Thu, 6 Dec 2018 17:27:59 +0000 (22:57 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Thu, 6 Dec 2018 17:27:59 +0000 (22:57 +0530)
README.md
nnn.1
src/nnn.c

index 06db4db1f2a58022000fccea72f439d1b7ddd0af..645d4e8987fed752876a8888c75e3b408bc7ee5e 100644 (file)
--- a/README.md
+++ b/README.md
@@ -117,7 +117,7 @@ We need contributors. Please visit the ToDo list.
   - Run custom scripts in the current directory
   - Change directory at exit (*easy* shell integration)
   - Edit file in EDITOR or open in PAGER
-  - GUI app launcher (up to 2 space-separated args)
+  - GUI app launcher
   - Terminal locker integration
 - Unicode support
 - Highly optimized, static analysis integrated code
@@ -348,6 +348,8 @@ Arguments to the `$EDITOR`, `$PAGER` and `$SHELL` should be combined together, e
 
     export EDITOR='vim -xR'
 
+The option `open with` takes 1 combined argument and `launcher` takes 2.
+
 #### Help
 
     $ nnn -h
diff --git a/nnn.1 b/nnn.1
index ff916d4698babaf641642d5df5dc2abb08b955d5..17fe6ccc466369c527a3826e60b424fd7f256078 100644 (file)
--- a/nnn.1
+++ b/nnn.1
@@ -90,7 +90,7 @@ FILES
 .Pp
 .Bl -tag -width "l, [Right], [Return] or C-mXXXX" -offset indent -compact
 .It Ic ^O
-Open with an application
+Open with an application (takes 1 combined argument)
 .It Ic n
 Create a new file or directory
 .It Ic D
@@ -144,7 +144,7 @@ MISC
 .Pp
 .Bl -tag -width "l, [Right], [Return] or C-mXXXX" -offset indent -compact
 .It Ic o
-Launch a GUI application
+Launch a GUI application (takes 2 combined arguments)
 .It Ic \&!, ^]
 Spawn SHELL in current directory (fallback sh)
 .It Ic R
index 812f2aef58a92e9f04de46f86aec35372dc97a22..e5384bcafe7cfd09288b9828b3e9d47c39a93e42 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -812,10 +812,17 @@ static void initcurses(void)
  */
 static void spawn(const char *file, const char *arg1, const char *arg2, const char *dir, uchar flag)
 {
-       static char *shlvl;
+       static const char *shlvl;
        static pid_t pid;
        static int status;
 
+       /* Swap args if the first arg is NULL and second isn't */
+       if (!arg1 && arg2) {
+               shlvl = arg1;
+               arg1 = arg2;
+               arg2 = shlvl;
+       }
+
        if (flag & F_NORMAL)
                exitcurses();
 
@@ -2682,7 +2689,7 @@ nochange:
                                if (cfg.useeditor &&
                                    get_output(g_buf, CMD_LEN_MAX, "file", FILE_OPTS, newpath, FALSE) &&
                                    strstr(g_buf, "text/") == g_buf) {
-                                       spawn(editor, newpath, editor_arg, path, F_NORMAL);
+                                       spawn(editor, editor_arg, newpath, path, F_NORMAL);
                                        continue;
                                }
 
@@ -3192,6 +3199,9 @@ nochange:
                                break; // fallthrough
                case SEL_LAUNCH: // fallthrough
                case SEL_NEW:
+               {
+                       char *ptr = NULL, *ptr1 = NULL, *ptr2 = NULL;
+
                        if (sel == SEL_OPEN)
                                tmp = xreadline(NULL, "open with: ");
                        else if (sel == SEL_LAUNCH)
@@ -3218,17 +3228,18 @@ nochange:
                                else
                                        r = F_NOWAIT | F_NOTRACE;
 
+                               getprogarg(tmp, &ptr);
                                mkpath(path, dents[cur].name, newpath, PATH_MAX);
-                               spawn(tmp, newpath, NULL, path, r);
+                               spawn(tmp, ptr, newpath, path, r);
                                continue;
                        }
 
                        if (sel == SEL_LAUNCH) {
                                uint args = 0;
-                               char *ptr = tmp, *ptr1 = NULL, *ptr2 = NULL;
+                               ptr = tmp;
 
                                while (*ptr) {
-                                       if (*ptr == ' ') {
+                                       if (isblank(*ptr)) {
                                                *ptr = '\0';
                                                if (args == 0)
                                                        ptr1 = ptr + 1;
@@ -3301,6 +3312,7 @@ nochange:
                        close(fd);
                        xstrlcpy(lastname, tmp, NAME_MAX + 1);
                        goto begin;
+               }
                case SEL_RENAME:
                        if (!ndents)
                                break;
@@ -3402,10 +3414,10 @@ nochange:
                        /* Repopulate as directory content may have changed */
                        goto begin;
                case SEL_RUNEDIT:
-                       spawn(editor, dents[cur].name, editor_arg, path, F_NORMAL);
+                       spawn(editor, editor_arg, dents[cur].name, path, F_NORMAL);
                        break;
                case SEL_RUNPAGE:
-                       spawn(pager, dents[cur].name, pager_arg, path, F_NORMAL);
+                       spawn(pager, pager_arg, dents[cur].name, path, F_NORMAL);
                        break;
                case SEL_LOCK:
                        spawn(utils[LOCKER], NULL, NULL, NULL, F_NORMAL | F_SIGINT);