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:
nicm 2019-06-14 12:04:11 +00:00
parent f35f15b107
commit 45203582ff
2 changed files with 22 additions and 8 deletions

View File

@ -59,6 +59,7 @@ struct cmd_parse_state {
size_t len; size_t len;
size_t off; size_t off;
int condition;
int eol; int eol;
int eof; int eof;
struct cmd_parse_input *input; struct cmd_parse_input *input;
@ -104,7 +105,7 @@ static void cmd_parse_print_commands(struct cmd_parse_input *, u_int,
%token ENDIF %token ENDIF
%token <token> FORMAT TOKEN EQUALS %token <token> FORMAT TOKEN EQUALS
%type <token> argument expanded %type <token> argument expanded format
%type <arguments> arguments %type <arguments> arguments
%type <flag> if_open if_elif %type <flag> if_open if_elif
%type <elif> elif elif1 %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_state *ps = &parse_state;
struct cmd_parse_input *pi = ps->input; struct cmd_parse_input *pi = ps->input;
@ -967,12 +977,15 @@ yylex(void)
{ {
struct cmd_parse_state *ps = &parse_state; struct cmd_parse_state *ps = &parse_state;
char *token, *cp; char *token, *cp;
int ch, next; int ch, next, condition;
if (ps->eol) if (ps->eol)
ps->input->line++; ps->input->line++;
ps->eol = 0; ps->eol = 0;
condition = ps->condition;
ps->condition = 0;
for (;;) { for (;;) {
ch = yylex_getc(); ch = yylex_getc();
@ -1012,11 +1025,11 @@ yylex(void)
if (ch == '#') { if (ch == '#') {
/* /*
* #{ opens a format; anything else is a comment, * #{ after a condition opens a format; anything else
* ignore up to the end of the line. * is a comment, ignore up to the end of the line.
*/ */
next = yylex_getc(); next = yylex_getc();
if (next == '{') { if (condition && next == '{') {
yylval.token = yylex_format(); yylval.token = yylex_format();
if (yylval.token == NULL) if (yylval.token == NULL)
return (ERROR); return (ERROR);
@ -1043,6 +1056,7 @@ yylex(void)
} }
if (*cp == '\0') if (*cp == '\0')
return (TOKEN); return (TOKEN);
ps->condition = 1;
if (strcmp(yylval.token, "%if") == 0) { if (strcmp(yylval.token, "%if") == 0) {
free(yylval.token); free(yylval.token);
return (IF); return (IF);

4
tmux.1
View File

@ -582,9 +582,9 @@ or
.Ql %endif . .Ql %endif .
For example: For example:
.Bd -literal -offset indent .Bd -literal -offset indent
%if #{==:#{host},myhost} %if "#{==:#{host},myhost}"
set -g status-style bg=red set -g status-style bg=red
%elif #{==:#{host},myotherhost} %elif "#{==:#{host},myotherhost}"
set -g status-style bg=green set -g status-style bg=green
%else %else
set -g status-style bg=blue set -g status-style bg=blue