diff options
Diffstat (limited to 'src/nnn.c')
| -rw-r--r-- | src/nnn.c | 54 |
1 files changed, 42 insertions, 12 deletions
@@ -4301,47 +4301,77 @@ static void usage(void) 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 */ |