mirror of
https://github.com/jarun/nnn.git
synced 2024-11-24 11:51:27 +00:00
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:
parent
c7af686b4e
commit
b1027150ed
|
@ -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]'
|
||||||
|
|
8
nnn.1
8
nnn.1
|
@ -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
|
||||||
|
|
22
src/nnn.c
22
src/nnn.c
|
@ -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)) {
|
||||||
|
|
Loading…
Reference in a new issue