It seems the behaviour of the default opener (xdg-open) varies across platforms and environments. Details are documented in the issue. To prevent an empty file from being accidentally opened leading to unexpected behaviour, we are adding a guard with the message that the empty file should be opened using edit or open option.master
@@ -80,6 +80,7 @@ We need contributors. Please visit the [ToDo list](https://github.com/jarun/nnn/ | |||||
- [tmux configuration](#tmux-configuration) | - [tmux configuration](#tmux-configuration) | ||||
- [BSD terminal issue](#bsd-terminal-issue) | - [BSD terminal issue](#bsd-terminal-issue) | ||||
- [restrict file open](#restrict-file-open) | - [restrict file open](#restrict-file-open) | ||||
- [restrict 0-byte files](#restrict-0-byte-files) | |||||
- [Why fork?](#why-fork) | - [Why fork?](#why-fork) | ||||
- [Mentions](#mentions) | - [Mentions](#mentions) | ||||
- [Developers](#developers) | - [Developers](#developers) | ||||
@@ -531,7 +532,7 @@ Enable volume management in your DE file manager and set removable drives or med | |||||
By default in OpenBSD & FreeBSD, `stty` maps <kbd>^Y</kbd> to `DSUSP`. This means that typing <kbd>^Y</kbd> will suspend `nnn` as if you typed <kbd>^Z</kbd> (you can bring `nnn` back to the foreground by issuing `fg`) instead of entering multi-copy mode. You can check this with `stty -a`. If it includes the text `dsusp = ^Y`, issuing `stty dsusp undef` will disable this `DSUSP` and let `nnn` receive the <kbd>^Y</kbd> instead. | By default in OpenBSD & FreeBSD, `stty` maps <kbd>^Y</kbd> to `DSUSP`. This means that typing <kbd>^Y</kbd> will suspend `nnn` as if you typed <kbd>^Z</kbd> (you can bring `nnn` back to the foreground by issuing `fg`) instead of entering multi-copy mode. You can check this with `stty -a`. If it includes the text `dsusp = ^Y`, issuing `stty dsusp undef` will disable this `DSUSP` and let `nnn` receive the <kbd>^Y</kbd> instead. | ||||
#### Restrict file open | |||||
#### restrict file open | |||||
In order to disable opening files on accidental navigation key (<kbd>→</kbd> or <kbd>l</kbd>) press: | In order to disable opening files on accidental navigation key (<kbd>→</kbd> or <kbd>l</kbd>) press: | ||||
@@ -539,6 +540,12 @@ In order to disable opening files on accidental navigation key (<kbd>→</kbd> o | |||||
Use <kbd>Enter</kbd> to open files. | Use <kbd>Enter</kbd> to open files. | ||||
#### restrict 0-byte files | |||||
Restrict opening 0-byte files due to [unexpected behaviour](https://github.com/jarun/nnn/issues/187); use _edit_ or _open with_ to open the file. | |||||
export NNN_RESTRICT_0B=1 | |||||
#### WHY FORK? | #### WHY FORK? | ||||
`nnn` was initially forked from [noice](http://git.2f30.org/noice/) but is significantly [different](https://github.com/jarun/nnn/wiki/nnn-vs.-noice) today. I chose to fork because: | `nnn` was initially forked from [noice](http://git.2f30.org/noice/) but is significantly [different](https://github.com/jarun/nnn/wiki/nnn-vs.-noice) today. I chose to fork because: | ||||
@@ -309,6 +309,11 @@ files. | |||||
.Bd -literal | .Bd -literal | ||||
export DISABLE_FILE_OPEN_ON_NAV=1 | export DISABLE_FILE_OPEN_ON_NAV=1 | ||||
.Ed | .Ed | ||||
.Pp | |||||
\fBNNN_RESTRICT_0B:\fR restrict opening 0-byte files due to unexpected behaviour; use \fIedit\fR or \fIopen with\fR to open the file. | |||||
.Bd -literal | |||||
export NNN_RESTRICT_0B=1 | |||||
.Ed | |||||
.Sh KNOWN ISSUES | .Sh KNOWN ISSUES | ||||
If you are using urxvt you might have to set backspace key to DEC. | If you are using urxvt you might have to set backspace key to DEC. | ||||
.Sh AUTHORS | .Sh AUTHORS | ||||
@@ -260,7 +260,7 @@ typedef struct { | |||||
uint dircolor : 1; /* Current status of dir color */ | uint dircolor : 1; /* Current status of dir color */ | ||||
uint metaviewer : 1; /* Index of metadata viewer in utils[] */ | uint metaviewer : 1; /* Index of metadata viewer in utils[] */ | ||||
uint ctxactive : 1; /* Context active or not */ | uint ctxactive : 1; /* Context active or not */ | ||||
uint reserved : 10; | |||||
uint reserved : 9; | |||||
/* The following settings are global */ | /* The following settings are global */ | ||||
uint curctx : 2; /* Current context number */ | uint curctx : 2; /* Current context number */ | ||||
uint picker : 1; /* Write selection to user-specified file */ | uint picker : 1; /* Write selection to user-specified file */ | ||||
@@ -269,6 +269,7 @@ typedef struct { | |||||
uint useeditor : 1; /* Use VISUAL to open text files */ | uint useeditor : 1; /* Use VISUAL to open text files */ | ||||
uint runscript : 1; /* Choose script to run mode */ | uint runscript : 1; /* Choose script to run mode */ | ||||
uint runctx : 2; /* The context in which script is to be run */ | uint runctx : 2; /* The context in which script is to be run */ | ||||
uint restrict0b : 1; /* Restrict 0-byte file opening */ | |||||
} settings; | } settings; | ||||
/* Contexts or workspaces */ | /* Contexts or workspaces */ | ||||
@@ -284,7 +285,7 @@ typedef struct { | |||||
/* GLOBALS */ | /* GLOBALS */ | ||||
/* Configuration, contexts */ | /* Configuration, contexts */ | ||||
static settings cfg = {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}; | |||||
static settings cfg = {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | |||||
static context g_ctx[CTX_MAX] __attribute__ ((aligned)); | static context g_ctx[CTX_MAX] __attribute__ ((aligned)); | ||||
static struct entry *dents; | static struct entry *dents; | ||||
@@ -2770,6 +2771,11 @@ nochange: | |||||
continue; | continue; | ||||
} | } | ||||
if (!sb.st_size && cfg.restrict0b) { | |||||
printmsg("empty: use edit or open with"); | |||||
goto nochange; | |||||
} | |||||
/* Invoke desktop opener as last resort */ | /* Invoke desktop opener as last resort */ | ||||
spawn(utils[OPENER], newpath, NULL, NULL, F_NOWAIT | F_NOTRACE); | spawn(utils[OPENER], newpath, NULL, NULL, F_NOWAIT | F_NOTRACE); | ||||
continue; | continue; | ||||
@@ -3775,6 +3781,10 @@ int main(int argc, char *argv[]) | |||||
if (getenv("DISABLE_FILE_OPEN_ON_NAV")) | if (getenv("DISABLE_FILE_OPEN_ON_NAV")) | ||||
cfg.nonavopen = 1; | cfg.nonavopen = 1; | ||||
/* Restrict opening of 0-byte files */ | |||||
if (getenv("NNN_RESTRICT_0B")) | |||||
cfg.restrict0b = 1; | |||||
signal(SIGINT, SIG_IGN); | signal(SIGINT, SIG_IGN); | ||||
signal(SIGQUIT, SIG_IGN); | signal(SIGQUIT, SIG_IGN); | ||||