summaryrefslogtreecommitdiff
path: root/usr.bin/tmux/cmd.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2010-01-19 21:27:48 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2010-01-19 21:27:48 +0000
commit9c2a180d863ef4ed48ce3fbea8e41e389cbbb63e (patch)
tree04f65f9f05f7cbe197e64d7cd018111f69ea2673 /usr.bin/tmux/cmd.c
parent0ae35011373ed24ae466fc8c4a959acedc6d6731 (diff)
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.
Diffstat (limited to 'usr.bin/tmux/cmd.c')
-rw-r--r--usr.bin/tmux/cmd.c66
1 files changed, 57 insertions, 9 deletions
diff --git a/usr.bin/tmux/cmd.c b/usr.bin/tmux/cmd.c
index 954dad66056..37494eb51e5 100644
--- a/usr.bin/tmux/cmd.c
+++ b/usr.bin/tmux/cmd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd.c,v 1.37 2010/01/07 20:52:18 nicm Exp $ */
+/* $OpenBSD: cmd.c,v 1.38 2010/01/19 21:27:47 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -702,11 +702,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)
@@ -714,8 +722,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)
@@ -757,6 +777,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;
@@ -802,8 +823,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);
@@ -815,8 +848,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)