mirror of
https://github.com/tmate-io/tmate.git
synced 2024-12-24 23:59:03 +01:00
Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code
This commit is contained in:
commit
ce7bf1083e
45
FAQ
45
FAQ
@ -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'
|
||||
|
||||
* 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
|
||||
(or just regular text) instead of reverse. What's wrong?
|
||||
|
||||
|
@ -58,8 +58,8 @@ cmd_split_window_exec(struct cmd *self, struct cmd_ctx *ctx)
|
||||
struct window *w;
|
||||
struct window_pane *wp, *new_wp = NULL;
|
||||
struct environ env;
|
||||
const char *cmd, *cwd, *shell;
|
||||
char *cause, *new_cause;
|
||||
const char *cmd, *cwd, *shell, *prefix;
|
||||
char *cause, *new_cause, *cmd1;
|
||||
u_int hlimit;
|
||||
int size, percentage;
|
||||
enum layout_type type;
|
||||
@ -121,9 +121,18 @@ cmd_split_window_exec(struct cmd *self, struct cmd_ctx *ctx)
|
||||
goto error;
|
||||
}
|
||||
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;
|
||||
}
|
||||
free(cmd1);
|
||||
layout_assign_pane(lc, new_wp);
|
||||
|
||||
server_redraw_window(w);
|
||||
|
24
names.c
24
names.c
@ -26,8 +26,8 @@
|
||||
|
||||
#include "tmux.h"
|
||||
|
||||
void window_name_callback(unused int, unused short, void *);
|
||||
char *parse_window_name(const char *);
|
||||
void window_name_callback(int, short, void *);
|
||||
char *parse_window_name(struct window *, const char *);
|
||||
|
||||
void
|
||||
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' &&
|
||||
name != NULL && name[0] == '-' && name[1] != '\0')
|
||||
wname = parse_window_name(name + 1);
|
||||
wname = parse_window_name(w, name + 1);
|
||||
else
|
||||
wname = parse_window_name(name);
|
||||
wname = parse_window_name(w, name);
|
||||
free(name);
|
||||
}
|
||||
|
||||
@ -98,18 +98,22 @@ default_window_name(struct window *w)
|
||||
if (w->active->screen != &w->active->base)
|
||||
return (xstrdup("[tmux]"));
|
||||
if (w->active->cmd != NULL && *w->active->cmd != '\0')
|
||||
return (parse_window_name(w->active->cmd));
|
||||
return (parse_window_name(w->active->shell));
|
||||
return (parse_window_name(w, w->active->cmd));
|
||||
return (parse_window_name(w, w->active->shell));
|
||||
}
|
||||
|
||||
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);
|
||||
if (strncmp(name, "exec ", (sizeof "exec ") - 1) == 0)
|
||||
name = name + (sizeof "exec ") - 1;
|
||||
if (strncmp(name, prefix, prefixlen) == 0)
|
||||
name = name + prefixlen;
|
||||
|
||||
while (*name == ' ')
|
||||
name++;
|
||||
|
@ -476,7 +476,6 @@ const struct options_table_entry window_options_table[] = {
|
||||
.default_num = 1
|
||||
},
|
||||
|
||||
|
||||
{ .name = "c0-change-trigger",
|
||||
.type = OPTIONS_TABLE_NUMBER,
|
||||
.default_num = 250,
|
||||
@ -502,6 +501,11 @@ const struct options_table_entry window_options_table[] = {
|
||||
.default_num = 1
|
||||
},
|
||||
|
||||
{ .name = "command-prefix",
|
||||
.type = OPTIONS_TABLE_STRING,
|
||||
.default_str = "exec "
|
||||
},
|
||||
|
||||
{ .name = "force-height",
|
||||
.type = OPTIONS_TABLE_NUMBER,
|
||||
.minimum = 0,
|
||||
|
7
tmux.1
7
tmux.1
@ -2708,6 +2708,13 @@ Set clock colour.
|
||||
.Xc
|
||||
Set clock hour format.
|
||||
.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-width Ar width
|
||||
Prevent
|
||||
|
18
window.c
18
window.c
@ -307,24 +307,36 @@ window_create1(u_int sx, u_int sy)
|
||||
struct window *
|
||||
window_create(const char *name, const char *cmd, const char *shell,
|
||||
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_pane *wp;
|
||||
const char *prefix;
|
||||
char *cmd1;
|
||||
|
||||
w = window_create1(sx, sy);
|
||||
wp = window_add_pane(w, hlimit);
|
||||
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);
|
||||
free(cmd1);
|
||||
return (NULL);
|
||||
}
|
||||
free(cmd1);
|
||||
|
||||
w->active = TAILQ_FIRST(&w->panes);
|
||||
if (name != NULL) {
|
||||
w->name = xstrdup(name);
|
||||
options_set_number(&w->options, "automatic-rename", 0);
|
||||
} else
|
||||
w->name = default_window_name(w);
|
||||
|
||||
return (w);
|
||||
}
|
||||
|
||||
@ -701,6 +713,8 @@ window_pane_spawn(struct window_pane *wp, const char *cmd, const char *shell,
|
||||
wp->cwd = xstrdup(cwd);
|
||||
}
|
||||
|
||||
log_debug("spawn: %s -- %s", wp->shell, wp->cmd);
|
||||
|
||||
memset(&ws, 0, sizeof ws);
|
||||
ws.ws_col = screen_size_x(&wp->base);
|
||||
ws.ws_row = screen_size_y(&wp->base);
|
||||
|
Loading…
Reference in New Issue
Block a user