diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2010-09-08 22:02:29 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2010-09-08 22:02:29 +0000 |
commit | 39668f3cc63395b5572e781e1509f1fda8ed28a8 (patch) | |
tree | 43fac362bfec1658b12d774ebb3794a169475d1b /usr.bin/tmux | |
parent | 75c27e06b53e680e6c27c18b70bf476861297a71 (diff) |
Add -n and -p flags to switch-client to move to the next and previous
session (yes, it doesn't match window/pane, but so what, nor does
switch-client).
Based on a diff long ago from "edsouza".
Diffstat (limited to 'usr.bin/tmux')
-rw-r--r-- | usr.bin/tmux/cmd-switch-client.c | 68 | ||||
-rw-r--r-- | usr.bin/tmux/key-bindings.c | 4 | ||||
-rw-r--r-- | usr.bin/tmux/session.c | 44 | ||||
-rw-r--r-- | usr.bin/tmux/tmux.1 | 10 | ||||
-rw-r--r-- | usr.bin/tmux/tmux.h | 4 |
5 files changed, 117 insertions, 13 deletions
diff --git a/usr.bin/tmux/cmd-switch-client.c b/usr.bin/tmux/cmd-switch-client.c index 0370c7f8442..d44c4ef276f 100644 --- a/usr.bin/tmux/cmd-switch-client.c +++ b/usr.bin/tmux/cmd-switch-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-switch-client.c,v 1.5 2010/01/23 17:50:56 nicm Exp $ */ +/* $OpenBSD: cmd-switch-client.c,v 1.6 2010/09/08 22:02:28 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -27,6 +27,7 @@ * Switch client to a different session. */ +void cmd_switch_client_init(struct cmd *, int); int cmd_switch_client_parse(struct cmd *, int, char **, char **); int cmd_switch_client_exec(struct cmd *, struct cmd_ctx *); void cmd_switch_client_free(struct cmd *); @@ -35,28 +36,50 @@ size_t cmd_switch_client_print(struct cmd *, char *, size_t); struct cmd_switch_client_data { char *name; char *target; + int flag_next; + int flag_previous; }; const struct cmd_entry cmd_switch_client_entry = { "switch-client", "switchc", - "[-c target-client] [-t target-session]", + "[-np] [-c target-client] [-t target-session]", 0, "", - NULL, + cmd_switch_client_init, cmd_switch_client_parse, cmd_switch_client_exec, cmd_switch_client_free, cmd_switch_client_print }; -int -cmd_switch_client_parse(struct cmd *self, int argc, char **argv, char **cause) +void +cmd_switch_client_init(struct cmd *self, int key) { struct cmd_switch_client_data *data; - int opt; self->data = data = xmalloc(sizeof *data); data->name = NULL; data->target = NULL; + data->flag_next = 0; + data->flag_previous = 0; + + switch (key) { + case '(': + data->flag_previous = 1; + break; + case ')': + data->flag_next = 1; + break; + } +} + +int +cmd_switch_client_parse(struct cmd *self, int argc, char **argv, char **cause) +{ + struct cmd_switch_client_data *data; + int opt; + + self->entry->init(self, KEYC_NONE); + data = self->data; while ((opt = getopt(argc, argv, "c:t:")) != -1) { switch (opt) { @@ -65,9 +88,21 @@ cmd_switch_client_parse(struct cmd *self, int argc, char **argv, char **cause) data->name = xstrdup(optarg); break; case 't': + if (data->flag_next || data->flag_previous) + goto usage; if (data->target == NULL) data->target = xstrdup(optarg); break; + case 'n': + if (data->flag_previous || data->target != NULL) + goto usage; + data->flag_next = 1; + break; + case 'p': + if (data->flag_next || data->target != NULL) + goto usage; + data->flag_next = 1; + break; default: goto usage; } @@ -98,9 +133,22 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_ctx *ctx) if ((c = cmd_find_client(ctx, data->name)) == NULL) return (-1); - if ((s = cmd_find_session(ctx, data->target)) == NULL) - return (-1); + if (data->flag_next) { + if ((s = session_next_session(c->session)) == NULL) { + ctx->error(ctx, "can't find next session"); + return (-1); + } + } else if (data->flag_previous) { + if ((s = session_previous_session(c->session)) == NULL) { + ctx->error(ctx, "can't find previous session"); + return (-1); + } + } else + s = cmd_find_session(ctx, data->target); + + if (s == NULL) + return (-1); c->session = s; recalculate_sizes(); @@ -130,6 +178,10 @@ cmd_switch_client_print(struct cmd *self, char *buf, size_t len) off += xsnprintf(buf, len, "%s", self->entry->name); if (data == NULL) return (off); + if (off < len && data->flag_next) + off += xsnprintf(buf + off, len - off, "%s", " -n"); + if (off < len && data->flag_previous) + off += xsnprintf(buf + off, len - off, "%s", " -p"); if (off < len && data->name != NULL) off += cmd_prarg(buf + off, len - off, " -c ", data->name); if (off < len && data->target != NULL) diff --git a/usr.bin/tmux/key-bindings.c b/usr.bin/tmux/key-bindings.c index e345b6ab5c5..c4047da7cb0 100644 --- a/usr.bin/tmux/key-bindings.c +++ b/usr.bin/tmux/key-bindings.c @@ -1,4 +1,4 @@ -/* $OpenBSD: key-bindings.c,v 1.23 2010/06/26 18:20:53 nicm Exp $ */ +/* $OpenBSD: key-bindings.c,v 1.24 2010/09/08 22:02:28 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -108,6 +108,8 @@ key_bindings_init(void) { '#', 0, &cmd_list_buffers_entry }, { '%', 0, &cmd_split_window_entry }, { '&', 0, &cmd_confirm_before_entry }, + { '(', 0, &cmd_switch_client_entry }, + { ')', 0, &cmd_switch_client_entry }, { ',', 0, &cmd_command_prompt_entry }, { '-', 0, &cmd_delete_buffer_entry }, { '.', 0, &cmd_command_prompt_entry }, diff --git a/usr.bin/tmux/session.c b/usr.bin/tmux/session.c index 558e03f773e..c6178c04437 100644 --- a/usr.bin/tmux/session.c +++ b/usr.bin/tmux/session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: session.c,v 1.19 2010/06/27 02:56:59 nicm Exp $ */ +/* $OpenBSD: session.c,v 1.20 2010/09/08 22:02:28 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -169,6 +169,48 @@ session_index(struct session *s, u_int *i) return (-1); } +/* Find the next usable session. */ +struct session * +session_next_session(struct session *s) +{ + struct session *s2; + u_int i; + + if (ARRAY_LENGTH(&sessions) == 0 || session_index(s, &i) != 0) + return (NULL); + + do { + if (i == ARRAY_LENGTH(&sessions) - 1) + i = 0; + else + i++; + s2 = ARRAY_ITEM(&sessions, i); + } while (s2 == NULL || s2->flags & SESSION_DEAD); + + return (s2); +} + +/* Find the previous usable session. */ +struct session * +session_previous_session(struct session *s) +{ + struct session *s2; + u_int i; + + if (ARRAY_LENGTH(&sessions) == 0 || session_index(s, &i) != 0) + return (NULL); + + do { + if (i == 0) + i = ARRAY_LENGTH(&sessions) - 1; + else + i--; + s2 = ARRAY_ITEM(&sessions, i); + } while (s2 == NULL || s2->flags & SESSION_DEAD); + + return (s2); +} + /* Create a new window on a session. */ struct winlink * session_new(struct session *s, diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1 index 81a5ef6cd27..743da55c6df 100644 --- a/usr.bin/tmux/tmux.1 +++ b/usr.bin/tmux/tmux.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tmux.1,v 1.182 2010/07/15 21:54:20 jmc Exp $ +.\" $OpenBSD: tmux.1,v 1.183 2010/09/08 22:02:28 nicm 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: July 15 2010 $ +.Dd $Mdocdate: September 8 2010 $ .Dt TMUX 1 .Os .Sh NAME @@ -660,6 +660,7 @@ Suspend a client by sending .Dv SIGTSTP (tty stop). .It Xo Ic switch-client +.Op Fl np .Op Fl c Ar target-client .Op Fl t Ar target-session .Xc @@ -668,6 +669,11 @@ Switch the current session for client .Ar target-client to .Ar target-session . +If +.Fl n +or +.Fl p +is used, the client is moved to the next or previous session respectively. .El .Sh WINDOWS AND PANES A diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index fdabe27e22d..66267ee6f61 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.238 2010/08/19 18:29:01 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.239 2010/09/08 22:02:28 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -1965,6 +1965,8 @@ struct session *session_create(const char *, const char *, const char *, char **); void session_destroy(struct session *); int session_index(struct session *, u_int *); +struct session *session_next_session(struct session *); +struct session *session_previous_session(struct session *); struct winlink *session_new(struct session *, const char *, const char *, const char *, int, char **); struct winlink *session_attach( |