1
0
mirror of https://github.com/tmux/tmux.git synced 2025-03-28 17:48:48 +00:00

Improve join-pane, move-pane and break-pane:

- There is no need for join-pane and move-pane to be different.
- break-pane can just behave like move-window if the source has only one
  pane, instead of failing.
- Add -a to break-pane like move-window.

Also add missing man page bits for previous window-tree.c changes.

GitHub issue 2176.
This commit is contained in:
nicm 2020-04-22 21:15:33 +00:00
parent 899b3d2436
commit 950af33636
4 changed files with 47 additions and 38 deletions

View File

@ -34,8 +34,8 @@ const struct cmd_entry cmd_break_pane_entry = {
.name = "break-pane", .name = "break-pane",
.alias = "breakp", .alias = "breakp",
.args = { "dPF:n:s:t:", 0, 0 }, .args = { "adPF:n:s:t:", 0, 0 },
.usage = "[-dP] [-F format] [-n window-name] [-s src-pane] " .usage = "[-adP] [-F format] [-n window-name] [-s src-pane] "
"[-t dst-window]", "[-t dst-window]",
.source = { 's', CMD_FIND_PANE, 0 }, .source = { 's', CMD_FIND_PANE, 0 },
@ -63,17 +63,31 @@ cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item)
const char *template; const char *template;
char *cp; char *cp;
if (idx != -1 && winlink_find_by_index(&dst_s->windows, idx) != NULL) { if (args_has(args, 'a')) {
cmdq_error(item, "index %d already in use", idx); if (target->wl != NULL)
return (CMD_RETURN_ERROR); idx = winlink_shuffle_up(dst_s, target->wl);
} else
idx = winlink_shuffle_up(dst_s, dst_s->curw);
if (window_count_panes(w) == 1) { if (idx == -1)
cmdq_error(item, "can't break with only one pane"); return (CMD_RETURN_ERROR);
return (CMD_RETURN_ERROR);
} }
server_unzoom_window(w); server_unzoom_window(w);
if (window_count_panes(w) == 1) {
if (server_link_window(src_s, wl, dst_s, idx, 0,
!args_has(args, 'd'), &cause) != 0) {
cmdq_error(item, "%s", cause);
free(cause);
return (CMD_RETURN_ERROR);
}
server_unlink_window(src_s, wl);
return (CMD_RETURN_NORMAL);
}
if (idx != -1 && winlink_find_by_index(&dst_s->windows, idx) != NULL) {
cmdq_error(item, "index in use: %d", idx);
return (CMD_RETURN_ERROR);
}
TAILQ_REMOVE(&w->panes, wp, entry); TAILQ_REMOVE(&w->panes, wp, entry);
window_lost_pane(w, wp); window_lost_pane(w, wp);
layout_close_pane(wp); layout_close_pane(wp);

View File

@ -50,8 +50,8 @@ const struct cmd_entry cmd_move_pane_entry = {
.name = "move-pane", .name = "move-pane",
.alias = "movep", .alias = "movep",
.args = { "bdhvp:l:s:t:", 0, 0 }, .args = { "bdfhvp:l:s:t:", 0, 0 },
.usage = "[-bdhv] [-l size] " CMD_SRCDST_PANE_USAGE, .usage = "[-bdfhv] [-l size] " CMD_SRCDST_PANE_USAGE,
.source = { 's', CMD_FIND_PANE, CMD_FIND_DEFAULT_MARKED }, .source = { 's', CMD_FIND_PANE, CMD_FIND_DEFAULT_MARKED },
.target = { 't', CMD_FIND_PANE, 0 }, .target = { 't', CMD_FIND_PANE, 0 },
@ -72,16 +72,11 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item)
struct window *src_w, *dst_w; struct window *src_w, *dst_w;
struct window_pane *src_wp, *dst_wp; struct window_pane *src_wp, *dst_wp;
char *cause = NULL; char *cause = NULL;
int size, percentage, dst_idx, not_same_window; int size, percentage, dst_idx;
int flags; int flags;
enum layout_type type; enum layout_type type;
struct layout_cell *lc; struct layout_cell *lc;
if (cmd_get_entry(self) == &cmd_join_pane_entry)
not_same_window = 1;
else
not_same_window = 0;
dst_s = target->s; dst_s = target->s;
dst_wl = target->wl; dst_wl = target->wl;
dst_wp = target->wp; dst_wp = target->wp;
@ -94,11 +89,7 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item)
src_w = src_wl->window; src_w = src_wl->window;
server_unzoom_window(src_w); server_unzoom_window(src_w);
if (not_same_window && src_w == dst_w) { if (src_wp == dst_wp) {
cmdq_error(item, "can't join a pane to its own window");
return (CMD_RETURN_ERROR);
}
if (!not_same_window && src_wp == dst_wp) {
cmdq_error(item, "source and target panes must be different"); cmdq_error(item, "source and target panes must be different");
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
} }

View File

