diff --git a/nnn.1 b/nnn.1 index 67b1b583..93e231ea 100644 --- a/nnn.1 +++ b/nnn.1 @@ -338,8 +338,10 @@ separated by \fI;\fR: 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 b2254f28..a1f7c245 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -78,7 +78,7 @@ Plugins are installed to `${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins`. ## 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' @@ -86,6 +86,8 @@ 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. #### Skip directory refresh after running a plugin diff --git a/src/nnn.c b/src/nnn.c index c56b9347..ba7d78b0 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -2284,6 +2284,18 @@ static int reventrycmp(const void *va, const void *vb) 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 @@ static int nextsel(int presel) //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 @@ static int filterentries(char *path, char *lastname) #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 @@ static char *xreadline(const char *prefill, const char *prompt) 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 @@ static void show_help(const char *path) "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"