mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 01:34:18 +00:00 
			
		
		
		
	Add %if/%endif for conditionals when parsing configuration files, the
argument is a format (the new == and != are useful).
This commit is contained in:
		
							
								
								
									
										44
									
								
								cfg.c
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								cfg.c
									
									
									
									
									
								
							@@ -82,12 +82,14 @@ int
 | 
				
			|||||||
load_cfg(const char *path, struct client *c, struct cmdq_item *item, int quiet)
 | 
					load_cfg(const char *path, struct client *c, struct cmdq_item *item, int quiet)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	FILE			*f;
 | 
						FILE			*f;
 | 
				
			||||||
	char			 delim[3] = { '\\', '\\', '\0' };
 | 
						const char		 delim[3] = { '\\', '\\', '\0' };
 | 
				
			||||||
	u_int			 found;
 | 
						u_int			 found = 0;
 | 
				
			||||||
	size_t			 line = 0;
 | 
						size_t			 line = 0;
 | 
				
			||||||
	char			*buf, *cause1, *p;
 | 
						char			*buf, *cause1, *p, *q, *s;
 | 
				
			||||||
	struct cmd_list		*cmdlist;
 | 
						struct cmd_list		*cmdlist;
 | 
				
			||||||
	struct cmdq_item	*new_item;
 | 
						struct cmdq_item	*new_item;
 | 
				
			||||||
 | 
						int			 condition = 0;
 | 
				
			||||||
 | 
						struct format_tree	*ft;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log_debug("loading %s", path);
 | 
						log_debug("loading %s", path);
 | 
				
			||||||
	if ((f = fopen(path, "rb")) == NULL) {
 | 
						if ((f = fopen(path, "rb")) == NULL) {
 | 
				
			||||||
@@ -97,20 +99,48 @@ load_cfg(const char *path, struct client *c, struct cmdq_item *item, int quiet)
 | 
				
			|||||||
		return (-1);
 | 
							return (-1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	found = 0;
 | 
					 | 
				
			||||||
	while ((buf = fparseln(f, NULL, &line, delim, 0)) != NULL) {
 | 
						while ((buf = fparseln(f, NULL, &line, delim, 0)) != NULL) {
 | 
				
			||||||
		log_debug("%s: %s", path, buf);
 | 
							log_debug("%s: %s", path, buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Skip empty lines. */
 | 
					 | 
				
			||||||
		p = buf;
 | 
							p = buf;
 | 
				
			||||||
		while (isspace((u_char) *p))
 | 
							while (isspace((u_char)*p))
 | 
				
			||||||
			p++;
 | 
								p++;
 | 
				
			||||||
		if (*p == '\0') {
 | 
							if (*p == '\0') {
 | 
				
			||||||
			free(buf);
 | 
								free(buf);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							q = p + strlen(p) - 1;
 | 
				
			||||||
 | 
							while (q != p && isspace((u_char)*q))
 | 
				
			||||||
 | 
								*q-- = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (condition != 0 && strcmp(p, "%endif") == 0) {
 | 
				
			||||||
 | 
								condition = 0;
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (strncmp(p, "%if ", 4) == 0) {
 | 
				
			||||||
 | 
								if (condition != 0) {
 | 
				
			||||||
 | 
									cfg_add_cause("%s:%zu: nested %%if", path,
 | 
				
			||||||
 | 
									    line);
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ft = format_create(NULL, FORMAT_NOJOBS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								s = p + 3;
 | 
				
			||||||
 | 
								while (isspace((u_char)*s))
 | 
				
			||||||
 | 
									s++;
 | 
				
			||||||
 | 
								s = format_expand(ft, s);
 | 
				
			||||||
 | 
								if (*s != '\0' && (s[0] != '0' || s[1] != '\0'))
 | 
				
			||||||
 | 
									condition = 1;
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									condition = -1;
 | 
				
			||||||
 | 
								free(s);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								format_free(ft);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (condition == -1)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Parse and run the command. */
 | 
					 | 
				
			||||||
		if (cmd_string_parse(p, &cmdlist, path, line, &cause1) != 0) {
 | 
							if (cmd_string_parse(p, &cmdlist, path, line, &cause1) != 0) {
 | 
				
			||||||
			free(buf);
 | 
								free(buf);
 | 
				
			||||||
			if (cause1 == NULL)
 | 
								if (cause1 == NULL)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								tmux.1
									
									
									
									
									
								
							@@ -930,6 +930,30 @@ If
 | 
				
			|||||||
is given, no error will be returned if
 | 
					is given, no error will be returned if
 | 
				
			||||||
.Ar path
 | 
					.Ar path
 | 
				
			||||||
does not exist.
 | 
					does not exist.
 | 
				
			||||||
 | 
					.Pp
 | 
				
			||||||
 | 
					Within a configuration file, commands may be made conditional by surrounding
 | 
				
			||||||
 | 
					them with
 | 
				
			||||||
 | 
					.Em %if
 | 
				
			||||||
 | 
					and
 | 
				
			||||||
 | 
					.Em %endif
 | 
				
			||||||
 | 
					lines.
 | 
				
			||||||
 | 
					The argument to
 | 
				
			||||||
 | 
					.Em %if
 | 
				
			||||||
 | 
					is expanded as a format and if it evaluates to false
 | 
				
			||||||
 | 
					.Ns ( Ql 0
 | 
				
			||||||
 | 
					or empty), subsequent lines are ignored until
 | 
				
			||||||
 | 
					.Em %endif .
 | 
				
			||||||
 | 
					For example:
 | 
				
			||||||
 | 
					.Bd -literal -offset indent
 | 
				
			||||||
 | 
					%if #{==:#{host},myhost}
 | 
				
			||||||
 | 
					set -g status-style bg=red
 | 
				
			||||||
 | 
					%endif
 | 
				
			||||||
 | 
					.Ed
 | 
				
			||||||
 | 
					.Pp
 | 
				
			||||||
 | 
					Will change the status line to red if running on
 | 
				
			||||||
 | 
					.Ql myhost .
 | 
				
			||||||
 | 
					.Em %if
 | 
				
			||||||
 | 
					may not be nested.
 | 
				
			||||||
.It Ic start-server
 | 
					.It Ic start-server
 | 
				
			||||||
.D1 (alias: Ic start )
 | 
					.D1 (alias: Ic start )
 | 
				
			||||||
Start the
 | 
					Start the
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user