mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 01:34:18 +00:00 
			
		
		
		
	Add option command-prefix which is automatically prepended to any command
(apart from a naked default-shell). The default is "exec ".
This commit is contained in:
		@@ -58,8 +58,8 @@ cmd_split_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
				
			|||||||
	struct window		*w;
 | 
						struct window		*w;
 | 
				
			||||||
	struct window_pane	*wp, *new_wp = NULL;
 | 
						struct window_pane	*wp, *new_wp = NULL;
 | 
				
			||||||
	struct environ		 env;
 | 
						struct environ		 env;
 | 
				
			||||||
	const char		*cmd, *cwd, *shell;
 | 
						const char		*cmd, *cwd, *shell, *prefix;
 | 
				
			||||||
	char			*cause, *new_cause;
 | 
						char			*cause, *new_cause, *cmd1;
 | 
				
			||||||
	u_int			 hlimit;
 | 
						u_int			 hlimit;
 | 
				
			||||||
	int			 size, percentage;
 | 
						int			 size, percentage;
 | 
				
			||||||
	enum layout_type	 type;
 | 
						enum layout_type	 type;
 | 
				
			||||||
@@ -121,9 +121,18 @@ cmd_split_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
				
			|||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	new_wp = window_add_pane(w, hlimit);
 | 
						new_wp = window_add_pane(w, hlimit);
 | 
				
			||||||
	if (window_pane_spawn(
 | 
					
 | 
				
			||||||
	    new_wp, cmd, shell, cwd, &env, s->tio, &cause) != 0)
 | 
						if (*cmd != '\0') {
 | 
				
			||||||
 | 
							prefix = options_get_string(&w->options, "command-prefix");
 | 
				
			||||||
 | 
							xasprintf(&cmd1, "%s%s", prefix, cmd);
 | 
				
			||||||
 | 
						} else
 | 
				
			||||||
 | 
							cmd1 = xstrdup("");
 | 
				
			||||||
 | 
						if (window_pane_spawn(new_wp, cmd1, shell, cwd, &env, s->tio,
 | 
				
			||||||
 | 
						    &cause) != 0) {
 | 
				
			||||||
 | 
							free(cmd1);
 | 
				
			||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						free(cmd1);
 | 
				
			||||||
	layout_assign_pane(lc, new_wp);
 | 
						layout_assign_pane(lc, new_wp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	server_redraw_window(w);
 | 
						server_redraw_window(w);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								names.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								names.c
									
									
									
									
									
								
							@@ -26,8 +26,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "tmux.h"
 | 
					#include "tmux.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void	 window_name_callback(unused int, unused short, void *);
 | 
					void	 window_name_callback(int, short, void *);
 | 
				
			||||||
char	*parse_window_name(const char *);
 | 
					char	*parse_window_name(struct window *, const char *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
queue_window_name(struct window *w)
 | 
					queue_window_name(struct window *w)
 | 
				
			||||||
@@ -73,9 +73,9 @@ window_name_callback(unused int fd, unused short events, void *data)
 | 
				
			|||||||
		 */
 | 
							 */
 | 
				
			||||||
		if (w->active->cmd != NULL && *w->active->cmd == '\0' &&
 | 
							if (w->active->cmd != NULL && *w->active->cmd == '\0' &&
 | 
				
			||||||
		    name != NULL && name[0] == '-' && name[1] != '\0')
 | 
							    name != NULL && name[0] == '-' && name[1] != '\0')
 | 
				
			||||||
			wname = parse_window_name(name + 1);
 | 
								wname = parse_window_name(w, name + 1);
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			wname = parse_window_name(name);
 | 
								wname = parse_window_name(w, name);
 | 
				
			||||||
		free(name);
 | 
							free(name);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -98,18 +98,22 @@ default_window_name(struct window *w)
 | 
				
			|||||||
	if (w->active->screen != &w->active->base)
 | 
						if (w->active->screen != &w->active->base)
 | 
				
			||||||
		return (xstrdup("[tmux]"));
 | 
							return (xstrdup("[tmux]"));
 | 
				
			||||||
	if (w->active->cmd != NULL && *w->active->cmd != '\0')
 | 
						if (w->active->cmd != NULL && *w->active->cmd != '\0')
 | 
				
			||||||
		return (parse_window_name(w->active->cmd));
 | 
							return (parse_window_name(w, w->active->cmd));
 | 
				
			||||||
	return (parse_window_name(w->active->shell));
 | 
						return (parse_window_name(w, w->active->shell));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char *
 | 
					char *
 | 
				
			||||||
parse_window_name(const char *in)
 | 
					parse_window_name(struct window *w, const char *in)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char	*copy, *name, *ptr;
 | 
						char	*copy, *name, *ptr, *prefix;
 | 
				
			||||||
 | 
						size_t	 prefixlen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						prefix = options_get_string(&w->options, "command-prefix");
 | 
				
			||||||
 | 
						prefixlen = strlen(prefix);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	name = copy = xstrdup(in);
 | 
						name = copy = xstrdup(in);
 | 
				
			||||||
	if (strncmp(name, "exec ", (sizeof "exec ") - 1) == 0)
 | 
						if (strncmp(name, prefix, prefixlen) == 0)
 | 
				
			||||||
		name = name + (sizeof "exec ") - 1;
 | 
							name = name + prefixlen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (*name == ' ')
 | 
						while (*name == ' ')
 | 
				
			||||||
		name++;
 | 
							name++;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -476,7 +476,6 @@ const struct options_table_entry window_options_table[] = {
 | 
				
			|||||||
	  .default_num = 1
 | 
						  .default_num = 1
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	{ .name = "c0-change-trigger",
 | 
						{ .name = "c0-change-trigger",
 | 
				
			||||||
	  .type = OPTIONS_TABLE_NUMBER,
 | 
						  .type = OPTIONS_TABLE_NUMBER,
 | 
				
			||||||
	  .default_num = 250,
 | 
						  .default_num = 250,
 | 
				
			||||||
@@ -502,6 +501,11 @@ const struct options_table_entry window_options_table[] = {
 | 
				
			|||||||
	  .default_num = 1
 | 
						  .default_num = 1
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{ .name = "command-prefix",
 | 
				
			||||||
 | 
						  .type = OPTIONS_TABLE_STRING,
 | 
				
			||||||
 | 
						  .default_str = "exec "
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	{ .name = "force-height",
 | 
						{ .name = "force-height",
 | 
				
			||||||
	  .type = OPTIONS_TABLE_NUMBER,
 | 
						  .type = OPTIONS_TABLE_NUMBER,
 | 
				
			||||||
	  .minimum = 0,
 | 
						  .minimum = 0,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								tmux.1
									
									
									
									
									
								
							@@ -2708,6 +2708,13 @@ Set clock colour.
 | 
				
			|||||||
.Xc
 | 
					.Xc
 | 
				
			||||||
Set clock hour format.
 | 
					Set clock hour format.
 | 
				
			||||||
.Pp
 | 
					.Pp
 | 
				
			||||||
 | 
					.It Ic command-prefix Ar string
 | 
				
			||||||
 | 
					String prefixed to commands (apart from a plain shell as set by the
 | 
				
			||||||
 | 
					.Ic default-shell
 | 
				
			||||||
 | 
					option).
 | 
				
			||||||
 | 
					The default is
 | 
				
			||||||
 | 
					.Ql "exec\ " .
 | 
				
			||||||
 | 
					.Pp
 | 
				
			||||||
.It Ic force-height Ar height
 | 
					.It Ic force-height Ar height
 | 
				
			||||||
.It Ic force-width Ar width
 | 
					.It Ic force-width Ar width
 | 
				
			||||||
Prevent
 | 
					Prevent
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										18
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								window.c
									
									
									
									
									
								
							@@ -307,24 +307,36 @@ window_create1(u_int sx, u_int sy)
 | 
				
			|||||||
struct window *
 | 
					struct window *
 | 
				
			||||||
window_create(const char *name, const char *cmd, const char *shell,
 | 
					window_create(const char *name, const char *cmd, const char *shell,
 | 
				
			||||||
    const char *cwd, struct environ *env, struct termios *tio,
 | 
					    const char *cwd, struct environ *env, struct termios *tio,
 | 
				
			||||||
    u_int sx, u_int sy, u_int hlimit,char **cause)
 | 
					    u_int sx, u_int sy, u_int hlimit, char **cause)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct window		*w;
 | 
						struct window		*w;
 | 
				
			||||||
	struct window_pane	*wp;
 | 
						struct window_pane	*wp;
 | 
				
			||||||
 | 
						const char		*prefix;
 | 
				
			||||||
 | 
						char			*cmd1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	w = window_create1(sx, sy);
 | 
						w = window_create1(sx, sy);
 | 
				
			||||||
	wp = window_add_pane(w, hlimit);
 | 
						wp = window_add_pane(w, hlimit);
 | 
				
			||||||
	layout_init(w);
 | 
						layout_init(w);
 | 
				
			||||||
	if (window_pane_spawn(wp, cmd, shell, cwd, env, tio, cause) != 0) {
 | 
					
 | 
				
			||||||
 | 
						if (*cmd != '\0') {
 | 
				
			||||||
 | 
							prefix = options_get_string(&w->options, "command-prefix");
 | 
				
			||||||
 | 
							xasprintf(&cmd1, "%s%s", prefix, cmd);
 | 
				
			||||||
 | 
						} else
 | 
				
			||||||
 | 
							cmd1 = xstrdup("");
 | 
				
			||||||
 | 
						if (window_pane_spawn(wp, cmd1, shell, cwd, env, tio, cause) != 0) {
 | 
				
			||||||
		window_destroy(w);
 | 
							window_destroy(w);
 | 
				
			||||||
 | 
							free(cmd1);
 | 
				
			||||||
		return (NULL);
 | 
							return (NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						free(cmd1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	w->active = TAILQ_FIRST(&w->panes);
 | 
						w->active = TAILQ_FIRST(&w->panes);
 | 
				
			||||||
	if (name != NULL) {
 | 
						if (name != NULL) {
 | 
				
			||||||
		w->name = xstrdup(name);
 | 
							w->name = xstrdup(name);
 | 
				
			||||||
		options_set_number(&w->options, "automatic-rename", 0);
 | 
							options_set_number(&w->options, "automatic-rename", 0);
 | 
				
			||||||
	} else
 | 
						} else
 | 
				
			||||||
		w->name = default_window_name(w);
 | 
							w->name = default_window_name(w);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (w);
 | 
						return (w);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -701,6 +713,8 @@ window_pane_spawn(struct window_pane *wp, const char *cmd, const char *shell,
 | 
				
			|||||||
		wp->cwd = xstrdup(cwd);
 | 
							wp->cwd = xstrdup(cwd);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						log_debug("spawn: %s -- %s", wp->shell, wp->cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memset(&ws, 0, sizeof ws);
 | 
						memset(&ws, 0, sizeof ws);
 | 
				
			||||||
	ws.ws_col = screen_size_x(&wp->base);
 | 
						ws.ws_col = screen_size_x(&wp->base);
 | 
				
			||||||
	ws.ws_row = screen_size_y(&wp->base);
 | 
						ws.ws_row = screen_size_y(&wp->base);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user