@ -63,9 +63,9 @@ cmd_move_window_exec(struct cmd *self, struct cmdq_item *item)
struct cmd_find_state *source = cmdq_get_source(item); struct cmd_find_state *source = cmdq_get_source(item);
struct cmd_find_state target; struct cmd_find_state target;
const char *tflag = args_get(args, 't'); const char *tflag = args_get(args, 't');
struct session *src; struct session *src = source->s;
struct session *dst; struct session *dst;
struct winlink *wl; struct winlink *wl = source->wl;
char *cause; char *cause;
int idx, kflag, dflag, sflag; int idx, kflag, dflag, sflag;
@ -83,9 +83,7 @@ cmd_move_window_exec(struct cmd *self, struct cmdq_item *item)
if (cmd_find_target(&target, item, tflag, CMD_FIND_WINDOW, if (cmd_find_target(&target, item, tflag, CMD_FIND_WINDOW,
CMD_FIND_WINDOW_INDEX) != 0) CMD_FIND_WINDOW_INDEX) != 0)
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
src = source->s;
dst = target.s; dst = target.s;
wl = source->wl;
idx = target.idx; idx = target.idx;
kflag = args_has(args, 'k'); kflag = args_has(args, 'k');
@ -93,12 +91,16 @@ cmd_move_window_exec(struct cmd *self, struct cmdq_item *item)
sflag = args_has(args, 's'); sflag = args_has(args, 's');
if (args_has(args, 'a')) { if (args_has(args, 'a')) {
if ((idx = winlink_shuffle_up(dst, dst->curw)) == -1) if (target.wl != NULL)
idx = winlink_shuffle_up(dst, target.wl);
else
idx = winlink_shuffle_up(dst, dst->curw);
if (idx == -1)
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
} }
if (server_link_window(src, wl, dst, idx, kflag, !dflag, &cause) != 0) { if (server_link_window(src, wl, dst, idx, kflag, !dflag, &cause) != 0) {
cmdq_error(item, "can't link window: %s", cause); cmdq_error(item, "%s", cause);
free(cause); free(cause);
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
} }

20
tmux.1
View File

@ -1714,7 +1714,7 @@ from which the layout was originally defined.
Commands related to windows and panes are as follows: Commands related to windows and panes are as follows:
.Bl -tag -width Ds .Bl -tag -width Ds
.It Xo Ic break-pane .It Xo Ic break-pane
.Op Fl dP .Op Fl adP
.Op Fl F Ar format .Op Fl F Ar format
.Op Fl n Ar window-name .Op Fl n Ar window-name
.Op Fl s Ar src-pane .Op Fl s Ar src-pane
@ -1725,6 +1725,10 @@ Break
.Ar src-pane .Ar src-pane
off from its containing window to make it the only pane in off from its containing window to make it the only pane in
.Ar dst-window . .Ar dst-window .
With
.Fl a ,
the window is moved to the next index up (following windows
are moved if necessary).
If If
.Fl d .Fl d
is given, the new window does not become the current window. is given, the new window does not become the current window.
@ -1873,12 +1877,15 @@ The following keys may be used in tree mode:
.It Li "<" Ta "Scroll list of previews left" .It Li "<" Ta "Scroll list of previews left"
.It Li ">" Ta "Scroll list of previews right" .It Li ">" Ta "Scroll list of previews right"
.It Li "C-s" Ta "Search by name" .It Li "C-s" Ta "Search by name"
.It Li "m" Ta "Set the marked pane"
.It Li "M" Ta "Clear the marked pane"
.It Li "n" Ta "Repeat last search" .It Li "n" Ta "Repeat last search"
.It Li "t" Ta "Toggle if item is tagged" .It Li "t" Ta "Toggle if item is tagged"
.It Li "T" Ta "Tag no items" .It Li "T" Ta "Tag no items"
.It Li "C-t" Ta "Tag all items" .It Li "C-t" Ta "Tag all items"
.It Li "\&:" Ta "Run a command for each tagged item" .It Li "\&:" Ta "Run a command for each tagged item"
.It Li "f" Ta "Enter a format to filter items" .It Li "f" Ta "Enter a format to filter items"
.It Li "H" Ta "Jump to the starting pane"
.It Li "O" Ta "Change sort field" .It Li "O" Ta "Change sort field"
.It Li "r" Ta "Reverse sort order" .It Li "r" Ta "Reverse sort order"
.It Li "v" Ta "Toggle preview" .It Li "v" Ta "Toggle preview"
@ -2125,19 +2132,14 @@ See the
.Sx FORMATS .Sx FORMATS
section. section.
.It Xo Ic move-pane .It Xo Ic move-pane
.Op Fl bdhv .Op Fl bdfhv
.Op Fl l Ar size .Op Fl l Ar size
.Op Fl s Ar src-pane .Op Fl s Ar src-pane
.Op Fl t Ar dst-pane .Op Fl t Ar dst-pane
.Xc .Xc
.D1 (alias: Ic movep ) .D1 (alias: Ic movep )
Like Does the same as
.Ic join-pane , .Ic join-pane .
but
.Ar src-pane
and
.Ar dst-pane
may belong to the same window.
.It Xo Ic move-window .It Xo Ic move-window
.Op Fl ardk .Op Fl ardk
.Op Fl s Ar src-window .Op Fl s Ar src-window