mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:07:38 +00:00 
			
		
		
		
	Add a choose-client command and extend choose-{session,window} to accept a
template. After a choice is made, %% (or %1) in the template is replaced by the name of the session, window or client suitable for -t and the result executed as a command. So, for example, "choose-window "killw -t '%%'"" will kill the selected window. The defaults if no template is given are (as now) select-window for choose-window, switch-client for choose-session, and detach-client for choose-client (now bound to D).
This commit is contained in:
		
							
								
								
									
										42
									
								
								cmd.c
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								cmd.c
									
									
									
									
									
								
							@@ -31,6 +31,7 @@ const struct cmd_entry *cmd_table[] = {
 | 
			
		||||
	&cmd_attach_session_entry,
 | 
			
		||||
	&cmd_bind_key_entry,
 | 
			
		||||
	&cmd_break_pane_entry,
 | 
			
		||||
	&cmd_choose_client_entry,
 | 
			
		||||
	&cmd_choose_session_entry,
 | 
			
		||||
	&cmd_choose_window_entry,
 | 
			
		||||
	&cmd_clear_history_entry,
 | 
			
		||||
@@ -858,3 +859,44 @@ error:
 | 
			
		||||
	xfree(winptr);
 | 
			
		||||
	return (NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Replace the first %% or %idx in template by s. */
 | 
			
		||||
char *
 | 
			
		||||
cmd_template_replace(char *template, const char *s, int idx)
 | 
			
		||||
{
 | 
			
		||||
	char	 ch;
 | 
			
		||||
	char	*buf, *ptr;
 | 
			
		||||
	int	 replaced;
 | 
			
		||||
	size_t	 len;
 | 
			
		||||
 | 
			
		||||
	if (strstr(template, "%") == NULL)
 | 
			
		||||
		return (xstrdup(template));
 | 
			
		||||
 | 
			
		||||
	buf = xmalloc(1);
 | 
			
		||||
	*buf = '\0';
 | 
			
		||||
	len = 0;
 | 
			
		||||
	replaced = 0;
 | 
			
		||||
 | 
			
		||||
	ptr = template;
 | 
			
		||||
	while (*ptr != '\0') {
 | 
			
		||||
		switch (ch = *ptr++) {
 | 
			
		||||
		case '%':
 | 
			
		||||
			if (*ptr < '1' || *ptr > '9' || *ptr - '0' != idx) {
 | 
			
		||||
				if (*ptr != '%' || replaced)
 | 
			
		||||
					break;
 | 
			
		||||
				replaced = 1;
 | 
			
		||||
			}
 | 
			
		||||
			ptr++;
 | 
			
		||||
 | 
			
		||||
			len += strlen(s);
 | 
			
		||||
			buf = xrealloc(buf, 1, len + 1);
 | 
			
		||||
			strlcat(buf, s, len + 1);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		buf = xrealloc(buf, 1, len + 2);
 | 
			
		||||
		buf[len++] = ch;
 | 
			
		||||
		buf[len] = '\0';
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (buf);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user