Move nlaunch to plugins as launch

This commit is contained in:
Arun Prakash Jana 2019-12-09 00:34:53 +05:30
parent 77ebfff98b
commit d5512462af
No known key found for this signature in database
GPG key ID: A75979F35C080412
8 changed files with 89 additions and 65 deletions

View file

@ -77,7 +77,7 @@ Add to that an awesome [Wiki](https://github.com/jarun/nnn/wiki)!
1. Install the [utilities you may need](https://github.com/jarun/nnn#utility-dependencies) based on your regular workflows. 1. Install the [utilities you may need](https://github.com/jarun/nnn#utility-dependencies) based on your regular workflows.
2. Configure [cd on quit](https://github.com/jarun/nnn/wiki/Basic-use-cases#configure-cd-on-quit). 2. Configure [cd on quit](https://github.com/jarun/nnn/wiki/Basic-use-cases#configure-cd-on-quit).
3. Optionally open all text files in `$EDITOR` (fallback vi): `export NNN_USE_EDITOR=1`. 3. Optionally open all text files in `$EDITOR` (fallback vi): `export NNN_USE_EDITOR=1`.
4. For additional functionality [install plugins](https://github.com/jarun/nnn/tree/master/plugins#installing-plugins) and the GUI app launcher [`nlaunch`](https://github.com/jarun/nnn/tree/master/misc/nlaunch). 4. For additional functionality [install plugins](https://github.com/jarun/nnn/tree/master/plugins#installing-plugins).
Notes: Notes:
@ -232,7 +232,7 @@ The list below is from the **dev branch**. Press <kbd>?</kbd> in `nnn` to see th
MISC MISC
! ^] Shell ;K :K xK Execute plugin K ! ^] Shell ;K :K xK Execute plugin K
C Execute entry R ^V Pick plugin C Execute entry R ^V Pick plugin
U Manage session = Launch U Manage session = Launch app
c Remote mount u Unmount c Remote mount u Unmount
] ^P Prompt/run cmd L Lock ] ^P Prompt/run cmd L Lock
``` ```

View file

