Add -a option to generate a temporary NNN_FIFO (#588)

* 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 -a
This commit is contained in:
lvgx 2020-05-23 14:03:37 +02:00 committed by Arun Prakash Jana
parent c7af686b4e
commit b1027150ed
No known key found for this signature in database
GPG key ID: A75979F35C080412
6 changed files with 33 additions and 11 deletions

View file

@ -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

View file

@ -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'

View file

@ -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]'

8
nnn.1
View file

@ -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.

View file

@ -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

View file

@ -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)) {