diff --git a/README.md b/README.md index 06db4db1..645d4e89 100644 --- 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 ff916d46..17fe6ccc 100644 --- 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 diff --git a/src/nnn.c b/src/nnn.c index 812f2aef..e5384bca 100644 --- 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);