]> Sergey Matveev's repositories - nnn.git/commitdiff
Allow creating a new file on startup
authorArun Prakash Jana <engineerarun@gmail.com>
Sat, 10 Dec 2022 14:54:49 +0000 (20:24 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sat, 10 Dec 2022 16:09:36 +0000 (21:39 +0530)
An accessibe parent directory must exist to allow creation

nnn.1
src/nnn.c

diff --git a/nnn.1 b/nnn.1
index 734ce22e1e4feaa06fa938978c30f150626e1a60..2588b628fff45c7b5f8bc4b80d03b065534b71a2 100644 (file)
--- 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
index f5a170de535c3ffece7b489ffddadcd1792454b5..94115b1fc55bc22b766887492d04bc2d32e02896 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
 #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)