mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	A couple of minor parser changes around conditions: 1) only treat #{
specially after a condition, otherwise as a comment (which is more as most people expect) 2) allow formats to be quoted after a condition.
This commit is contained in:
		
							
								
								
									
										26
									
								
								cmd-parse.y
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								cmd-parse.y
									
									
									
									
									
								
							@@ -59,6 +59,7 @@ struct cmd_parse_state {
 | 
			
		||||
	size_t				 len;
 | 
			
		||||
	size_t				 off;
 | 
			
		||||
 | 
			
		||||
	int				 condition;
 | 
			
		||||
	int				 eol;
 | 
			
		||||
	int				 eof;
 | 
			
		||||
	struct cmd_parse_input		*input;
 | 
			
		||||
@@ -104,7 +105,7 @@ static void	 cmd_parse_print_commands(struct cmd_parse_input *, u_int,
 | 
			
		||||
%token ENDIF
 | 
			
		||||
%token <token> FORMAT TOKEN EQUALS
 | 
			
		||||
 | 
			
		||||
%type <token> argument expanded
 | 
			
		||||
%type <token> argument expanded format
 | 
			
		||||
%type <arguments> arguments
 | 
			
		||||
%type <flag> if_open if_elif
 | 
			
		||||
%type <elif> elif elif1
 | 
			
		||||
@@ -160,7 +161,16 @@ statement	: condition
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
expanded	: FORMAT
 | 
			
		||||
format		: FORMAT
 | 
			
		||||
		{
 | 
			
		||||
			$$ = $1;
 | 
			
		||||
		}
 | 
			
		||||
		| TOKEN
 | 
			
		||||
		{
 | 
			
		||||
			$$ = $1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
expanded	: format
 | 
			
		||||
		{
 | 
			
		||||
			struct cmd_parse_state	*ps = &parse_state;
 | 
			
		||||
			struct cmd_parse_input	*pi = ps->input;
 | 
			
		||||
@@ -967,12 +977,15 @@ yylex(void)
 | 
			
		||||
{
 | 
			
		||||
	struct cmd_parse_state	*ps = &parse_state;
 | 
			
		||||
	char			*token, *cp;
 | 
			
		||||
	int			 ch, next;
 | 
			
		||||
	int			 ch, next, condition;
 | 
			
		||||
 | 
			
		||||
	if (ps->eol)
 | 
			
		||||
		ps->input->line++;
 | 
			
		||||
	ps->eol = 0;
 | 
			
		||||
 | 
			
		||||
	condition = ps->condition;
 | 
			
		||||
	ps->condition = 0;
 | 
			
		||||
 | 
			
		||||
	for (;;) {
 | 
			
		||||
		ch = yylex_getc();
 | 
			
		||||
 | 
			
		||||
@@ -1012,11 +1025,11 @@ yylex(void)
 | 
			
		||||
 | 
			
		||||
		if (ch == '#') {
 | 
			
		||||
			/*
 | 
			
		||||
			 * #{ opens a format; anything else is a comment,
 | 
			
		||||
			 * ignore up to the end of the line.
 | 
			
		||||
			 * #{ after a condition opens a format; anything else
 | 
			
		||||
			 * is a comment, ignore up to the end of the line.
 | 
			
		||||
			 */
 | 
			
		||||
			next = yylex_getc();
 | 
			
		||||
			if (next == '{') {
 | 
			
		||||
			if (condition && next == '{') {
 | 
			
		||||
				yylval.token = yylex_format();
 | 
			
		||||
				if (yylval.token == NULL)
 | 
			
		||||
					return (ERROR);
 | 
			
		||||
@@ -1043,6 +1056,7 @@ yylex(void)
 | 
			
		||||
			}
 | 
			
		||||
			if (*cp == '\0')
 | 
			
		||||
				return (TOKEN);
 | 
			
		||||
			ps->condition = 1;
 | 
			
		||||
			if (strcmp(yylval.token, "%if") == 0) {
 | 
			
		||||
				free(yylval.token);
 | 
			
		||||
				return (IF);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								tmux.1
									
									
									
									
									
								
							@@ -582,9 +582,9 @@ or
 | 
			
		||||
.Ql %endif .
 | 
			
		||||
For example:
 | 
			
		||||
.Bd -literal -offset indent
 | 
			
		||||
%if #{==:#{host},myhost}
 | 
			
		||||
%if "#{==:#{host},myhost}"
 | 
			
		||||
set -g status-style bg=red
 | 
			
		||||
%elif #{==:#{host},myotherhost}
 | 
			
		||||
%elif "#{==:#{host},myotherhost}"
 | 
			
		||||
set -g status-style bg=green
 | 
			
		||||
%else
 | 
			
		||||
set -g status-style bg=blue
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user