README.md | 4 ++-- nnn.1 | 2 ++ src/nnn.c | 12 ++++++++++-- src/nnn.h | 3 +++ user-scripts/nlaunch | 17 +++++++++++++++++ diff --git a/README.md b/README.md index 31ff8961c7835b04d987d1398ff207f89dff8c27..3cc7dadffc7313c20cd74fc403a6f1e1ccf16cd0 100644 --- a/README.md +++ b/README.md @@ -254,7 +254,7 @@ ^W Random s Size t Time modified 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 @@ 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 @@ | copier.sh | Copy selection to clipboard | | 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 --- a/nnn.1 +++ b/nnn.1 @@ -159,6 +159,8 @@ .It Ic ^P 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 1eed7816f0b82cfc202a01c217ed140021c61609..b5b4e080dc824208988205919e284644727bdc85 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -394,7 +394,8 @@ #define ATOOL 3 #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 @@ "lock", #else "vlock", #endif + "nlaunch", "UNKNOWN" }; @@ -2385,7 +2387,7 @@ "b^W Random s Size t Time modified\n" "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 @@ } 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 @@ cfg.runctx = cfg.curctx; 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 a2a858bfe97e64e425de6a64ffa69ecc7f0faca0..dadbde6ff049ad8b3a7a17ac21a14e640289daf8 100644 --- a/src/nnn.h +++ b/src/nnn.h @@ -88,6 +88,7 @@ SEL_HELP, SEL_EXEC, SEL_SHELL, SEL_SCRIPT, + SEL_LAUNCH, SEL_RUNCMD, SEL_RUNEDIT, SEL_RUNPAGE, @@ -224,6 +225,8 @@ { CONTROL(']'), SEL_SHELL }, /* 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 0000000000000000000000000000000000000000..79540c8c540c0a33e68ad6555fec3f5c3a3088fc --- /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