mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Make TMUX_CONF a list of files and expand leading $FOO or ~.
This commit is contained in:
		
							
								
								
									
										61
									
								
								cfg.c
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								cfg.c
									
									
									
									
									
								
							@@ -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));
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user