From 64c26cf8cee2dbd02990d74f586f8595c498194e Mon Sep 17 00:00:00 2001 From: Tiago Cunha Date: Fri, 22 Jan 2010 17:28:34 +0000 Subject: Sync OpenBSD patchset 611: Permit !, + and - to be used for window targets to specify last window (!), or next and previous window by number (+ and -). Also tidy an if in cmd-new-window.c. --- cmd-new-window.c | 30 ++++++++++++-------------- cmd.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++-------- tmux.1 | 11 ++++++++-- 3 files changed, 80 insertions(+), 27 deletions(-) diff --git a/cmd-new-window.c b/cmd-new-window.c index a052c273..f90411d9 100644 --- a/cmd-new-window.c +++ b/cmd-new-window.c @@ -1,4 +1,4 @@ -/* $Id: cmd-new-window.c,v 1.42 2009-12-04 22:14:47 tcunha Exp $ */ +/* $Id: cmd-new-window.c,v 1.43 2010-01-22 17:28:34 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -129,21 +129,19 @@ cmd_new_window_exec(struct cmd *self, struct cmd_ctx *ctx) wl = NULL; if (idx != -1) wl = winlink_find_by_index(&s->windows, idx); - if (wl != NULL) { - if (data->flag_kill) { - /* - * Can't use session_detach as it will destroy session - * if this makes it empty. - */ - session_alert_cancel(s, wl); - winlink_stack_remove(&s->lastw, wl); - winlink_remove(&s->windows, wl); - - /* Force select/redraw if current. */ - if (wl == s->curw) { - data->flag_detached = 0; - s->curw = NULL; - } + if (wl != NULL && data->flag_kill) { + /* + * Can't use session_detach as it will destroy session if this + * makes it empty. + */ + session_alert_cancel(s, wl); + winlink_stack_remove(&s->lastw, wl); + winlink_remove(&s->windows, wl); + + /* Force select/redraw if current. */ + if (wl == s->curw) { + data->flag_detached = 0; + s->curw = NULL; } } diff --git a/cmd.c b/cmd.c index 087bd260..338072b7 100644 --- a/cmd.c +++ b/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.136 2010-01-08 16:31:35 tcunha Exp $ */ +/* $Id: cmd.c,v 1.137 2010-01-22 17:28:34 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -701,11 +701,19 @@ cmd_find_window(struct cmd_ctx *ctx, const char *arg, struct session **sp) /* * Then work out the window. An empty string is the current window, - * otherwise try to look it up in the session. + * otherwise try special cases then to look it up in the session. */ if (*winptr == '\0') wl = s->curw; - else if ((wl = cmd_lookup_window(s, winptr, &ambiguous)) == NULL) + else if (winptr[0] == '!' && winptr[1] == '\0') + wl = TAILQ_FIRST(&s->lastw); + else if (winptr[0] == '+' && winptr[1] == '\0') + wl = winlink_next(s->curw); + else if (winptr[0] == '-' && winptr[1] == '\0') + wl = winlink_previous(s->curw); + else + wl = cmd_lookup_window(s, winptr, &ambiguous); + if (wl == NULL) goto not_found; if (sessptr != NULL) @@ -713,8 +721,20 @@ cmd_find_window(struct cmd_ctx *ctx, const char *arg, struct session **sp) return (wl); no_colon: - /* No colon in the string, first try as a window then as a session. */ - if ((wl = cmd_lookup_window(s, arg, &ambiguous)) == NULL) { + /* + * No colon in the string, first try special cases, then as a window + * and lastly as a session. + */ + if (arg[0] == '!' && arg[1] == '\0') { + if ((wl = TAILQ_FIRST(&s->lastw)) == NULL) + goto not_found; + } else if (arg[0] == '+' && arg[1] == '\0') { + if ((wl = winlink_next(s->curw)) == NULL) + goto not_found; + } else if (arg[0] == '-' && arg[1] == '\0') { + if ((wl = winlink_previous(s->curw)) == NULL) + goto not_found; + } else if ((wl = cmd_lookup_window(s, arg, &ambiguous)) == NULL) { if (ambiguous) goto not_found; if ((s = cmd_lookup_session(arg, &ambiguous)) == NULL) @@ -756,6 +776,7 @@ int cmd_find_index(struct cmd_ctx *ctx, const char *arg, struct session **sp) { struct session *s; + struct winlink *wl; const char *winptr; char *sessptr = NULL; int idx, ambiguous = 0; @@ -801,8 +822,20 @@ cmd_find_index(struct cmd_ctx *ctx, const char *arg, struct session **sp) * try to look it up in the session. */ if (*winptr == '\0') - idx = -1; - else if ((idx = cmd_lookup_index(s, winptr, &ambiguous)) == -1) { + idx = -1; + else if (winptr[0] == '!' && winptr[1] == '\0') { + if ((wl = TAILQ_FIRST(&s->lastw)) == NULL) + goto not_found; + idx = wl->idx; + } else if (winptr[0] == '+' && winptr[1] == '\0') { + if (s->curw->idx == INT_MAX) + goto not_found; + idx = s->curw->idx + 1; + } else if (winptr[0] == '-' && winptr[1] == '\0') { + if (s->curw->idx == 0) + goto not_found; + idx = s->curw->idx - 1; + } else if ((idx = cmd_lookup_index(s, winptr, &ambiguous)) == -1) { if (ambiguous) goto not_found; ctx->error(ctx, "invalid index: %s", arg); @@ -814,8 +847,23 @@ cmd_find_index(struct cmd_ctx *ctx, const char *arg, struct session **sp) return (idx); no_colon: - /* No colon in the string, first try as a window then as a session. */ - if ((idx = cmd_lookup_index(s, arg, &ambiguous)) == -1) { + /* + * No colon in the string, first try special cases, then as a window + * and lastly as a session. + */ + if (arg[0] == '!' && arg[1] == '\0') { + if ((wl = TAILQ_FIRST(&s->lastw)) == NULL) + goto not_found; + idx = wl->idx; + } else if (arg[0] == '+' && arg[1] == '\0') { + if (s->curw->idx == INT_MAX) + goto not_found; + idx = s->curw->idx + 1; + } else if (arg[0] == '-' && arg[1] == '\0') { + if (s->curw->idx == 0) + goto not_found; + idx = s->curw->idx - 1; + } else if ((idx = cmd_lookup_index(s, arg, &ambiguous)) == -1) { if (ambiguous) goto not_found; if ((s = cmd_lookup_session(arg, &ambiguous)) == NULL) diff --git a/tmux.1 b/tmux.1 index abce8729..7ec3929a 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tmux.1,v 1.139 2010/01/18 19:16:04 nicm Exp $ +.\" $Id: tmux.1,v 1.222 2010-01-22 17:28:34 tcunha Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -14,7 +14,7 @@ .\" 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: January 18 2010 $ +.Dd $Mdocdate: January 19 2010 $ .Dt TMUX 1 .Os .Sh NAME @@ -307,6 +307,13 @@ commands) otherwise the current window in .Em session is chosen. +The special character +.Ql \&! +uses the last (previously current) window, or +.Ql + +and +.Ql - +are the next window or the previous window by number. When the argument does not contain a colon, .Nm first attempts to parse it as window; if that fails, an attempt is made to -- cgit v1.2.3