mirror of
https://github.com/tmux/tmux.git
synced 2025-09-08 04:18:19 +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)
|
load_cfg(const char *path, struct client *c, struct cmdq_item *item, int quiet)
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
char delim[3] = { '\\', '\\', '\0' };
|
const char delim[3] = { '\\', '\\', '\0' };
|
||||||
u_int found;
|
u_int found = 0;
|
||||||
size_t line = 0;
|
size_t line = 0;
|
||||||
char *buf, *cause1, *p;
|
char *buf, *cause1, *p, *q, *s;
|
||||||
struct cmd_list *cmdlist;
|
struct cmd_list *cmdlist;
|
||||||
struct cmdq_item *new_item;
|
struct cmdq_item *new_item;
|
||||||
|
int condition = 0;
|
||||||
|
struct format_tree *ft;
|
||||||
|
|
||||||
log_debug("loading %s", path);
|
log_debug("loading %s", path);
|
||||||
if ((f = fopen(path, "rb")) == NULL) {
|
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);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
found = 0;
|
|
||||||
while ((buf = fparseln(f, NULL, &line, delim, 0)) != NULL) {
|
while ((buf = fparseln(f, NULL, &line, delim, 0)) != NULL) {
|
||||||
log_debug("%s: %s", path, buf);
|
log_debug("%s: %s", path, buf);
|
||||||
|
|
||||||
/* Skip empty lines. */
|
|
||||||
p = buf;
|
p = buf;
|
||||||
while (isspace((u_char) *p))
|
while (isspace((u_char)*p))
|
||||||
p++;
|
p++;
|
||||||
if (*p == '\0') {
|
if (*p == '\0') {
|
||||||
free(buf);
|
free(buf);
|
||||||
continue;
|
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) {
|
if (cmd_string_parse(p, &cmdlist, path, line, &cause1) != 0) {
|
||||||
free(buf);
|
free(buf);
|
||||||
if (cause1 == NULL)
|
if (cause1 == NULL)
|
||||||
|
24
tmux.1
24
tmux.1
@@ -930,6 +930,30 @@ If
|
|||||||
is given, no error will be returned if
|
is given, no error will be returned if
|
||||||
.Ar path
|
.Ar path
|
||||||
does not exist.
|
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
|
.It Ic start-server
|
||||||
.D1 (alias: Ic start )
|
.D1 (alias: Ic start )
|
||||||
Start the
|
Start the
|
||||||
|
Reference in New Issue
Block a user