* Add -a option to generate a temporary NNN_FIFO * Add documentation for -a option * plugins/README.md: promote the use of -a This obsoletes the global FIFO unlink trick, so I remove mentions of it. @jarun update: Polish -amaster
@@ -12,6 +12,7 @@ _nnn () | |||||
local cur=$2 prev=$3 | local cur=$2 prev=$3 | ||||
local -a opts | local -a opts | ||||
opts=( | opts=( | ||||
-a | |||||
-A | -A | ||||
-b | -b | ||||
-c | -c | ||||
@@ -11,6 +11,7 @@ else | |||||
set sessions_dir $HOME/.config/nnn/sessions | set sessions_dir $HOME/.config/nnn/sessions | ||||
end | end | ||||
complete -c nnn -s a -d 'auto-setup NNN_FIFO' | |||||
complete -c nnn -s A -d 'disable dir auto-select' | complete -c nnn -s A -d 'disable dir auto-select' | ||||
complete -c nnn -s b -r -d 'bookmark key to open' -x -a '(echo $NNN_BMS | awk -F: -v RS=\; \'{print $1"\t"$2}\')' | complete -c nnn -s b -r -d 'bookmark key to open' -x -a '(echo $NNN_BMS | awk -F: -v RS=\; \'{print $1"\t"$2}\')' | ||||
complete -c nnn -s c -d 'cli-only opener' | complete -c nnn -s c -d 'cli-only opener' | ||||
@@ -9,6 +9,7 @@ | |||||
setopt localoptions noshwordsplit noksharrays | setopt localoptions noshwordsplit noksharrays | ||||
local -a args | local -a args | ||||
args=( | args=( | ||||
'(-a)-a[auto-setup NNN_FIFO]' | |||||
'(-A)-A[disable dir auto-select]' | '(-A)-A[disable dir auto-select]' | ||||
'(-b)-b[bookmark key to open]:key char' | '(-b)-b[bookmark key to open]:key char' | ||||
'(-c)-c[cli-only opener]' | '(-c)-c[cli-only opener]' | ||||
@@ -6,6 +6,7 @@ | |||||
.Nd the missing terminal file manager for X | .Nd the missing terminal file manager for X | ||||
.Sh SYNOPSIS | .Sh SYNOPSIS | ||||
.Nm | .Nm | ||||
.Op Ar -a | |||||
.Op Ar -A | .Op Ar -A | ||||
.Op Ar -b key | .Op Ar -b key | ||||
.Op Ar -c | .Op Ar -c | ||||
@@ -54,6 +55,9 @@ to see the list of keybinds. | |||||
.Nm | .Nm | ||||
supports the following options: | supports the following options: | ||||
.Pp | .Pp | ||||
.Fl a | |||||
auto-setup temporary NNN_FIFO (described in ENVIRONMENT section) | |||||
.Pp | |||||
.Fl A | .Fl A | ||||
disable directory auto-select in type-to-nav mode | disable directory auto-select in type-to-nav mode | ||||
.Pp | .Pp | ||||
@@ -423,7 +427,9 @@ separated by \fI;\fR: | |||||
.Bd -literal | .Bd -literal | ||||
export NNN_FIFO='/tmp/nnn.fifo' | export NNN_FIFO='/tmp/nnn.fifo' | ||||
NOTE: If the FIFO file doesn't exist it will be created, but it will never be removed. | |||||
NOTES: | |||||
1. Overriden by a temporary path with -a option. | |||||
2. If the FIFO file doesn't exist it will be created, but not removed (unless it is generated by -a option). | |||||
.Ed | .Ed | ||||
.Pp | .Pp | ||||
\fBNNN_LOCKER:\fR terminal locker program. | \fBNNN_LOCKER:\fR terminal locker program. | ||||
@@ -198,9 +198,9 @@ Usage examples can be found in the Examples section below. | |||||
If `NNN_FIFO` is set, `nnn` will open it and write every hovered files. This can be used in plugins and external scripts, e.g. to implement file previews. | If `NNN_FIFO` is set, `nnn` will open it and write every hovered files. This can be used in plugins and external scripts, e.g. to implement file previews. | ||||
If a `NNN_FIFO` is set globally, each `nnn` instance will write to it, and a process reading from the pipe will get hovered path from every instance, interleaved. | |||||
The easiest way to set `NNN_FIFO` is to start `nnn` with the `-a` option, to automatically setup a temporary FIFO file for this `nnn` instance. | |||||
If you want to prevent this and be sure to have a private pipe to one `nnn` instance, you can unlink (remove) the FIFO file. If you had opened the FIFO before and you have read from it (so that `nnn` have it opened too), you can still read from it while you don't close it. But new `nnn` instances will recreate a new FIFO not linked to the previous one. | |||||
If a `NNN_FIFO` environment variable is set globally (and `-a` is not passed to `nnn`), each `nnn` instance will write to the same FIFO, and a process reading from the pipe will get hovered path from every instance, interleaved. | |||||
Don't forget to fork in the background to avoid blocking `nnn`. | Don't forget to fork in the background to avoid blocking `nnn`. | ||||
@@ -246,13 +246,6 @@ There are many plugins provided by `nnn` which can be used as examples. Here are | |||||
fi | fi | ||||
while read FILE ; do | while read FILE ; do | ||||
if [ -n "$NNN_FIFO" ] ; then | |||||
# If you want to remove the FIFO, | |||||
# don't do it before first read, | |||||
# nnn won't have it opened yet | |||||
rm "$NNN_FIFO" | |||||
NNN_FIFO= | |||||
fi | |||||
printf "%s" "$FILE" | xsel | printf "%s" "$FILE" | xsel | ||||
done < "$NNN_FIFO" & | done < "$NNN_FIFO" & | ||||
disown | disown | ||||
@@ -400,6 +400,7 @@ static char g_pipepath[TMP_LEN_MAX] __attribute__ ((aligned)); | |||||
#define STATE_FORTUNE 0x20 | #define STATE_FORTUNE 0x20 | ||||
#define STATE_TRASH 0x40 | #define STATE_TRASH 0x40 | ||||
#define STATE_FORCEQUIT 0x80 | #define STATE_FORCEQUIT 0x80 | ||||
#define STATE_AUTOFIFO 0x100 | |||||
static uint g_states; | static uint g_states; | ||||
@@ -6726,6 +6727,9 @@ static void usage(void) | |||||
"positional args:\n" | "positional args:\n" | ||||
" PATH start dir [default: .]\n\n" | " PATH start dir [default: .]\n\n" | ||||
"optional args:\n" | "optional args:\n" | ||||
#ifndef NOFIFO | |||||
" -a auto NNN_FIFO\n" | |||||
#endif | |||||
" -A no dir auto-select\n" | " -A no dir auto-select\n" | ||||
" -b key open bookmark key (trumps -s/S)\n" | " -b key open bookmark key (trumps -s/S)\n" | ||||
" -c cli-only NNN_OPENER (trumps -e)\n" | " -c cli-only NNN_OPENER (trumps -e)\n" | ||||
@@ -6880,6 +6884,11 @@ static void cleanup(void) | |||||
free(ihashbmp); | free(ihashbmp); | ||||
free(bookmark); | free(bookmark); | ||||
free(plug); | free(plug); | ||||
#ifndef NOFIFO | |||||
if (g_states & STATE_AUTOFIFO) | |||||
unlink(fifopath); | |||||
#endif | |||||
#ifdef DBGMODE | #ifdef DBGMODE | ||||
disabledbg(); | disabledbg(); | ||||
#endif | #endif | ||||
@@ -6906,8 +6915,13 @@ int main(int argc, char *argv[]) | |||||
while ((opt = (env_opts_id > 0 | while ((opt = (env_opts_id > 0 | ||||
? env_opts[--env_opts_id] | ? env_opts[--env_opts_id] | ||||
: getopt(argc, argv, "Ab:cdeEfFgHKl:nop:P:QrRs:St:T:Vxh"))) != -1) { | |||||
: getopt(argc, argv, "aAb:cdeEfFgHKl:nop:P:QrRs:St:T:Vxh"))) != -1) { | |||||
switch (opt) { | switch (opt) { | ||||
#ifndef NOFIFO | |||||
case 'a': | |||||
g_states |= STATE_AUTOFIFO; | |||||
break; | |||||
#endif | |||||
case 'A': | case 'A': | ||||
cfg.autoselect = 0; | cfg.autoselect = 0; | ||||
break; | break; | ||||
@@ -7154,6 +7168,12 @@ int main(int argc, char *argv[]) | |||||
#ifndef NOFIFO | #ifndef NOFIFO | ||||
/* Create fifo */ | /* Create fifo */ | ||||
if (g_states & STATE_AUTOFIFO) { | |||||
g_tmpfpath[tmpfplen - 1] = '\0'; | |||||
snprintf(g_buf, CMD_LEN_MAX, "%s/nnn-fifo.%d", g_tmpfpath, getpid()); | |||||
setenv("NNN_FIFO", g_buf, TRUE); | |||||
} | |||||
fifopath = xgetenv("NNN_FIFO", NULL); | fifopath = xgetenv("NNN_FIFO", NULL); | ||||
if (fifopath) { | if (fifopath) { | ||||
if (mkfifo(fifopath, 0600) != 0 && !(errno == EEXIST && access(fifopath, W_OK) == 0)) { | if (mkfifo(fifopath, 0600) != 0 && !(errno == EEXIST && access(fifopath, W_OK) == 0)) { | ||||