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) | ||||
| { | ||||
| 	FILE			*f; | ||||
| 	char			 delim[3] = { '\\', '\\', '\0' }; | ||||
| 	u_int			 found; | ||||
| 	const char		 delim[3] = { '\\', '\\', '\0' }; | ||||
| 	u_int			 found = 0; | ||||
| 	size_t			 line = 0; | ||||
| 	char			*buf, *cause1, *p; | ||||
| 	char			*buf, *cause1, *p, *q, *s; | ||||
| 	struct cmd_list		*cmdlist; | ||||
| 	struct cmdq_item	*new_item; | ||||
| 	int			 condition = 0; | ||||
| 	struct format_tree	*ft; | ||||
|  | ||||
| 	log_debug("loading %s", path); | ||||
| 	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); | ||||
| 	} | ||||
|  | ||||
| 	found = 0; | ||||
| 	while ((buf = fparseln(f, NULL, &line, delim, 0)) != NULL) { | ||||
| 		log_debug("%s: %s", path, buf); | ||||
|  | ||||
| 		/* Skip empty lines. */ | ||||
| 		p = buf; | ||||
| 		while (isspace((u_char) *p)) | ||||
| 		while (isspace((u_char)*p)) | ||||
| 			p++; | ||||
| 		if (*p == '\0') { | ||||
| 			free(buf); | ||||
| 			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) { | ||||
| 			free(buf); | ||||
| 			if (cause1 == NULL) | ||||
|   | ||||
							
								
								
									
										24
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								tmux.1
									
									
									
									
									
								
							| @@ -930,6 +930,30 @@ If | ||||
| is given, no error will be returned if | ||||
| .Ar path | ||||
| 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 | ||||
| .D1 (alias: Ic start ) | ||||
| Start the | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 nicm
					nicm