mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +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
	 nicm
					nicm