mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Support set -a (append) with user options, suggested by Xandor Schiefer.
This commit is contained in:
		@@ -227,10 +227,11 @@ enum cmd_retval
 | 
			
		||||
cmd_set_option_user(struct cmd *self, struct cmd_q *cmdq, const char *optstr,
 | 
			
		||||
    const char *valstr)
 | 
			
		||||
{
 | 
			
		||||
	struct args	*args = self->args;
 | 
			
		||||
	struct session	*s = cmdq->state.tflag.s;
 | 
			
		||||
	struct winlink	*wl = cmdq->state.tflag.wl;
 | 
			
		||||
	struct options	*oo;
 | 
			
		||||
	struct args		*args = self->args;
 | 
			
		||||
	struct session		*s = cmdq->state.tflag.s;
 | 
			
		||||
	struct winlink		*wl = cmdq->state.tflag.wl;
 | 
			
		||||
	struct options		*oo;
 | 
			
		||||
	struct options_entry	*o;
 | 
			
		||||
 | 
			
		||||
	if (args_has(args, 's'))
 | 
			
		||||
		oo = global_options;
 | 
			
		||||
@@ -262,18 +263,22 @@ cmd_set_option_user(struct cmd *self, struct cmd_q *cmdq, const char *optstr,
 | 
			
		||||
		}
 | 
			
		||||
		options_remove(oo, optstr);
 | 
			
		||||
	} else {
 | 
			
		||||
		if (valstr == NULL) {
 | 
			
		||||
			cmdq_error(cmdq, "empty value");
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
		if (args_has(args, 'o') && options_find1(oo, optstr) != NULL) {
 | 
			
		||||
		o = options_find1(oo, optstr);
 | 
			
		||||
		if (args_has(args, 'o') && o != NULL) {
 | 
			
		||||
			if (!args_has(args, 'q')) {
 | 
			
		||||
				cmdq_error(cmdq, "already set: %s", optstr);
 | 
			
		||||
				return (CMD_RETURN_ERROR);
 | 
			
		||||
			}
 | 
			
		||||
			return (CMD_RETURN_NORMAL);
 | 
			
		||||
		}
 | 
			
		||||
		options_set_string(oo, optstr, "%s", valstr);
 | 
			
		||||
		if (valstr == NULL) {
 | 
			
		||||
			cmdq_error(cmdq, "empty value");
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
		if (o != NULL && args_has(args, 'a'))
 | 
			
		||||
			options_set_string(oo, optstr, "%s%s", o->str, valstr);
 | 
			
		||||
		else
 | 
			
		||||
			options_set_string(oo, optstr, "%s", valstr);
 | 
			
		||||
	}
 | 
			
		||||
	return (CMD_RETURN_NORMAL);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -128,19 +128,23 @@ options_set_string(struct options *oo, const char *name, const char *fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	struct options_entry	*o;
 | 
			
		||||
	va_list			 ap;
 | 
			
		||||
	char			*s;
 | 
			
		||||
 | 
			
		||||
	s = NULL;
 | 
			
		||||
	if ((o = options_find1(oo, name)) == NULL) {
 | 
			
		||||
		o = xmalloc(sizeof *o);
 | 
			
		||||
		o->name = xstrdup(name);
 | 
			
		||||
		RB_INSERT(options_tree, &oo->tree, o);
 | 
			
		||||
		memcpy(&o->style, &grid_default_cell, sizeof o->style);
 | 
			
		||||
	} else if (o->type == OPTIONS_STRING)
 | 
			
		||||
		free(o->str);
 | 
			
		||||
		s = o->str;
 | 
			
		||||
 | 
			
		||||
	va_start(ap, fmt);
 | 
			
		||||
	o->type = OPTIONS_STRING;
 | 
			
		||||
	xvasprintf(&o->str, fmt, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
 | 
			
		||||
	free(s);
 | 
			
		||||
	return (o);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user