noice

small file browser
git clone git://git.2f30.org/noice
Log | Files | Refs | README | LICENSE

commit d1ed0cff118a07327b3b237ea65836f5c673acbb
parent d1d086d91edd89e5a8edcc3349488b3ed89f8c9d
Author: Martin Kühl <martin.kuehl@gmail.com>
Date:   Fri, 20 Nov 2015 16:42:33 +0100

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.

Diffstat:
Mconfig.def.h | 7++++---
Mnoice.c | 23+++++++++++++++++++----
2 files changed, 23 insertions(+), 7 deletions(-)

diff --git 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 @@ -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" @@ -195,6 +196,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) { regex_t regex; @@ -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();