commit 28ea6e0f3675ec7267ed807478aa89f85350fc76
parent 2a673b4eb15077fe0d4405899cf5b8a14aff78bd
Author: Arun Prakash Jana <engineerarun@gmail.com>
Date: Sat, 10 Dec 2022 20:24:49 +0530
Allow creating a new file on startup
An accessibe parent directory must exist to allow creation
Diffstat:
2 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/nnn.1 b/nnn.1
@@ -29,9 +29,14 @@ subshell spawning and much more. It remains a simple and
efficient file manager that stays out of your way.
.Pp
.Nm
-opens the current working directory by default if
+opens the current working directory if
.Ar PATH
-is not specified.
+is not specified. If the
+.Ar PATH
+doesn't exist,
+.Nm
+will prompt to create a new regular file. If the parent directory
+is specified, it must exist and be accessible.
.Sh KEYBINDS
.Pp
Press
diff --git a/src/nnn.c b/src/nnn.c
@@ -195,6 +195,7 @@
#define LIST_INPUT_MAX ((size_t)LIST_FILES_MAX * PATH_MAX)
#define SCROLLOFF 3
#define COLOR_256 256
+#define CREATE_NEW_KEY 0xFFFFFFFF
/* Time intervals */
#define DBLCLK_INTERVAL_NS (400000000)
@@ -6616,7 +6617,7 @@ static bool browse(char *ipath, const char *session, int pkey)
newpath[0] = runfile[0] = '\0';
- presel = pkey ? ';' : ((cfg.filtermode
+ presel = pkey ? ((pkey == CREATE_NEW_KEY) ? 'n' : ';') : ((cfg.filtermode
|| (session && (g_ctx[cfg.curctx].c_fltr[0] == FILTER
|| g_ctx[cfg.curctx].c_fltr[0] == RFILTER)
&& g_ctx[cfg.curctx].c_fltr[1])) ? FILTER : 0);
@@ -7534,9 +7535,17 @@ nochange:
#endif
break;
case SEL_NEW:
- r = get_input(messages[MSG_NEW_OPTS]);
+ if (!pkey) {
+ r = get_input(messages[MSG_NEW_OPTS]);
+ tmp = NULL;
+ } else {
+ r = 'f';
+ tmp = g_ctx[0].c_name;
+ pkey = '\0';
+ }
+
if (r == 'f' || r == 'd')
- tmp = xreadline(NULL, messages[MSG_NEW_PATH]);
+ tmp = xreadline(tmp, messages[MSG_NEW_PATH]);
else if (r == 's' || r == 'h')
tmp = xreadline(nselected == 1 ? xbasename(pselbuf) : NULL,
messages[nselected <= 1?MSG_NEW_PATH:MSG_LINK_PREFIX]);
@@ -8583,11 +8592,17 @@ int main(int argc, char *argv[])
struct stat sb;
if (stat(initpath, &sb) == -1) {
- xerror();
- return EXIT_FAILURE;
- }
-
- if (!S_ISDIR(sb.st_mode))
+ arg = xbasename(initpath);
+ if (arg != initpath) { /* We have a directory */
+ if (!xdiraccess(xdirname(initpath))) {
+ xerror(); /* Fail non-existent/inaccessible directory */
+ return EXIT_FAILURE;
+ }
+ *--arg = '/'; /* Restore the complete path */
+ }
+ pkey = CREATE_NEW_KEY; /* Override plugin key */
+ g_state.initfile = 1;
+ } else if (!S_ISDIR(sb.st_mode))
g_state.initfile = 1;
if (session)