static bool setup_config(void)
{
size_t r, len;
+ char *xdgcfg = getenv("XDG_CONFIG_HOME");
+ bool xdg = FALSE;
/* Set up configuration file paths */
- len = strlen(home) + 1 + 20; /* add length of "/.config/nnn/plugins" */
+ if (xdgcfg && xdgcfg[0]) {
+ DPRINTF_S(xdgcfg);
+ if (xdgcfg[0] == '~') {
+ r = xstrlcpy(g_buf, home, PATH_MAX);
+ xstrlcpy(g_buf + r - 1, xdgcfg + 1, PATH_MAX);
+ xdgcfg = g_buf;
+ DPRINTF_S(xdgcfg);
+ }
+
+ if (!xdiraccess(xdgcfg)) {
+ xerror();
+ return FALSE;
+ }
+
+ len = strlen(xdgcfg) + 1 + 12; /* add length of "/nnn/plugins" */
+ xdg = TRUE;
+ }
+
+ if (!xdg)
+ len = strlen(home) + 1 + 20; /* add length of "/.config/nnn/plugins" */
+
cfgdir = (char *)malloc(len);
plugindir = (char *)malloc(len);
if (!cfgdir || !plugindir) {
xerror();
return FALSE;
}
- r = xstrlcpy(cfgdir, home, len);
- /* Create ~/.config */
- xstrlcpy(cfgdir + r - 1, "/.config", len - r);
- DPRINTF_S(cfgdir);
- if (!create_dir(cfgdir)) {
- xerror();
- return FALSE;
+ if (xdg) {
+ xstrlcpy(cfgdir, xdgcfg, len);
+ r = len - 12;
+ } else {
+ r = xstrlcpy(cfgdir, home, len);
+
+ /* Create ~/.config */
+ xstrlcpy(cfgdir + r - 1, "/.config", len - r);
+ DPRINTF_S(cfgdir);
+ if (!create_dir(cfgdir)) {
+ xerror();
+ return FALSE;
+ }
+
+ r += 8; /* length of "/.config" */
}
/* Create ~/.config/nnn */
- xstrlcpy(cfgdir + r - 1, "/.config/nnn", len - r);
+ xstrlcpy(cfgdir + r - 1, "/nnn", len - r);
DPRINTF_S(cfgdir);
if (!create_dir(cfgdir)) {
xerror();
return FALSE;
}
- xstrlcpy(cfgdir + r + 12 - 1, "/plugins", 9);
+ /* Create ~/.config/nnn/plugins */
+ xstrlcpy(cfgdir + r + 4 - 1, "/plugins", 9);
DPRINTF_S(cfgdir);
xstrlcpy(plugindir, cfgdir, len);
DPRINTF_S(plugindir);
- /* Create ~/.config/nnn/plugins */
if (!create_dir(cfgdir)) {
xerror();
return FALSE;
}
/* Reset to config path */
- cfgdir[r + 11] = '\0';
+ cfgdir[r + 3] = '\0';
DPRINTF_S(cfgdir);
/* Set selection file path */