nnn.1 | 6 ++++-- plugins/README.md | 4 +++- src/nnn.c | 37 ++++++++++++++++++++++++++++++++++--- diff --git a/nnn.1 b/nnn.1 index 67b1b583e66c95754238b5865347e820bba96416..93e231ea3957a04abf688cffb848620be1329f63 100644 --- a/nnn.1 +++ b/nnn.1 @@ -338,8 +338,10 @@ .Bd -literal export NNN_PLUG='f:finder;o:fzopen;p:mocplay;d:diffs;t:nmount;v:imgview' NOTES: - 1. To run a plugin directly, press \fI;\fR followed by the plugin key. - 2. To skip directory refresh after running a plugin, prefix with \fB-\fR. + 1. To run a plugin directly, press \fI;\fR followed by the key_char. + 2. Alternative way to run a plugin directly - + prefix with \fIAlt\fR (i.e. \fIAlt+key_char\fR). + 3. To skip directory refresh after running a plugin, prefix with \fB-\fR. export NNN_PLUG='m:-mediainf' .Ed diff --git a/plugins/README.md b/plugins/README.md index b2254f283674b93e5ef8d88b159584c1c45417c9..a1f7c245e6dba9a4dca28659186ceb0d735eddb1 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -78,13 +78,15 @@ | x2sel | Copy `\n`-separated file list from system clipboard to sel | sh | _see in-file docs_ | ## Invoking a plugin -Press the plugin shortcut (; or ^S) followed by the assigned key. E.g., with the below config: +Press the plugin shortcut (; or ^S) followed by the assigned key character. E.g., with the below config: ```sh export NNN_PLUG='f:finder;o:fzopen;p:mocplay;d:diffs;t:nmount;v:imgview' ``` Plugin `finder` can be run with the keybind ;f, `fzopen` can be run with ;o and so on... The key vs. plugin pairs are shown in the help and config screen. + +Alternative way to run a plugin directly - prefix with Alt (i.e. Alt+key_char). To select and invoke a plugin from the plugin directory, press Enter (to _enter_ the plugin dir) after the plugin shortcut. diff --git a/src/nnn.c b/src/nnn.c index c56b9347c4e640ec8adcd7c05991b806e43dad34..ba7d78b024e92c0c4eab69afded85a8cf609ea25 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -2284,6 +2284,18 @@ } static int (*entrycmpfn)(const void *va, const void *vb) = &entrycmp; +/* In case of an error, resets *wch to Esc */ +static int handle_alt_key(wint_t *wch) +{ + timeout(0); + int r = get_wch(wch); + if (r == ERR) + *wch = 27; + cleartimeout(); + + return r; +} + /* * Returns SEL_* if key is bound and 0 otherwise. * Also modifies the run and env pointers (used on SEL_{RUN,RUNARG}). @@ -2311,6 +2323,18 @@ c = getch(); //DPRINTF_D(c); //DPRINTF_S(keyname(c)); + /* Handle Alt+key */ + if (c == 27) { + timeout(0); + c = getch(); + if (c != ERR) { + ungetch(c); + c = CONTROL('S'); + } else + c = 27; + settimeout(); + } + if (c == ERR && presel == MSGWAIT) c = (cfg.filtermode || filterset()) ? FILTER : CONTROL('L'); else if (c == FILTER || c == CONTROL('L')) @@ -2564,7 +2588,11 @@ continue; #ifndef NOMOUSE case KEY_MOUSE: // fallthrough #endif - case 27: /* Exit filter mode on Escape */ + case 27: /* Exit filter mode on Escape and Alt+key */ + if (handle_alt_key(ch) != ERR) { + unget_wch(*ch); + *ch = CONTROL('S'); + } goto end; } @@ -2776,7 +2804,10 @@ memmove(buf, buf + pos, (len - pos) * WCHAR_T_WIDTH); len -= pos; pos = 0; continue; - case 27: /* Exit prompt on Escape */ + case 27: /* Exit prompt on Escape, but just filter out Alt+key */ + if (handle_alt_key(ch) != ERR) + continue; + len = 0; goto END; } @@ -4097,7 +4128,7 @@ "9v ^V Move sel here%-8cw ^W Cp/mv sel as\n" "9x ^X Delete%-18cE Edit sel\n" "c* Toggle exe%-14c> Export list\n" "1MISC\n" - "9; ^S Select plugin%-11c= Launch app\n" + "5Alt ; ^S Select plugin%-11c= Launch app\n" "9! ^] Shell%-19c] Cmd prompt\n" "cc Connect remote%-10cu Unmount\n" "9t ^T Sort toggles%-12cs Manage session\n"