From 3dc40acbffd2c57f92401eab8ce32114bea8788f Mon Sep 17 00:00:00 2001
From: lostd <lostd@2f30.org>
Date: Thu, 12 Mar 2015 16:12:01 +0200
Subject: [PATCH] Key bindings to run user-defined commands

---
 config.def.h |  7 +++++--
 noice.1      |  8 ++++++--
 noice.c      | 33 ++++++++++++++++++++++-----------
 3 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/config.def.h b/config.def.h
index 45e9d5b..9b730ba 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 2d940ad..076b188 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 600e570..1d34017 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;
 		}
 	}