Add %if/%endif for conditionals when parsing configuration files, the

argument is a format (the new == and != are useful).
This commit is contained in:
nicm 2017-01-09 21:28:56 +00:00
parent 844f2eacf4
commit d2d984647e
2 changed files with 61 additions and 7 deletions

44
cfg.c
View File

@ -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
View File

@ -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