From b1027150ed09ddeb9acab56a29e216c7196be4e1 Mon Sep 17 00:00:00 2001 From: lvgx Date: Sat, 23 May 2020 14:03:37 +0200 Subject: [PATCH] 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 --- misc/auto-completion/bash/nnn-completion.bash | 1 + misc/auto-completion/fish/nnn.fish | 1 + misc/auto-completion/zsh/_nnn | 1 + nnn.1 | 8 ++++++- plugins/README.md | 11 ++-------- src/nnn.c | 22 ++++++++++++++++++- 6 files changed, 33 insertions(+), 11 deletions(-) diff --git a/misc/auto-completion/bash/nnn-completion.bash b/misc/auto-completion/bash/nnn-completion.bash index e8f2548c..820e1c7c 100644 --- a/misc/auto-completion/bash/nnn-completion.bash +++ b/misc/auto-completion/bash/nnn-completion.bash @@ -12,6 +12,7 @@ _nnn () local cur=$2 prev=$3 local -a opts opts=( + -a -A -b -c diff --git a/misc/auto-completion/fish/nnn.fish b/misc/auto-completion/fish/nnn.fish index 1b6455b2..ac6e462c 100644 --- a/misc/auto-completion/fish/nnn.fish +++ b/misc/auto-completion/fish/nnn.fish @@ -11,6 +11,7 @@ else set sessions_dir $HOME/.config/nnn/sessions 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 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' diff --git a/misc/auto-completion/zsh/_nnn b/misc/auto-completion/zsh/_nnn index 441589ac..d130b162 100644 --- a/misc/auto-completion/zsh/_nnn +++ b/misc/auto-completion/zsh/_nnn @@ -9,6 +9,7 @@ setopt localoptions noshwordsplit noksharrays local -a args args=( + '(-a)-a[auto-setup NNN_FIFO]' '(-A)-A[disable dir auto-select]' '(-b)-b[bookmark key to open]:key char' '(-c)-c[cli-only opener]' diff --git a/nnn.1 b/nnn.1 index 7a34f3b8..86a4d875 100644 --- a/nnn.1 +++ b/nnn.1 @@ -6,6 +6,7 @@ .Nd the missing terminal file manager for X .Sh SYNOPSIS .Nm +.Op Ar -a .Op Ar -A .Op Ar -b key .Op Ar -c @@ -54,6 +55,9 @@ to see the list of keybinds. .Nm supports the following options: .Pp +.Fl a + auto-setup temporary NNN_FIFO (described in ENVIRONMENT section) +.Pp .Fl A disable directory auto-select in type-to-nav mode .Pp @@ -423,7 +427,9 @@ separated by \fI;\fR: .Bd -literal 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 .Pp \fBNNN_LOCKER:\fR terminal locker program. diff --git a/plugins/README.md b/plugins/README.md index 59ae2812..27448229 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -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 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`. @@ -246,13 +246,6 @@ There are many plugins provided by `nnn` which can be used as examples. Here are fi 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 done < "$NNN_FIFO" & disown diff --git a/src/nnn.c b/src/nnn.c index 89c4a48a..b45eeb23 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -400,6 +400,7 @@ static char g_pipepath[TMP_LEN_MAX] __attribute__ ((aligned)); #define STATE_FORTUNE 0x20 #define STATE_TRASH 0x40 #define STATE_FORCEQUIT 0x80 +#define STATE_AUTOFIFO 0x100 static uint g_states; @@ -6726,6 +6727,9 @@ static void usage(void) "positional args:\n" " PATH start dir [default: .]\n\n" "optional args:\n" +#ifndef NOFIFO + " -a auto NNN_FIFO\n" +#endif " -A no dir auto-select\n" " -b key open bookmark key (trumps -s/S)\n" " -c cli-only NNN_OPENER (trumps -e)\n" @@ -6880,6 +6884,11 @@ static void cleanup(void) free(ihashbmp); free(bookmark); free(plug); +#ifndef NOFIFO + if (g_states & STATE_AUTOFIFO) + unlink(fifopath); +#endif + #ifdef DBGMODE disabledbg(); #endif @@ -6906,8 +6915,13 @@ int main(int argc, char *argv[]) while ((opt = (env_opts_id > 0 ? 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) { +#ifndef NOFIFO + case 'a': + g_states |= STATE_AUTOFIFO; + break; +#endif case 'A': cfg.autoselect = 0; break; @@ -7154,6 +7168,12 @@ int main(int argc, char *argv[]) #ifndef NOFIFO /* 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); if (fifopath) { if (mkfifo(fifopath, 0600) != 0 && !(errno == EEXIST && access(fifopath, W_OK) == 0)) {