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"