diff options
-rw-r--r-- | cfg.c | 61 | ||||
-rw-r--r-- | tmux.h | 4 |
2 files changed, 52 insertions, 13 deletions
@@ -67,12 +67,45 @@ set_cfg_file(const char *path) cfg_file = xstrdup(path); } +static char * +expand_cfg_file(const char *path, const char *home) +{ + char *expanded, *name; + const char *end; + struct environ_entry *value; + + if (strncmp(path, "~/", 2) == 0) { + if (home == NULL) + return (NULL); + xasprintf(&expanded, "%s%s", home, path + 1); + return (expanded); + } + + if (*path == '$') { + end = strchr(path, '/'); + if (end == NULL) + name = xstrdup(path + 1); + else + name = xstrndup(path + 1, end - path - 1); + value = environ_find(global_environ, name); + free(name); + if (value == NULL) + return (NULL); + if (end == NULL) + end = ""; + xasprintf(&expanded, "%s%s", value->value, end); + return (expanded); + } + + return (xstrdup(path)); +} + void start_cfg(void) { - const char *home; - int flags = 0; + const char *home = find_home(); struct client *c; + char *path, *copy, *next, *expanded; /* * Configuration files are loaded without a client, so commands are run @@ -90,15 +123,21 @@ start_cfg(void) cmdq_append(c, cfg_item); } - if (cfg_file == NULL) - load_cfg(TMUX_CONF, c, NULL, CMD_PARSE_QUIET, NULL); - - if (cfg_file == NULL && (home = find_home()) != NULL) { - xasprintf(&cfg_file, "%s/.tmux.conf", home); - flags = CMD_PARSE_QUIET; - } - if (cfg_file != NULL) - load_cfg(cfg_file, c, NULL, flags, NULL); + if (cfg_file == NULL) { + path = copy = xstrdup(TMUX_CONF); + while ((next = strsep(&path, ":")) != NULL) { + expanded = expand_cfg_file(next, home); + if (expanded == NULL) { + log_debug("couldn't expand %s", next); + continue; + } + log_debug("expanded %s to %s", next, expanded); + load_cfg(expanded, c, NULL, CMD_PARSE_QUIET, NULL); + free(expanded); + } + free(copy); + } else + load_cfg(cfg_file, c, NULL, 0, NULL); cmdq_append(NULL, cmdq_get_callback(cfg_done, NULL)); } @@ -60,9 +60,9 @@ struct winlink; /* Client-server protocol version. */ #define PROTOCOL_VERSION 8 -/* Default global configuration file. */ +/* Default configuration files. */ #ifndef TMUX_CONF -#define TMUX_CONF "/etc/tmux.conf" +#define TMUX_CONF "/etc/tmux.conf:~/.tmux.conf" #endif /* Minimum layout cell size, NOT including border lines. */ |