Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code

This commit is contained in:
Nicholas Marriott 2013-02-22 16:25:50 +00:00
commit ce7bf1083e
6 changed files with 55 additions and 62 deletions

45
FAQ
View File

@ -326,51 +326,6 @@ lock(1) or vlock(1)) by using the following:
bind x set lock-command '/usr/bin/vlock' \; lock-client \; set lock-command 'tput civis && read -s -n1' bind x set lock-command '/usr/bin/vlock' \; lock-client \; set lock-command 'tput civis && read -s -n1'
* How can I open a new window in the same directory as the current window?
One option is to just run "TMUX= tmux" in the window. However, this only works if no
command is running, so that you can input the command.
A workaround is to let tmux know about the current path through an environment
variable. To do so, use the following command:
[ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#I") $PWD
Which sets TMUXPWD_i (where i is the number of the current window) to the path
of the current directory. This command can be added to PS1, for example:
PS1='$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#I") $PWD)\h$ '
When a new window is created, the shell should be asked to change
directory. You can define a new binding (for example, if using GNU bash):
bind-key C-c run-shell 'tmux neww "cd $(tmux display -p "\$TMUXPWD_#I"); exec bash"'
This solution will work even if a command is currently running in the terminal,
but it will not work from a window that has just been swapped with another
because TMUXPWD_i will not be updated after a swap. However, once a new prompt
is displayed, TMUXPWD_i is updated properly.
* tmux doesn't start with "daemon failed"
tmux shows something similar to this when started:
fatal: server_start: daemon failed: No such file or directory
fatal: main_dispatch: imsg_read failed
A possible reason is that /dev/null is not a character device or is otherwise
inaccessible.
Check with:
file /dev/null
ls -l /dev/null
If it is not a character device or has incorrect permissions, it can typically
be recreated with:
cd /dev && rm null && ./MAKEDEV null
* vim displays reverse video instead of italics, while less displays italics * vim displays reverse video instead of italics, while less displays italics
(or just regular text) instead of reverse. What's wrong? (or just regular text) instead of reverse. What's wrong?

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

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