# The default behaviour is to cd on quit (nnn checks if NNN_TMPFILE is set)
# To cd on quit only on ^G, remove the "export" as in:
# NNN_TMPFILE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.lastd"
- # NOTE: NNN_TMPFILE is fixed, should not be modified
export NNN_TMPFILE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.lastd"
# Unmask ^Q (, ^V etc.) (if required, see `stty -a`) to Quit nnn
home[homelen] = '\0';
}
+static void convert_tilde(const char *path, char *buf)
+{
+ if (path[0] == '~') {
+ ssize_t len = xstrlen(home);
+ ssize_t loclen = xstrlen(path);
+
+ xstrsncpy(buf, home, len + 1);
+ xstrsncpy(buf + len, path + 1, loclen);
+ }
+}
+
static int create_tmp_file(void)
{
xstrsncpy(g_tmpfpath + tmpfplen - 1, messages[STR_TMPFILE], TMP_LEN_MAX - tmpfplen);
free(buf);
}
-static bool write_lastdir(const char *curpath)
+static void write_lastdir(const char *curpath, const char *outfile)
{
- bool ret = FALSE;
- size_t len = xstrlen(cfgpath);
-
- xstrsncpy(cfgpath + len, "/.lastd", 8);
+ if (!outfile)
+ xstrsncpy(cfgpath + xstrlen(cfgpath), "/.lastd", 8);
+ else
+ convert_tilde(outfile, g_buf);
- int fd = open(cfgpath, O_CREAT | O_WRONLY | O_TRUNC, 0666);
+ int fd = open(outfile
+ ? (outfile[0] == '~' ? g_buf : outfile)
+ : cfgpath, O_CREAT | O_WRONLY | O_TRUNC, 0666);
if (fd != -1) {
dprintf(fd, "cd \"%s\"", curpath);
close(fd);
- ret = TRUE;
}
- return ret;
}
/*
return pluginstr + kvarr[r].off;
val = bmstr + kvarr[r].off;
-
- if (val[0] == '~') {
- ssize_t len = xstrlen(home);
- ssize_t loclen = xstrlen(val);
-
- xstrsncpy(g_buf, home, len + 1);
- xstrsncpy(g_buf + len, val + 1, loclen);
- }
-
+ convert_tilde(val, g_buf);
return realpath(((val[0] == '~') ? g_buf : val), buf);
}
}
#endif
/* CD on Quit */
- if ((sel == SEL_QUITCD) || getenv("NNN_TMPFILE")) {
- write_lastdir(path);
+ tmp = getenv("NNN_TMPFILE");
+ if ((sel == SEL_QUITCD) || tmp) {
+ write_lastdir(path, tmp);
+ /* ^G is a way to quit picker mode without picking anything */
if ((sel == SEL_QUITCD) && g_state.picker)
selbufpos = 0;
}