]> Sergey Matveev's repositories - nnn.git/commitdiff
GUI app launcher with drop-down menu
authorArun Prakash Jana <engineerarun@gmail.com>
Tue, 12 Mar 2019 10:49:34 +0000 (16:19 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Tue, 12 Mar 2019 10:53:00 +0000 (16:23 +0530)
`nlauncher` is POSIX compliant. It needs `fzy`.

README.md
nnn.1
src/nnn.c
src/nnn.h
user-scripts/nlaunch [new file with mode: 0755]

index 31ff8961c7835b04d987d1398ff207f89dff8c27..3cc7dadffc7313c20cd74fc403a6f1e1ccf16cd0 100644 (file)
--- a/README.md
+++ b/README.md
@@ -254,7 +254,7 @@ Press <kbd>?</kbd> in `nnn` to see the list anytime.
  MISC
          ! ^]  Spawn SHELL       C  Execute entry
          R ^V  Run/pick script   L  Lock terminal
-           ^P  Prompt           ^N  Note
+           ^P  Prompt  ^N  Note  =  Launcher
 ```
 
 Help & settings, file details, media info and archive listing are shown in the PAGER. Use the PAGER-specific keys in these screens.
@@ -393,7 +393,6 @@ To lookup keyboard shortcuts at runtime, press <kbd>?</kbd>.
        export NNN_USE_EDITOR=1
 4. Run `n`.
 5. Don't memorize keys. Arrows, <kbd>/</kbd> and <kbd>q</kbd> suffice. Press <kbd>?</kbd> for help on keyboard shortcuts anytime.
-6. The prompt can be used as a launcher and to run commands.
 
 - For additional functionality [setup custom scripts](https://github.com/jarun/nnn/wiki/How-to#run-custom-scripts).
 - Visit the [How to](https://github.com/jarun/nnn/wiki/How-to) for many more specific usecases.
@@ -408,6 +407,7 @@ The following [user-scripts](https://github.com/jarun/nnn/tree/master/user-scrip
 | edit.sh | Fuzzy find a file in directory subtree with fzy and edit in vim |
 | fzy.sh | Fuzzy find a file in directory subtree with fzy and open using xdg-open |
 | imgur.sh | Upload an image file to imgur |
+| nlaunch | drop-down app launcher (needs fzy), drop in `$PATH`; fallback regular prompt |
 | picker.sh | Pick files and pipe the newline-separated list to another utility |
 | sxiv.sh | Open images in current directory in sxiv |
 | upgrade.sh | Check and update to latest version of nnn manually on Debian 9 Stretch |
diff --git a/nnn.1 b/nnn.1
index 8193c3466834e6153a62d205dd37d3d843fae946..34bfefbaa3bec8f9bb2f523115a5f9b03420ef32 100644 (file)
--- a/nnn.1
+++ b/nnn.1
@@ -159,6 +159,8 @@ Lock terminal
 Show command prompt
 .It Ic ^N
 Take note
+.It Ic =
+Launcher
 .El
 .Pp
 Backing up one directory level will set the cursor position at the
index 1eed7816f0b82cfc202a01c217ed140021c61609..b5b4e080dc824208988205919e284644727bdc85 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -394,7 +394,8 @@ static struct timespec gtimeout;
 #define APACK 4
 #define VIDIR 5
 #define LOCKER 6
-#define UNKNOWN 7
+#define NLAUNCH 7
+#define UNKNOWN 8
 
 /* Utilities to open files, run actions */
 static char * const utils[] = {
@@ -417,6 +418,7 @@ static char * const utils[] = {
 #else
        "vlock",
 #endif
+       "nlaunch",
        "UNKNOWN"
 };
 
@@ -2385,7 +2387,7 @@ static bool show_help(const char *path)
                "1MISC\n"
               "9! ^]  Spawn SHELL       C  Execute entry\n"
               "9R ^V  Run/pick script   L  Lock terminal\n"
-                "b^P  Prompt           ^N  Note\n"};
+                "b^P  Prompt  ^N  Note  =  Launcher\n"};
 
        if (g_tmpfpath[0])
                xstrlcpy(g_tmpfpath + g_tmpfplen - 1, messages[STR_TMPFILE],
@@ -3741,6 +3743,7 @@ nochange:
                case SEL_EXEC: // fallthrough
                case SEL_SHELL: // fallthrough
                case SEL_SCRIPT: // fallthrough
+               case SEL_LAUNCH: // fallthrough
                case SEL_RUNCMD:
                        switch (sel) {
                        case SEL_EXEC:
@@ -3817,6 +3820,11 @@ nochange:
                                lastname[0] = '\0';
                                setdirwatch();
                                goto begin;
+                       case SEL_LAUNCH:
+                               if (getutil(utils[NLAUNCH])) {
+                                       spawn(utils[NLAUNCH], NULL, NULL, path, F_NORMAL);
+                                       break;
+                               } // fallthrough
                        default: /* SEL_RUNCMD */
 #ifndef NORL
                                if (cfg.picker) {
index a2a858bfe97e64e425de6a64ffa69ecc7f0faca0..dadbde6ff049ad8b3a7a17ac21a14e640289daf8 100644 (file)
--- a/src/nnn.h
+++ b/src/nnn.h
@@ -88,6 +88,7 @@ enum action {
        SEL_EXEC,
        SEL_SHELL,
        SEL_SCRIPT,
+       SEL_LAUNCH,
        SEL_RUNCMD,
        SEL_RUNEDIT,
        SEL_RUNPAGE,
@@ -224,6 +225,8 @@ static struct key bindings[] = {
        /* Run a custom script */
        { 'R',            SEL_SCRIPT },
        { CONTROL('V'),   SEL_SCRIPT },
+       /* Launcher */
+       { '=',            SEL_LAUNCH },
        /* Run a command */
        { CONTROL('P'),   SEL_RUNCMD },
        /* Open in EDITOR or PAGER */
diff --git a/user-scripts/nlaunch b/user-scripts/nlaunch
new file mode 100755 (executable)
index 0000000..79540c8
--- /dev/null
@@ -0,0 +1,17 @@
+#!/usr/bin/env sh
+
+# Description: Fuzzy find executables in $PATH and launch an application
+#              stdin, stdout, stderr are suppressed so CLI utilities exit silently
+#
+# Shell: POSIX compliant
+# Author: Arun Prakash Jana
+
+IFS=':'
+
+get_selection() {
+    ls -H $PATH | sort | fzy
+}
+
+if selection=$( get_selection ); then
+    "$selection" 2>&1 >/dev/null &
+fi