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
#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)
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);
#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]);
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)