mirror of
https://github.com/tmux/tmux.git
synced 2025-01-08 08:58:47 +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:
parent
f35f15b107
commit
45203582ff
26
cmd-parse.y
26
cmd-parse.y
@ -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
4
tmux.1
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user