]> Sergey Matveev's repositories - nnn.git/commitdiff
Allow launching plugins with Alt + plugin's key (#569)
authorlvgx <l@vgx.fr>
Wed, 13 May 2020 05:06:59 +0000 (07:06 +0200)
committerArun Prakash Jana <engineerarun@gmail.com>
Wed, 13 May 2020 06:59:47 +0000 (12:29 +0530)
* Allow launching plugins with Alt + plugin's key

* Fix Alt key in filter/prompts modes

* Fix handling Alt key in nextsel()

In filter mode: run the associated plugin.
In prompt mode: just throw out the Alt+key input.
In nextsel(): differentiate Alt+key and Esc

nnn.1
plugins/README.md
src/nnn.c

diff --git a/nnn.1 b/nnn.1
index 67b1b583e66c95754238b5865347e820bba96416..93e231ea3957a04abf688cffb848620be1329f63 100644 (file)
--- 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
index b2254f283674b93e5ef8d88b159584c1c45417c9..a1f7c245e6dba9a4dca28659186ceb0d735eddb1 100644 (file)
@@ -78,7 +78,7 @@ Plugins are installed to `${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins`.
 
 ## Invoking a plugin
 
-Press the plugin shortcut (<kbd>;</kbd> or <kbd>^S</kbd>) followed by the assigned key. E.g., with the below config:
+Press the plugin shortcut (<kbd>;</kbd> or <kbd>^S</kbd>) 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 <kbd>;f</kbd>, `fzopen` can be run with <kbd>;o</kbd> 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 <kbd>Alt</kbd> (i.e. <kbd>Alt+key_char</kbd>).
+
 To select and invoke a plugin from the plugin directory, press <kbd>Enter</kbd> (to _enter_ the plugin dir) after the plugin shortcut.
 
 #### Skip directory refresh after running a plugin
index c56b9347c4e640ec8adcd7c05991b806e43dad34..ba7d78b024e92c0c4eab69afded85a8cf609ea25 100644 (file)
--- 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"