Browse Source

Support run a command

master
Arun Prakash Jana 6 years ago
parent
commit
e7b1215a20
No known key found for this signature in database GPG Key ID: A75979F35C080412
4 changed files with 49 additions and 37 deletions
  1. +3
    -2
      README.md
  2. +4
    -2
      nnn.1
  3. +37
    -31
      src/nnn.c
  4. +5
    -2
      src/nnn.h

+ 3
- 2
README.md View File

@@ -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 <kbd>?</kbd> 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.


+ 4
- 2
nnn.1 View File

@@ -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


+ 37
- 31
src/nnn.c View File

@@ -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 (!tmp) {
printmsg("set NNN_SCRIPT");
goto nochange;
}

if (lstat(tmp, &sb) == -1) {
printwarn();
goto nochange;
}
if (getenv("NNN_MULTISCRIPT")) {
size_t _len = xstrlcpy(newpath, tmp, PATH_MAX);

/* Check if it's a directory */
if (S_ISDIR(sb.st_mode)) {
printmsg("directory");
goto nochange;
}
tmp = xreadline(NULL, "script suffix: ");
if (tmp && tmp[0])
xstrlcpy(newpath + _len - 1, tmp, PATH_MAX - _len);
tmp = newpath;
}

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");
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);



+ 5
- 2
src/nnn.h View File

@@ -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 */


Loading…
Cancel
Save