@ -1,7 +0,0 @@
`nlaunch` is an independent POSIX-compliant GUI application launcher shell script. To use it with `nnn` you need to mark the file executable and drop it somewhere in your `$PATH`.
It requires [`fzy`](https://github.com/jhawthorn/fzy) to show a fuzzy drop-down menu.
To use `nlaunch` as an independent launcher add a keybind to open `nlaunch` in a terminal e.g.
xfce4-terminal -e nlaunch

View file

@ -1,29 +0,0 @@
#!/usr/bin/env sh
# Description: Fuzzy find executables in $PATH and launch an application.
# stdin, stdout, stderr are suppressed so CLI utilities exit silently.
# Works as an independent app launcher.
#
# Requires fzy.
#
# Usage: nlaunch [delay]
# delay is in seconds, if omitted nlaunch waits for 1 sec
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
IFS=':'
get_selection() {
ls -H $PATH | sort | fzy
}
if selection=$( get_selection ); then
setsid "$selection" 2>/dev/null 1>/dev/null &
if ! [ -z "$1" ]; then
sleep "$1"
else
sleep 1
fi
fi

View file

@ -20,7 +20,7 @@ Plugins extend the capabilities of `nnn`. They are _executable_ scripts (or bina
| diffs | Diff for selection (limited to 2 for directories) | sh | vimdiff | | diffs | Diff for selection (limited to 2 for directories) | sh | vimdiff |
| dragdrop | Drag/drop files from/into nnn | sh | [dragon](https://github.com/mwh/dragon) | | dragdrop | Drag/drop files from/into nnn | sh | [dragon](https://github.com/mwh/dragon) |
| exetoggle | Toggle executable status of hovered file | sh | chmod | | exetoggle | Toggle executable status of hovered file | sh | chmod |
| fzcd | Change to the directory of a fuzzy-selected file/dir | sh | fzy/fzf<br>(optional fd) | | fzcd | Change to the directory of a fuzzy-selected file/dir | sh | fzf/fzy<br>(optional fd) |
| fzhist | Fuzzy-select a cmd from history, edit in `$EDITOR` and run | sh | fzy | | fzhist | Fuzzy-select a cmd from history, edit in `$EDITOR` and run | sh | fzy |
| fzopen | Fuzzy find a file in dir subtree and edit or open | sh | fzy, xdg-open | | fzopen | Fuzzy find a file in dir subtree and edit or open | sh | fzy, xdg-open |
| getplugs | Update plugins | sh | curl | | getplugs | Update plugins | sh | curl |
@ -33,6 +33,7 @@ Plugins extend the capabilities of `nnn`. They are _executable_ scripts (or bina
| imgviu | View an image or images in dir in `$PAGER` | sh | [viu](https://github.com/atanunq/viu), less | | imgviu | View an image or images in dir in `$PAGER` | sh | [viu](https://github.com/atanunq/viu), less |
| ipinfo | Fetch external IP address and whois information | sh | curl, whois | | ipinfo | Fetch external IP address and whois information | sh | curl, whois |
| kdeconnect | Send selected files to an Android device | sh | kdeconnect-cli | | kdeconnect | Send selected files to an Android device | sh | kdeconnect-cli |
| launch | GUI application launcher | sh | fzf/fzy |
| mediainf | Show media information | sh | mediainfo | | mediainf | Show media information | sh | mediainfo |
| moclyrics | Show lyrics of the track playing in moc | sh | [ddgr](https://github.com/jarun/ddgr), [moc](http://moc.daper.net/) | | moclyrics | Show lyrics of the track playing in moc | sh | [ddgr](https://github.com/jarun/ddgr), [moc](http://moc.daper.net/) |
| mocplay | Append (and/or play) selection/dir/file in moc | sh | [moc](http://moc.daper.net/) | | mocplay | Append (and/or play) selection/dir/file in moc | sh | [moc](http://moc.daper.net/) |
@ -65,8 +66,6 @@ The following command installs all plugins:
Plugins are installed to `${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins`. You can run the `getplugs` plugin later to update the plugins. It backs up earlier plugins. Plugins are installed to `${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins`. You can run the `getplugs` plugin later to update the plugins. It backs up earlier plugins.
**NOTE:** `getplugs` also downloads the launcher `nlaunch` and tries to place it at `/usr/local/bin/` using `sudo`. If it fails you have to place `nlauch` manually somewhere in your `$PATH`.
## Executing plugins ## Executing plugins
**Method 1:** Directly with <kbd>:key</kbd>: **Method 1:** Directly with <kbd>:key</kbd>:

View file

@ -31,13 +31,13 @@ prompt () {
fi fi
} }
if [ "$(is_cmd_exists sudo)" -eq "0" ]; then # if [ "$(is_cmd_exists sudo)" -eq "0" ]; then
sucmd=sudo # sucmd=sudo
elif [ "$(is_cmd_exists doas)" -eq "0" ]; then # elif [ "$(is_cmd_exists doas)" -eq "0" ]; then
sucmd=doas # sucmd=doas
else # else
sucmd=: # noop # sucmd=: # noop
fi # fi
# backup any earlier plugins # backup any earlier plugins
if [ -d "$PLUGIN_DIR" ]; then if [ -d "$PLUGIN_DIR" ]; then
@ -65,5 +65,4 @@ for f in $(find . -maxdepth 1 \( ! -iname "." ! -iname "*.md" \)); do
done done
cd ../.. || exit 1 cd ../.. || exit 1
$sucmd mv -vf nnn-master/misc/nlaunch/nlaunch /usr/local/bin/
rm -rf nnn-master/ master.tar.gz rm -rf nnn-master/ master.tar.gz

42
plugins/launch Executable file
View file

@ -0,0 +1,42 @@
#!/usr/bin/env sh
# Description: Independent POSIX-compliant GUI application launcher.
# Fuzzy find executables in $PATH and launch an application.
# stdin, stdout, stderr are suppressed so CLI tools exit silently.
#
# To configure launch as an independent app launcher add a keybind
# to open launch in a terminal e.g.,
#
# xfce4-terminal -e "${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/launch
#
# Requires: fzf or fzy
#
# Usage: launch [delay]
# delay is in seconds, if omitted launch waits for 1 sec
#
# Integration with nnn: launch is installed with other plugins, nnn picks it up.
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
IFS=':'
get_selection() {
if which fzf >/dev/null 2>&1; then
ls -H $PATH | sort | fzf
elif which fzy >/dev/null 2>&1; then
ls -H $PATH | sort | fzy
else
exit 1
fi
}
if selection=$( get_selection ); then
setsid "$selection" 2>/dev/null 1>/dev/null &
if ! [ -z "$1" ]; then
sleep "$1"
else
sleep 1
fi
fi

View file

@ -1,11 +1,12 @@
#!/usr/bin/env sh #!/usr/bin/env sh
# ############################################################################# # #############################################################################
# nuke: a sample script to play files in different apps by file type and mime # Description: Sample script to play files in apps by file type or mime
# shell: POSIX compliant
# usage: nuke filepath
# #
# nnn integration: # Shell: POSIX compliant
# Usage: nuke filepath
#
# Integration with nnn:
# 1. Export the required config: # 1. Export the required config:
# export NNN_OPENER=/absolute/path/to/nuke # export NNN_OPENER=/absolute/path/to/nuke
# # Otherwise, if nuke is in $PATH # # Otherwise, if nuke is in $PATH
@ -14,7 +15,7 @@
# nnn -c # nnn -c
# 3. nuke can use nnn plugins (e.g. mocplay is used for audio), $PATH is updated. # 3. nuke can use nnn plugins (e.g. mocplay is used for audio), $PATH is updated.
# #
# details: # Details:
# Inspired by ranger's scope.sh, modified for usage with nnn. # Inspired by ranger's scope.sh, modified for usage with nnn.
# #
# Tries to play 'file' (1st argument) in the following order: # Tries to play 'file' (1st argument) in the following order:
@ -22,7 +23,7 @@
# ii. by mime (image, video, audio, pdf) # ii. by mime (image, video, audio, pdf)
# iii. by mime (other file types) # iii. by mime (other file types)
# #
# modification tips: # Modification tips:
# 1. Invokes CLI utilities by default. Set GUI to 1 to enable GUI apps. # 1. Invokes CLI utilities by default. Set GUI to 1 to enable GUI apps.
# 2. PAGER is "less -R". # 2. PAGER is "less -R".
# 3. Start GUI apps in bg to unblock. Redirect stdout and strerr if required. # 3. Start GUI apps in bg to unblock. Redirect stdout and strerr if required.
@ -32,7 +33,7 @@
# #
# Feel free to change the utilities to your favourites and add more mimes. # Feel free to change the utilities to your favourites and add more mimes.
# #
# defaults: # Defaults:
# By extension (only the enbaled ones): # By extension (only the enbaled ones):
# most archives: list with atool, bsdtar # most archives: list with atool, bsdtar
# rar: list with unrar # rar: list with unrar

View file

@ -369,7 +369,7 @@ static bool g_plinit = FALSE;
#define UTIL_TAR 4 #define UTIL_TAR 4
#define UTIL_LOCKER 5 #define UTIL_LOCKER 5
#define UTIL_CMATRIX 6 #define UTIL_CMATRIX 6
#define UTIL_NLAUNCH 7 #define UTIL_LAUNCH 7
#define UTIL_SH_EXEC 8 #define UTIL_SH_EXEC 8
#define UTIL_ARCHIVEMOUNT 9 #define UTIL_ARCHIVEMOUNT 9
#define UTIL_SSHFS 10 #define UTIL_SSHFS 10
@ -377,6 +377,8 @@ static bool g_plinit = FALSE;
#define UTIL_VI 12 #define UTIL_VI 12
#define UTIL_LESS 13 #define UTIL_LESS 13
#define UTIL_SH 14 #define UTIL_SH 14
#define UTIL_FZF 15
#define UTIL_FZY 16
/* Utilities to open files, run actions */ /* Utilities to open files, run actions */
static char * const utils[] = { static char * const utils[] = {
@ -399,7 +401,7 @@ static char * const utils[] = {
"vlock", "vlock",
#endif #endif
"cmatrix", "cmatrix",
"nlaunch", "launch",
"sh -c", "sh -c",
"archivemount", "archivemount",
"sshfs", "sshfs",
@ -407,6 +409,8 @@ static char * const utils[] = {
"vi", "vi",
"less", "less",
"sh", "sh",
"fzf",
"fzy",
}; };
/* Common strings */ /* Common strings */
@ -451,6 +455,7 @@ static char * const utils[] = {
#define MSG_FEW_COLOUMNS 38 #define MSG_FEW_COLOUMNS 38
#define MSG_REMOTE_OPTS 39 #define MSG_REMOTE_OPTS 39
#define MSG_RCLONE_DELAY 40 #define MSG_RCLONE_DELAY 40
#define MSG_APP_NAME 41
static const char * const messages[] = { static const char * const messages[] = {
"no traversal", "no traversal",
@ -493,7 +498,8 @@ static const char * const messages[] = {
"entry exists", "entry exists",
"too few columns!", "too few columns!",
"'s'shfs / 'r'clone?", "'s'shfs / 'r'clone?",
"may take a while, try refresh" "may take a while, try refresh",
"app name: ",
}; };
/* Supported configuration environment variables */ /* Supported configuration environment variables */
@ -2098,6 +2104,7 @@ static int filterentries(char *path)
if (len == 1) if (len == 1)
cur = oldcur; cur = oldcur;
goto end; goto end;
case '=': // fallthrough /* Launch app */
case ':': // fallthrough /* Run plugin keys */ case ':': // fallthrough /* Run plugin keys */
case ';': // fallthrough case ';': // fallthrough
case '?': /* Help and config key, '?' is an invalid regex */ case '?': /* Help and config key, '?' is an invalid regex */
@ -3497,7 +3504,7 @@ static void show_help(const char *path)
"1MISC\n" "1MISC\n"
"9! ^] Shell ;K :K xK Execute plugin K\n" "9! ^] Shell ;K :K xK Execute plugin K\n"
"cC Execute entry R ^V Pick plugin\n" "cC Execute entry R ^V Pick plugin\n"
"cU Manage session = Launch\n" "cU Manage session = Launch app\n"
"cc SSHFS mount u Unmount\n" "cc SSHFS mount u Unmount\n"
"9] ^P Prompt/run cmd L Lock\n"}; "9] ^P Prompt/run cmd L Lock\n"};
@ -5247,10 +5254,22 @@ nochange:
setdirwatch(); setdirwatch();
goto begin; goto begin;
case SEL_LAUNCH: case SEL_LAUNCH:
if (getutil(utils[UTIL_NLAUNCH])) { mkpath(plugindir, utils[UTIL_LAUNCH], newpath);
spawn(utils[UTIL_NLAUNCH], "0", NULL, path, F_NORMAL); if ((getutil(utils[UTIL_FZF]) || getutil(utils[UTIL_FZY]))
break; && access(newpath, X_OK) == 0) {
} // fallthrough tmp = newpath;
r = F_NORMAL;
} else {
tmp = xreadline(NULL, messages[MSG_APP_NAME]);
r = F_NOWAIT | F_NOTRACE | F_MULTI;
}
if (tmp && *tmp) // NOLINT
spawn(tmp, "0", NULL, path, r);
if (cfg.filtermode)
presel = FILTER;
goto nochange;
default: /* SEL_RUNCMD */ default: /* SEL_RUNCMD */
#ifndef NORL #ifndef NORL
if (cfg.picker) { if (cfg.picker) {
@ -5264,7 +5283,7 @@ nochange:
goto nochange; goto nochange;
} }
#endif #endif
if (tmp && tmp[0]) // NOLINT if (tmp && *tmp) // NOLINT
prompt_run(tmp, (ndents ? dents[cur].name : ""), path); prompt_run(tmp, (ndents ? dents[cur].name : ""), path);
} }