]> Sergey Matveev's repositories - nnn.git/commitdiff
Support commands specified by environment variables
authorMartin Kühl <martin.kuehl@gmail.com>
Fri, 20 Nov 2015 15:42:33 +0000 (16:42 +0100)
committersin <sin@2f30.org>
Thu, 26 Nov 2015 13:37:03 +0000 (13:37 +0000)
Specifying commands by name in config.h means that
every time one switches ones editor (for example),
one has to modify every config.h file referencing that editor
and then recompile every corresponding program.

This change adds a string `env` for specifying an environment
variable to `struct key` and uses it to optionally specify the
command to run on SEL_{RUN,RUNARG}.
The `run` string is used as a fallback when the environment variable
has not been specified or is not set.
It also updates `config.def.h` to demonstrate this new capability.

config.def.h
noice.c

index 39c1799492a1e58e2b10500722ec86bfeaed541e..beae17d3c2886ab3ba726d936e79255cbf81cb40 100644 (file)
@@ -62,8 +62,9 @@ struct key bindings[] = {
        { 't',            SEL_MTIME },
        { CONTROL('L'),   SEL_REDRAW },
        /* Run command */
-       { '!',            SEL_RUN,    "sh" },
-       { 'z',            SEL_RUN,    "top" },
+       { 'z',            SEL_RUN, "top" },
+       { '!',            SEL_RUN, "sh", "SHELL" },
        /* Run command with argument */
-       { 'e',            SEL_RUNARG, "vi" },
+       { 'e',            SEL_RUNARG, "vi", "EDITOR" },
+       { 'p',            SEL_RUNARG, "less", "PAGER" },
 };
diff --git a/noice.c b/noice.c
index 63c7b6bd8009f17cc4ed829376eda969564e6f36..8b278458fc92e19e367e6ccc6f8cffc60c25cab4 100644 (file)
--- a/noice.c
+++ b/noice.c
@@ -68,6 +68,7 @@ struct key {
        int sym;         /* Key pressed */
        enum action act; /* Action */
        char *run;       /* Program to run */
+       char *env;       /* Environment variable to run */
 };
 
 #include "config.h"
@@ -194,6 +195,17 @@ spawn(const char *file, const char *arg, const char *dir)
        }
 }
 
+char *
+xgetenv(char *name, char *fallback)
+{
+       if (name == NULL)
+               return fallback;
+       char *value = getenv(name);
+       if (value)
+               return value;
+       return fallback;
+}
+
 char *
 openwith(char *file)
 {
@@ -310,9 +322,9 @@ printprompt(char *str)
 }
 
 /* Returns SEL_* if key is bound and 0 otherwise
-   Also modifies the run pointer (used on SEL_{RUN,RUNARG}) */
+   Also modifies the run and env pointers (used on SEL_{RUN,RUNARG}) */
 int
-nextsel(char **run)
+nextsel(char **run, char **env)
 {
        int c, i;
 
@@ -325,6 +337,7 @@ nextsel(char **run)
        for (i = 0; i < LEN(bindings); i++)
                if (c == bindings[i].sym) {
                        *run = bindings[i].run;
+                       *env = bindings[i].env;
                        return bindings[i].act;
                }
 
@@ -630,7 +643,7 @@ browse(const char *ipath, const char *ifilter)
        regex_t re;
        char *newpath;
        struct stat sb;
-       char *name, *bin, *dir, *tmp, *run;
+       char *name, *bin, *dir, *tmp, *run, *env;
        int nowtyping = 0;
 
        oldpath = NULL;
@@ -653,7 +666,7 @@ begin:
                if (nowtyping)
                        goto moretyping;
 nochange:
-               switch (nextsel(&run)) {
+               switch (nextsel(&run, &env)) {
                case SEL_QUIT:
                        free(path);
                        free(fltr);
@@ -842,12 +855,14 @@ moretyping:
                                oldpath = makepath(path, dents[cur].name);
                        goto begin;
                case SEL_RUN:
+                       run = xgetenv(env, run);
                        exitcurses();
                        spawn(run, NULL, path);
                        initcurses();
                        break;
                case SEL_RUNARG:
                        name = dents[cur].name;
+                       run = xgetenv(env, run);
                        exitcurses();
                        spawn(run, name, path);
                        initcurses();