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:
Nicholas Marriott 2013-02-22 14:31:38 +00:00
parent 374dae6635
commit 31407b70e0
5 changed files with 55 additions and 17 deletions

View File

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

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

View File

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

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

View File

@ -311,20 +311,32 @@ window_create(const char *name, const char *cmd, const char *shell,
{ {
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);