From e7b1215a202da77b2c648cbe7c085ceee6d5ee8b Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Sun, 9 Dec 2018 19:18:00 +0530 Subject: [PATCH] Support run a command --- README.md | 5 ++-- nnn.1 | 6 +++-- src/nnn.c | 72 ++++++++++++++++++++++++++++++------------------------- src/nnn.h | 7 ++++-- 4 files changed, 51 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index b4d77527..11206497 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,7 @@ We need contributors. Please visit the ToDo list. - Batch rename/move/delete (needs vidir) - Show directories in custom color (default: blue) - Spawn a subshell in the current directory + - Run a command - Run custom scripts in the current directory - Run current file as executable - Change directory at exit (*easy* shell integration) @@ -248,8 +249,8 @@ Press ? in `nnn` to see the list anytime. t Modification time s Size MISC !, ^] Spawn SHELL in dir o Launch app - R Run custom script ^S Execute entry - L Lock terminal + ^S Run a command R Run custom script + C Execute entry L Lock terminal ``` Help & settings, file details, media info and archive listing are shown in the PAGER. Please use the PAGER-specific keys in these screens. diff --git a/nnn.1 b/nnn.1 index 62b1067a..b411f67c 100644 --- a/nnn.1 +++ b/nnn.1 @@ -147,12 +147,14 @@ MISC Spawn SHELL in current directory (fallback sh) .It Ic o Launch an application (takes 2 combined arguments) +.It Ic ^S +Run a command .It Ic R Run a custom script -.It Ic ^S +.It Ic C Execute entry .It Ic L -Lock terminal (Linux only) +Lock terminal .El .Pp Backing up one directory level will set the cursor position at the diff --git a/src/nnn.c b/src/nnn.c index 88fc0c66..f79a1bd4 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -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); - - tmp = xreadline(NULL, "script suffix: "); - if (tmp && tmp[0]) - xstrlcpy(newpath + _len - 1, tmp, PATH_MAX - _len); - tmp = newpath; - } - - if (lstat(tmp, &sb) == -1) { - printwarn(); - goto nochange; - } - - /* 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 (!tmp) { printmsg("set NNN_SCRIPT"); goto nochange; } + + if (getenv("NNN_MULTISCRIPT")) { + size_t _len = xstrlcpy(newpath, tmp, PATH_MAX); + + tmp = xreadline(NULL, "script suffix: "); + if (tmp && tmp[0]) + xstrlcpy(newpath + _len - 1, tmp, PATH_MAX - _len); + tmp = newpath; + } + + if (lstat(tmp, &sb) == -1) { + printwarn(); + goto nochange; + } + + /* 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); diff --git a/src/nnn.h b/src/nnn.h index 9e7d5f7d..74cc815c 100644 --- a/src/nnn.h +++ b/src/nnn.h @@ -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 */