mirror of
https://github.com/jarun/nnn.git
synced 2024-11-17 16:39:14 +00:00
Merge pull request #1202 from KlzXS/cmd_selection
Added %s and %S for using selection in shell
This commit is contained in:
commit
b411dfe1ba
62
src/nnn.c
62
src/nnn.c
|
@ -5349,24 +5349,68 @@ static bool launch_app(char *newpath)
|
||||||
static bool prompt_run(void)
|
static bool prompt_run(void)
|
||||||
{
|
{
|
||||||
bool ret = FALSE;
|
bool ret = FALSE;
|
||||||
char *tmp;
|
char *cmdline, *next;
|
||||||
|
int cnt_j, cnt_J;
|
||||||
|
size_t len, tmplen;
|
||||||
|
|
||||||
|
const char *xargs_j = "xargs -0 -t -I{} sh -c '%s' < %s";
|
||||||
|
const char *xargs_J = "xargs -0 -t sh -c '%s' < %s";
|
||||||
|
char tmpcmd[CMD_LEN_MAX];
|
||||||
|
char cmd[CMD_LEN_MAX + 32]; // 32 for xargs format strings
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
#ifndef NORL
|
#ifndef NORL
|
||||||
if (g_state.picker) {
|
if (g_state.picker) {
|
||||||
#endif
|
#endif
|
||||||
tmp = xreadline(NULL, PROMPT);
|
cmdline = xreadline(NULL, PROMPT);
|
||||||
#ifndef NORL
|
#ifndef NORL
|
||||||
} else
|
} else
|
||||||
tmp = getreadline("\n"PROMPT);
|
cmdline = getreadline("\n"PROMPT);
|
||||||
#endif
|
#endif
|
||||||
if (tmp && *tmp) { // NOLINT
|
// Check for an empty command
|
||||||
free(lastcmd);
|
if (!cmdline || !cmdline[0])
|
||||||
lastcmd = xstrdup(tmp);
|
|
||||||
ret = TRUE;
|
|
||||||
spawn(shell, "-c", tmp, NULL, F_CLI | F_CONFIRM);
|
|
||||||
} else
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
free(lastcmd);
|
||||||
|
lastcmd = xstrdup(cmdline);
|
||||||
|
ret = TRUE;
|
||||||
|
|
||||||
|
len = xstrlen(cmdline);
|
||||||
|
|
||||||
|
cnt_j = 0;
|
||||||
|
next = cmdline;
|
||||||
|
while ((next = strstr(next, "%j"))) {
|
||||||
|
++cnt_j;
|
||||||
|
|
||||||
|
// replace %j with {} for xargs later
|
||||||
|
next[0] = '{';
|
||||||
|
next[1] = '}';
|
||||||
|
|
||||||
|
++next;
|
||||||
|
}
|
||||||
|
|
||||||
|
cnt_J = 0;
|
||||||
|
next = cmdline;
|
||||||
|
while ((next = strstr(next, "%J"))) {
|
||||||
|
++cnt_J;
|
||||||
|
|
||||||
|
tmplen = xstrsncpy(tmpcmd, cmdline, next - cmdline + 1) - 1;
|
||||||
|
tmplen += xstrsncpy(tmpcmd + tmplen, "${0} ${@}", sizeof("${0} ${@}")) - 1;
|
||||||
|
xstrsncpy(tmpcmd + tmplen, next + 2, len - (next - cmdline + 2) + 1);
|
||||||
|
|
||||||
|
++next;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We can't handle both %j and %J in a single command
|
||||||
|
if (cnt_j && cnt_J)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (cnt_j)
|
||||||
|
snprintf(cmd, CMD_LEN_MAX + 32, xargs_j, cmdline, selpath);
|
||||||
|
else if (cnt_J)
|
||||||
|
snprintf(cmd, CMD_LEN_MAX + 32, xargs_J, tmpcmd, selpath);
|
||||||
|
|
||||||
|
spawn(shell, "-c", (cnt_j || cnt_J) ? cmd : cmdline, NULL, F_CLI | F_CONFIRM);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in a new issue