diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nnn.c | 66 | ||||
| -rw-r--r-- | src/nnn.h | 7 |
2 files changed, 41 insertions, 32 deletions
@@ -1288,7 +1288,7 @@ end: } /* Show a prompt with input string and return the changes */ -static char *xreadline(char *fname, char *prompt) +static char *xreadline(char *prefill, char *prompt) { size_t len, pos; int x, y, r; @@ -1298,9 +1298,9 @@ static char *xreadline(char *fname, char *prompt) cleartimeout(); printprompt(prompt); - if (fname) { - DPRINTF_S(fname); - len = pos = mbstowcs(buf, fname, NAME_MAX); + if (prefill) { + DPRINTF_S(prefill); + len = pos = mbstowcs(buf, prefill, NAME_MAX); } else len = (size_t)-1; @@ -2060,8 +2060,8 @@ static bool show_help(char *path) "et Modification time s Size\n" "1MISC\n" "a!, ^] Spawn SHELL in dir o Launch app\n" - "eR Run custom script ^S Execute entry\n" - "eL Lock terminal\n"}; + "d^S Run a command R Run custom script\n" + "eC Execute entry L Lock terminal\n"}; if (fd == -1) return FALSE; @@ -3368,7 +3368,8 @@ nochange: if (!ndents) goto nochange; // fallthrough case SEL_SHELL: // fallthrough - case SEL_SCRIPT: + case SEL_SCRIPT: // fallthrough + case SEL_RUNCMD: if (sel == SEL_EXEC) { /* Check if this is a directory */ if (S_ISDIR(dents[cur].mode)) { @@ -3386,35 +3387,40 @@ nochange: spawn(newpath, NULL, NULL, path, F_NORMAL | F_SIGINT); } else if (sel == SEL_SCRIPT) { tmp = getenv("NNN_SCRIPT"); - if (tmp) { - if (getenv("NNN_MULTISCRIPT")) { - size_t _len = xstrlcpy(newpath, tmp, PATH_MAX); + if (!tmp) { + printmsg("set NNN_SCRIPT"); + goto nochange; + } - tmp = xreadline(NULL, "script suffix: "); - if (tmp && tmp[0]) - xstrlcpy(newpath + _len - 1, tmp, PATH_MAX - _len); - tmp = newpath; - } + if (getenv("NNN_MULTISCRIPT")) { + size_t _len = xstrlcpy(newpath, tmp, PATH_MAX); - if (lstat(tmp, &sb) == -1) { - printwarn(); - goto nochange; - } + tmp = xreadline(NULL, "script suffix: "); + if (tmp && tmp[0]) + xstrlcpy(newpath + _len - 1, tmp, PATH_MAX - _len); + tmp = newpath; + } - /* Check if it's a directory */ - if (S_ISDIR(sb.st_mode)) { - printmsg("directory"); - goto nochange; - } + if (lstat(tmp, &sb) == -1) { + printwarn(); + goto nochange; + } - dir = NULL; /* dir used as temp var */ - if (ndents) - dir = dents[cur].name; - spawn(shell, tmp, dir, path, F_NORMAL | F_SIGINT); - } else { - printmsg("set NNN_SCRIPT"); + /* Check if it's a directory */ + if (S_ISDIR(sb.st_mode)) { + printmsg("directory"); goto nochange; } + + dir = NULL; /* dir used as temp var */ + if (ndents) + dir = dents[cur].name; + spawn(shell, tmp, dir, path, F_NORMAL | F_SIGINT); + } else if (sel == SEL_RUNCMD) { + tmp = xreadline(NULL, "> "); + if (!tmp || !tmp[0]) + goto nochange; + spawn(shell, "-c", tmp, path, F_NORMAL | F_SIGINT); } else spawn(shell, shell_arg, NULL, path, F_NORMAL | F_MARKER); @@ -83,6 +83,7 @@ enum action { SEL_EXEC, SEL_SHELL, SEL_SCRIPT, + SEL_RUNCMD, SEL_RUNEDIT, SEL_RUNPAGE, SEL_LOCK, @@ -211,13 +212,15 @@ static struct key bindings[] = { /* Show help */ { '?', SEL_HELP }, /* Execute file */ - { CONTROL('S'), SEL_EXEC }, + { 'C', SEL_EXEC }, /* Run command */ { '!', SEL_SHELL }, { CONTROL(']'), SEL_SHELL }, /* Run a custom script */ { 'R', SEL_SCRIPT }, - /* Run command with argument */ + /* Run a command */ + { CONTROL('S'), SEL_RUNCMD }, + /* Open in EDITOR or PAGER */ { 'e', SEL_RUNEDIT }, { 'p', SEL_RUNPAGE }, /* Lock screen */ |