From d1ed0cff118a07327b3b237ea65836f5c673acbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20K=C3=BChl?= Date: Fri, 20 Nov 2015 16:42:33 +0100 Subject: [PATCH] Support commands specified by environment variables 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 | 7 ++++--- noice.c | 23 +++++++++++++++++++---- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/config.def.h b/config.def.h index 39c17994..beae17d3 100644 --- a/config.def.h +++ b/config.def.h @@ -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 63c7b6bd..8b278458 100644 --- 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();