From 69aeeb51d249736c37ea6aa095be4ffb020731d8 Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Tue, 12 Mar 2019 16:19:34 +0530 Subject: [PATCH] GUI app launcher with drop-down menu `nlauncher` is POSIX compliant. It needs `fzy`. --- README.md | 4 ++-- nnn.1 | 2 ++ src/nnn.c | 12 ++++++++++-- src/nnn.h | 3 +++ user-scripts/nlaunch | 17 +++++++++++++++++ 5 files changed, 34 insertions(+), 4 deletions(-) create mode 100755 user-scripts/nlaunch diff --git a/README.md b/README.md index 31ff8961..3cc7dadf 100644 --- a/README.md +++ b/README.md @@ -254,7 +254,7 @@ Press ? 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 ?. export NNN_USE_EDITOR=1 4. Run `n`. 5. Don't memorize keys. Arrows, / and q suffice. Press ? 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 8193c346..34bfefba 100644 --- 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 diff --git a/src/nnn.c b/src/nnn.c index 1eed7816..b5b4e080 100644 --- 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) { diff --git a/src/nnn.h b/src/nnn.h index a2a858bf..dadbde6f 100644 --- 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 index 00000000..79540c8c --- /dev/null +++ b/user-scripts/nlaunch @@ -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