summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2010-01-22 17:28:34 +0000
committerTiago Cunha <tcunha@gmx.com>2010-01-22 17:28:34 +0000
commit64c26cf8cee2dbd02990d74f586f8595c498194e (patch)
treebb2028088f7985bdc88f3e2ebffcc46971db87b8
parentdcfa183cfe98d62197f40f27b6d22303f97988e8 (diff)
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.
-rw-r--r--cmd-new-window.c30
-rw-r--r--cmd.c66
-rw-r--r--tmux.111
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 <nicm@users.sourceforge.net>
@@ -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 <nicm@users.sourceforge.net>
@@ -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 <nicm@users.sourceforge.net>
.\"
@@ -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