flag for move-window too. From Thomas Adam.
-/* $OpenBSD: cmd-move-window.c,v 1.19 2015/04/21 21:24:49 nicm Exp $ */
+/* $OpenBSD: cmd-move-window.c,v 1.20 2015/06/17 16:50:28 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
const struct cmd_entry cmd_move_window_entry = {
"move-window", "movew",
- "dkrs:t:", 0, 0,
+ "adkrs:t:", 0, 0,
"[-dkr] " CMD_SRCDST_WINDOW_USAGE,
0,
cmd_move_window_exec
const struct cmd_entry cmd_link_window_entry = {
"link-window", "linkw",
- "dks:t:", 0, 0,
+ "adks:t:", 0, 0,
"[-dk] " CMD_SRCDST_WINDOW_USAGE,
0,
cmd_move_window_exec
kflag = args_has(self->args, 'k');
dflag = args_has(self->args, 'd');
sflag = args_has(self->args, 's');
+
+ if (args_has(self->args, 'a')) {
+ s = cmd_find_session(cmdq, args_get(args, 't'), 0);
+ if (s == NULL)
+ return (CMD_RETURN_ERROR);
+ if ((idx = winlink_shuffle_up(s, s->curw)) == -1)
+ return (CMD_RETURN_ERROR);
+ }
+
if (server_link_window(src, wl, dst, idx, kflag, !dflag,
&cause) != 0) {
cmdq_error(cmdq, "can't link window: %s", cause);
-/* $OpenBSD: cmd-new-window.c,v 1.45 2015/02/05 10:32:39 nicm Exp $ */
+/* $OpenBSD: cmd-new-window.c,v 1.46 2015/06/17 16:50:28 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
struct winlink *wl;
const char *cmd, *path, *template;
char **argv, *cause, *cp;
- int argc, idx, last, detached, cwd, fd = -1;
+ int argc, idx, detached, cwd, fd = -1;
struct format_tree *ft;
struct environ_entry *envent;
wl = cmd_find_window(cmdq, args_get(args, 't'), &s);
if (wl == NULL)
return (CMD_RETURN_ERROR);
- idx = wl->idx + 1;
-
- /* Find the next free index. */
- for (last = idx; last < INT_MAX; last++) {
- if (winlink_find_by_index(&s->windows, last) == NULL)
- break;
- }
- if (last == INT_MAX) {
+ if ((idx = winlink_shuffle_up(s, wl)) == -1) {
cmdq_error(cmdq, "no free window indexes");
return (CMD_RETURN_ERROR);
}
-
- /* Move everything from last - 1 to idx up a bit. */
- for (; last > idx; last--) {
- wl = winlink_find_by_index(&s->windows, last - 1);
- server_link_window(s, wl, s, last, 0, 0, NULL);
- server_unlink_window(s, wl);
- }
} else {
idx = cmd_find_index(cmdq, args_get(args, 't'), &s);
if (idx == -2)
-.\" $OpenBSD: tmux.1,v 1.438 2015/06/15 10:58:01 nicm Exp $
+.\" $OpenBSD: tmux.1,v 1.439 2015/06/17 16:50:28 nicm Exp $
.\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\"
.\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
.\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: June 15 2015 $
+.Dd $Mdocdate: June 17 2015 $
.Dt TMUX 1
.Os
.Sh NAME
.Ar target-session
is specified, select the last window of the current session.
.It Xo Ic link-window
-.Op Fl dk
+.Op Fl adk
.Op Fl s Ar src-window
.Op Fl t Ar dst-window
.Xc
is specified and no such window exists, the
.Ar src-window
is linked there.
+With
+.Fl a ,
+the window is moved to the next index up (following windows
+are moved if necessary).
If
.Fl k
is given and
.Ar dst-pane
may belong to the same window.
.It Xo Ic move-window
-.Op Fl rdk
+.Op Fl ardk
.Op Fl s Ar src-window
.Op Fl t Ar dst-window
.Xc
-/* $OpenBSD: tmux.h,v 1.525 2015/06/17 16:44:49 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.526 2015/06/17 16:50:28 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
void window_set_name(struct window *, const char *);
void window_remove_ref(struct window *);
void winlink_clear_flags(struct winlink *);
+int winlink_shuffle_up(struct session *, struct winlink *);
/* layout.c */
u_int layout_count_cells(struct layout_cell *);
-/* $OpenBSD: window.c,v 1.133 2015/06/15 10:58:01 nicm Exp $ */
+/* $OpenBSD: window.c,v 1.134 2015/06/17 16:50:28 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
}
}
}
+
+int
+winlink_shuffle_up(struct session *s, struct winlink *wl)
+{
+ int idx, last;
+
+ idx = wl->idx + 1;
+
+ /* Find the next free index. */
+ for (last = idx; last < INT_MAX; last++) {
+ if (winlink_find_by_index(&s->windows, last) == NULL)
+ break;
+ }
+ if (last == INT_MAX)
+ return (-1);
+
+ /* Move everything from last - 1 to idx up a bit. */
+ for (; last > idx; last--) {
+ wl = winlink_find_by_index(&s->windows, last - 1);
+ server_link_window(s, wl, s, last, 0, 0, NULL);
+ server_unlink_window(s, wl);
+ }
+
+ return (idx);
+}