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:
Nicholas Marriott 2012-04-29 17:20:01 +00:00
parent e60f48ab09
commit a6c22d650b
6 changed files with 85 additions and 4 deletions

View File

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

View File

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

View File

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

View File

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

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

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