diff --git a/config.def.h b/config.def.h index 45e9d5b0..9b730ba4 100644 --- a/config.def.h +++ b/config.def.h @@ -45,11 +45,14 @@ struct key bindings[] = { /* Page up */ { KEY_PPAGE, SEL_PGUP }, { CONTROL('U'), SEL_PGUP }, - /* Shell */ - { '!', SEL_SH }, /* Change dir */ { 'c', SEL_CD }, /* Toggle sort by time */ { 't', SEL_MTIME }, { CONTROL('L'), SEL_REDRAW }, + /* Run command */ + { '!', SEL_RUN, "sh" }, + { 'z', SEL_RUN, "top" }, + /* Run command with argument */ + { 'e', SEL_RUNARG, "vi" }, }; diff --git a/noice.1 b/noice.1 index 2d940ad7..076b1888 100644 --- a/noice.1 +++ b/noice.1 @@ -1,4 +1,4 @@ -.Dd January 27, 2015 +.Dd March 12, 2015 .Dt NOICE 1 .Os .Sh NAME @@ -52,7 +52,11 @@ Toggle sort by time modified. .It Ic l Force a redraw. .It Ic ! -Spawn shell in current directory. +Spawn an sh shell in current directory. +.It Ic z +Run the system top utility. +.It Ic e +Open selected entry with the vi editor. .It Ic q Quit. .El diff --git a/noice.c b/noice.c index 600e5702..1d34017c 100644 --- a/noice.c +++ b/noice.c @@ -54,15 +54,17 @@ enum action { SEL_PREV, SEL_PGDN, SEL_PGUP, - SEL_SH, SEL_CD, SEL_MTIME, SEL_REDRAW, + SEL_RUN, + SEL_RUNARG, }; struct key { int sym; /* Key pressed */ enum action act; /* Action */ + char *run; /* Program to run */ }; #include "config.h" @@ -296,17 +298,20 @@ printprompt(char *str) printw(str); } -/* Returns SEL_* if key is bound and 0 otherwise */ +/* Returns SEL_* if key is bound and 0 otherwise + Also modifies the run pointer (used on SEL_{RUN,RUNARG}) */ int -nextsel(void) +nextsel(char **run) { int c, i; c = getch(); for (i = 0; i < LEN(bindings); i++) - if (c == bindings[i].sym) + if (c == bindings[i].sym) { + *run = bindings[i].run; return bindings[i].act; + } return 0; } @@ -571,7 +576,7 @@ browse(const char *ipath, const char *ifilter) regex_t filter_re, re; char *cwd, *newpath, *oldpath = NULL; struct stat sb; - char *name, *bin, *dir, *tmp; + char *name, *bin, *dir, *tmp, *run; int nowtyping = 0; begin: @@ -640,7 +645,7 @@ begin: goto moretyping; nochange: - switch (nextsel()) { + switch (nextsel(&run)) { case SEL_QUIT: free(path); free(filter); @@ -789,11 +794,6 @@ moretyping: if (cur > 0) cur -= MIN((LINES - 4) / 2, cur); break; - case SEL_SH: - exitcurses(); - spawn("/bin/sh", NULL, path); - initcurses(); - break; case SEL_CD: /* Read target dir */ printprompt("chdir: "); @@ -820,6 +820,17 @@ moretyping: goto out; case SEL_REDRAW: goto out; + case SEL_RUN: + exitcurses(); + spawn(run, NULL, path); + initcurses(); + break; + case SEL_RUNARG: + name = dents[cur].name; + exitcurses(); + spawn(run, name, path); + initcurses(); + break; } }