mirror of
https://github.com/tmate-io/tmate.git
synced 2024-11-27 02:23:15 +01:00
Add a flag to move-window to renumber the windows in a session (closing
any gaps) and add an option to do this automatically each time a window is killed. From Thomas Adam.
This commit is contained in:
parent
e60f48ab09
commit
a6c22d650b
@ -30,8 +30,8 @@ int cmd_move_window_exec(struct cmd *, struct cmd_ctx *);
|
|||||||
|
|
||||||
const struct cmd_entry cmd_move_window_entry = {
|
const struct cmd_entry cmd_move_window_entry = {
|
||||||
"move-window", "movew",
|
"move-window", "movew",
|
||||||
"dks:t:", 0, 0,
|
"dkrs:t:", 0, 0,
|
||||||
"[-dk] " CMD_SRCDST_WINDOW_USAGE,
|
"[-dkr] " CMD_SRCDST_WINDOW_USAGE,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
@ -42,11 +42,22 @@ int
|
|||||||
cmd_move_window_exec(struct cmd *self, struct cmd_ctx *ctx)
|
cmd_move_window_exec(struct cmd *self, struct cmd_ctx *ctx)
|
||||||
{
|
{
|
||||||
struct args *args = self->args;
|
struct args *args = self->args;
|
||||||
struct session *src, *dst;
|
struct session *src, *dst, *s;
|
||||||
struct winlink *wl;
|
struct winlink *wl;
|
||||||
char *cause;
|
char *cause;
|
||||||
int idx, kflag, dflag;
|
int idx, kflag, dflag;
|
||||||
|
|
||||||
|
if ((s = ctx->curclient->session) == NULL)
|
||||||
|
return (-1);
|
||||||
|
|
||||||
|
if (args_has(args, 'r'))
|
||||||
|
{
|
||||||
|
session_renumber_windows(s);
|
||||||
|
recalculate_sizes();
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
if ((wl = cmd_find_window(ctx, args_get(args, 's'), &src)) == NULL)
|
if ((wl = cmd_find_window(ctx, args_get(args, 's'), &src)) == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
if ((idx = cmd_find_index(ctx, args_get(args, 't'), &dst)) == -2)
|
if ((idx = cmd_find_index(ctx, args_get(args, 't'), &dst)) == -2)
|
||||||
|
@ -274,6 +274,11 @@ const struct options_table_entry session_options_table[] = {
|
|||||||
.default_num = KEYC_NONE,
|
.default_num = KEYC_NONE,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ .name = "renumber-windows",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
{ .name = "repeat-time",
|
{ .name = "repeat-time",
|
||||||
.type = OPTIONS_TABLE_NUMBER,
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
.minimum = 0,
|
.minimum = 0,
|
||||||
|
@ -263,6 +263,9 @@ server_kill_window(struct window *w)
|
|||||||
} else
|
} else
|
||||||
server_redraw_session_group(s);
|
server_redraw_session_group(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options_get_number(&s->options, "renumber-windows"))
|
||||||
|
session_renumber_windows(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
46
session.c
46
session.c
@ -591,3 +591,49 @@ session_group_synchronize1(struct session *target, struct session *s)
|
|||||||
winlink_remove(&old_windows, wl);
|
winlink_remove(&old_windows, wl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Renumber the windows across winlinks attached to a specific session. */
|
||||||
|
void
|
||||||
|
session_renumber_windows(struct session *s)
|
||||||
|
{
|
||||||
|
struct winlink *wl, *wl1, *wl_new;
|
||||||
|
struct winlinks old_wins;
|
||||||
|
struct winlink_stack old_lastw;
|
||||||
|
int new_idx, new_curw_idx;
|
||||||
|
|
||||||
|
/* Save and replace old window list. */
|
||||||
|
memcpy(&old_wins, &s->windows, sizeof old_wins);
|
||||||
|
RB_INIT(&s->windows);
|
||||||
|
|
||||||
|
/* Start renumbering from the base-index if it's set. */
|
||||||
|
new_idx = options_get_number(&s->options, "base-index");
|
||||||
|
new_curw_idx = 0;
|
||||||
|
|
||||||
|
/* Go through the winlinks and assign new indexes. */
|
||||||
|
RB_FOREACH(wl, winlinks, &old_wins) {
|
||||||
|
wl_new = winlink_add(&s->windows, new_idx);
|
||||||
|
winlink_set_window(wl_new, wl->window);
|
||||||
|
wl_new->flags |= wl->flags & WINLINK_ALERTFLAGS;
|
||||||
|
|
||||||
|
if (wl == s->curw)
|
||||||
|
new_curw_idx = wl_new->idx;
|
||||||
|
|
||||||
|
new_idx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fix the stack of last windows now. */
|
||||||
|
memcpy(&old_lastw, &s->lastw, sizeof old_lastw);
|
||||||
|
TAILQ_INIT(&s->lastw);
|
||||||
|
TAILQ_FOREACH(wl, &old_lastw, sentry) {
|
||||||
|
wl_new = winlink_find_by_index(&s->windows, wl->idx);
|
||||||
|
if (wl_new != NULL)
|
||||||
|
TAILQ_INSERT_TAIL(&s->lastw, wl_new, sentry);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the current window. */
|
||||||
|
s->curw = winlink_find_by_index(&s->windows, new_curw_idx);
|
||||||
|
|
||||||
|
/* Free the old winlinks (reducing window references too). */
|
||||||
|
RB_FOREACH_SAFE(wl, winlinks, &old_wins, wl1)
|
||||||
|
winlink_remove(&old_wins, wl);
|
||||||
|
}
|
||||||
|
17
tmux.1
17
tmux.1
@ -1258,7 +1258,7 @@ and
|
|||||||
.Ar dst-pane
|
.Ar dst-pane
|
||||||
may belong to the same window.
|
may belong to the same window.
|
||||||
.It Xo Ic move-window
|
.It Xo Ic move-window
|
||||||
.Op Fl dk
|
.Op Fl rdk
|
||||||
.Op Fl s Ar src-window
|
.Op Fl s Ar src-window
|
||||||
.Op Fl t Ar dst-window
|
.Op Fl t Ar dst-window
|
||||||
.Xc
|
.Xc
|
||||||
@ -1269,6 +1269,12 @@ except the window at
|
|||||||
.Ar src-window
|
.Ar src-window
|
||||||
is moved to
|
is moved to
|
||||||
.Ar dst-window .
|
.Ar dst-window .
|
||||||
|
With
|
||||||
|
.Fl r ,
|
||||||
|
all windows in the session are renumbered in sequential order, respecting
|
||||||
|
the
|
||||||
|
.Ic base-index
|
||||||
|
option.
|
||||||
.It Xo Ic new-window
|
.It Xo Ic new-window
|
||||||
.Op Fl adkP
|
.Op Fl adkP
|
||||||
.Op Fl c Ar start-directory
|
.Op Fl c Ar start-directory
|
||||||
@ -2122,6 +2128,15 @@ Set the pane border colour for panes aside from the active pane.
|
|||||||
Set the key accepted as a prefix key.
|
Set the key accepted as a prefix key.
|
||||||
.It Ic prefix2 Ar key
|
.It Ic prefix2 Ar key
|
||||||
Set a secondary key accepted as a prefix key.
|
Set a secondary key accepted as a prefix key.
|
||||||
|
.It Xo Ic renumber-windows
|
||||||
|
.Op Ic on | off
|
||||||
|
.Xc
|
||||||
|
If on, when a window is closed in a session, automatically renumber the other
|
||||||
|
windows in numerical order.
|
||||||
|
This respects the
|
||||||
|
.Ic base-index
|
||||||
|
option if it has been set.
|
||||||
|
If off, do not renumber the windows.
|
||||||
.It Ic repeat-time Ar time
|
.It Ic repeat-time Ar time
|
||||||
Allow multiple commands to be entered without pressing the prefix-key again
|
Allow multiple commands to be entered without pressing the prefix-key again
|
||||||
in the specified
|
in the specified
|
||||||
|
1
tmux.h
1
tmux.h
@ -2116,6 +2116,7 @@ void session_group_remove(struct session *);
|
|||||||
void session_group_synchronize_to(struct session *);
|
void session_group_synchronize_to(struct session *);
|
||||||
void session_group_synchronize_from(struct session *);
|
void session_group_synchronize_from(struct session *);
|
||||||
void session_group_synchronize1(struct session *, struct session *);
|
void session_group_synchronize1(struct session *, struct session *);
|
||||||
|
void session_renumber_windows(struct session *);
|
||||||
|
|
||||||
/* utf8.c */
|
/* utf8.c */
|
||||||
void utf8_build(void);
|
void utf8_build(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user