diff --git a/src/nnn.c b/src/nnn.c index 5778bb54..07863d53 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -295,6 +295,7 @@ static char *copier; static char *editor, *editor_arg; static char *pager, *pager_arg; static char *shell, *shell_arg; +static char *runpath; static blkcnt_t ent_blocks; static blkcnt_t dir_blocks; static ulong num_files; @@ -2105,8 +2106,8 @@ static bool show_help(char *path) dprintf(fd, "NNN_COPIER: %s\n", copier); else if (g_cppath[0]) dprintf(fd, "copy file: %s\n", g_cppath); - if (getenv("NNN_SCRIPT")) - dprintf(fd, "NNN_SCRIPT: %s\n", getenv("NNN_SCRIPT")); + if (runpath) + dprintf(fd, "NNN_SCRIPT: %s\n", runpath); if (getenv("NNN_SHOW_HIDDEN")) dprintf(fd, "NNN_SHOW_HIDDEN: 1\n"); if (getenv("NNN_NO_AUTOSELECT")) @@ -2695,7 +2696,8 @@ nochange: if (cfg.runctx != cfg.curctx) continue; - if (!getenv("NNN_SCRIPT") || strcmp(path, getenv("NNN_SCRIPT")) != 0) + /* Must be in script directory to select script */ + if (strcmp(path, runpath) != 0) continue; mkpath(path, dents[cur].name, newpath, PATH_MAX); @@ -3393,50 +3395,49 @@ nochange: xstrlcpy(lastname, tmp, NAME_MAX + 1); goto begin; } - case SEL_EXEC: - if (!ndents) - goto nochange; // fallthrough + case SEL_EXEC: // fallthrough case SEL_SHELL: // fallthrough case SEL_SCRIPT: // fallthrough case SEL_RUNCMD: - if (sel == SEL_EXEC) { + switch (sel) { + case SEL_EXEC: + if (!ndents) + goto nochange; + /* Check if this is a directory */ - if (S_ISDIR(dents[cur].mode)) { - printmsg("directory"); + if (!S_ISREG(dents[cur].mode)) { + printmsg("not a regular file"); goto nochange; } /* Check if file is executable */ if (!(dents[cur].mode & 0100)) { - printmsg("Permission denied"); + printmsg("permission denied"); goto nochange; } mkpath(path, dents[cur].name, newpath, PATH_MAX); spawn(newpath, NULL, NULL, path, F_NORMAL | F_SIGINT); - } else if (sel == SEL_SCRIPT) { - dir = getenv("NNN_SCRIPT"); - if (!dir) { + break; + case SEL_SHELL: + spawn(shell, shell_arg, NULL, path, F_NORMAL | F_MARKER); + break; + case SEL_SCRIPT: + if (!runpath) { printmsg("set NNN_SCRIPT"); goto nochange; } - if (stat(dir, &sb) == -1) { + if (stat(runpath, &sb) == -1) { printwarn(); goto nochange; } - if (!S_ISDIR(sb.st_mode)) { - if (ndents) - tmp = dents[cur].name; - else - tmp = NULL; - spawn(shell, dir, tmp, path, F_NORMAL | F_SIGINT); - } else { + if (S_ISDIR(sb.st_mode)) { cfg.runscript ^= 1; if (!cfg.runscript && rundir[0]) { - /* If reset, switch to original dir */ - if (strcmp(path, getenv("NNN_SCRIPT")) == 0) { + /* If toggled, switch to original directory */ + if (strcmp(path, runpath) == 0) { xstrlcpy(path, rundir, PATH_MAX); xstrlcpy(lastname, runfile, NAME_MAX); rundir[0] = '\0'; @@ -3448,11 +3449,11 @@ nochange: } /* Check if directory is accessible */ - if (!xdiraccess(dir)) + if (!xdiraccess(runpath)) goto nochange; xstrlcpy(rundir, path, PATH_MAX); - xstrlcpy(path, dir, PATH_MAX); + xstrlcpy(path, runpath, PATH_MAX); if (ndents) xstrlcpy(runfile, dents[cur].name, NAME_MAX); cfg.runctx = cfg.curctx; @@ -3460,12 +3461,23 @@ nochange: setdirwatch(); goto begin; } - } else if (sel == SEL_RUNCMD) { + + if (S_ISREG(sb.st_mode)) { + if (ndents) + tmp = dents[cur].name; + else + tmp = NULL; + spawn(shell, runpath, tmp, path, F_NORMAL | F_SIGINT); + } else { + printmsg("unsupported file"); + goto nochange; + } + break; + default: /* SEL_RUNCMD */ tmp = xreadline(NULL, "> "); if (tmp && tmp[0]) spawn(shell, "-c", tmp, path, F_NORMAL | F_SIGINT); - } else - spawn(shell, shell_arg, NULL, path, F_NORMAL | F_MARKER); + } /* Continue in navigate-as-you-type mode, if enabled */ if (cfg.filtermode) @@ -3705,6 +3717,9 @@ int main(int argc, char *argv[]) shell = xgetenv("SHELL", "sh"); getprogarg(shell, &shell_arg); + /* Setup script execution */ + runpath = getenv("NNN_SCRIPT"); + #ifdef LINUX_INOTIFY /* Initialize inotify */ inotify_fd = inotify_init1(IN_NONBLOCK);