]> Sergey Matveev's repositories - nnn.git/commitdiff
Key bindings to run user-defined commands
authorlostd <lostd@2f30.org>
Thu, 12 Mar 2015 14:12:01 +0000 (16:12 +0200)
committerlostd <lostd@2f30.org>
Thu, 12 Mar 2015 14:12:01 +0000 (16:12 +0200)
config.def.h
noice.1
noice.c

index 45e9d5b06b6ade2b3e18b249e545408e2b89d546..9b730ba4b8a402d8c4672723f8ad9f5518eb4291 100644 (file)
@@ -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 2d940ad778b4b6f06f3dd29827cb89baa947e587..076b188834fae2a902da1f3f1f38a369dfd8a7c9 100644 (file)
--- 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 600e57020763ecc2c0784eb7b9ac3ec37beb7be8..1d34017ca879c259f140903ce226f4bc32faa8c3 100644 (file)
--- 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;
                }
        }