diff --git a/cmd-new-session.c b/cmd-new-session.c index 5f67691f..d09e2e7d 100644 --- a/cmd-new-session.c +++ b/cmd-new-session.c @@ -1,4 +1,4 @@ -/* $Id: cmd-new-session.c,v 1.78 2010-07-02 02:49:19 tcunha Exp $ */ +/* $Id: cmd-new-session.c,v 1.79 2010-12-11 18:42:20 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -279,9 +279,17 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx) if (!detached) { if (ctx->cmdclient != NULL) { server_write_client(ctx->cmdclient, MSG_READY, NULL, 0); + if (ctx->cmdclient->session != NULL) { + session_index(ctx->cmdclient->session, + &ctx->cmdclient->last_session); + } ctx->cmdclient->session = s; server_redraw_client(ctx->cmdclient); } else { + if (ctx->curclient->session != NULL) { + session_index(ctx->curclient->session, + &ctx->curclient->last_session); + } ctx->curclient->session = s; server_redraw_client(ctx->curclient); } diff --git a/cmd-switch-client.c b/cmd-switch-client.c index 3fb8fc87..20bf7f9b 100644 --- a/cmd-switch-client.c +++ b/cmd-switch-client.c @@ -1,4 +1,4 @@ -/* $Id: cmd-switch-client.c,v 1.21 2010-10-09 14:29:32 tcunha Exp $ */ +/* $Id: cmd-switch-client.c,v 1.22 2010-12-11 18:42:20 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -36,13 +36,14 @@ size_t cmd_switch_client_print(struct cmd *, char *, size_t); struct cmd_switch_client_data { char *name; char *target; + int flag_last; int flag_next; int flag_previous; }; const struct cmd_entry cmd_switch_client_entry = { "switch-client", "switchc", - "[-np] [-c target-client] [-t target-session]", + "[-lnp] [-c target-client] [-t target-session]", 0, "", cmd_switch_client_init, cmd_switch_client_parse, @@ -59,6 +60,7 @@ cmd_switch_client_init(struct cmd *self, int key) self->data = data = xmalloc(sizeof *data); data->name = NULL; data->target = NULL; + data->flag_last = 0; data->flag_next = 0; data->flag_previous = 0; @@ -69,6 +71,9 @@ cmd_switch_client_init(struct cmd *self, int key) case ')': data->flag_next = 1; break; + case 'L': + data->flag_last = 1; + break; } } @@ -81,28 +86,36 @@ cmd_switch_client_parse(struct cmd *self, int argc, char **argv, char **cause) self->entry->init(self, KEYC_NONE); data = self->data; - while ((opt = getopt(argc, argv, "c:t:")) != -1) { + while ((opt = getopt(argc, argv, "c:lnpt:")) != -1) { switch (opt) { case 'c': if (data->name == NULL) data->name = xstrdup(optarg); break; + case 'l': + if (data->flag_next || data->flag_previous || + data->target != NULL) + goto usage; + data->flag_last = 1; + break; + case 'n': + if (data->flag_previous || data->flag_last || + data->target != NULL) + goto usage; + data->flag_next = 1; + break; + case 'p': + if (data->flag_next || data->flag_last || + data->target != NULL) + goto usage; + data->flag_next = 1; + 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; } @@ -134,6 +147,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_ctx *ctx) if ((c = cmd_find_client(ctx, data->name)) == NULL) return (-1); + s = NULL; if (data->flag_next) { if ((s = session_next_session(c->session)) == NULL) { ctx->error(ctx, "can't find next session"); @@ -144,11 +158,21 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_ctx *ctx) ctx->error(ctx, "can't find previous session"); return (-1); } + } else if (data->flag_last) { + if (c->last_session != UINT_MAX && + c->last_session < ARRAY_LENGTH(&sessions)) + s = ARRAY_ITEM(&sessions, c->last_session); + if (s == NULL) { + ctx->error(ctx, "can't find last session"); + return (-1); + } } else s = cmd_find_session(ctx, data->target); - if (s == NULL) return (-1); + + if (c->session != NULL) + session_index(c->session, &c->last_session); c->session = s; recalculate_sizes(); @@ -179,6 +203,8 @@ 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_last) + off += xsnprintf(buf + off, len - off, "%s", " -l"); if (off < len && data->flag_next) off += xsnprintf(buf + off, len - off, "%s", " -n"); if (off < len && data->flag_previous) diff --git a/key-bindings.c b/key-bindings.c index 66588415..bea499e8 100644 --- a/key-bindings.c +++ b/key-bindings.c @@ -1,4 +1,4 @@ -/* $Id: key-bindings.c,v 1.96 2010-10-24 01:34:30 tcunha Exp $ */ +/* $Id: key-bindings.c,v 1.97 2010-12-11 18:42:20 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -128,6 +128,7 @@ key_bindings_init(void) { '=', 0, &cmd_choose_buffer_entry }, { '?', 0, &cmd_list_keys_entry }, { 'D', 0, &cmd_choose_client_entry }, + { 'L', 0, &cmd_switch_client_entry }, { '[', 0, &cmd_copy_mode_entry }, { '\'', 0, &cmd_command_prompt_entry }, { '\002', /* C-b */ 0, &cmd_send_prefix_entry }, diff --git a/server-client.c b/server-client.c index d98238e3..313fbdda 100644 --- a/server-client.c +++ b/server-client.c @@ -1,4 +1,4 @@ -/* $Id: server-client.c,v 1.46 2010-12-11 16:15:02 nicm Exp $ */ +/* $Id: server-client.c,v 1.47 2010-12-11 18:42:20 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -77,6 +77,7 @@ server_client_create(int fd) c->title = NULL; c->session = NULL; + c->last_session = UINT_MAX; c->tty.sx = 80; c->tty.sy = 24; diff --git a/server-fn.c b/server-fn.c index 897a38f2..c5a5ccb2 100644 --- a/server-fn.c +++ b/server-fn.c @@ -1,4 +1,4 @@ -/* $Id: server-fn.c,v 1.113 2010-10-09 14:31:50 tcunha Exp $ */ +/* $Id: server-fn.c,v 1.114 2010-12-11 18:42:20 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -399,6 +399,7 @@ server_destroy_session(struct session *s) c->session = NULL; c->flags |= CLIENT_EXIT; } else { + c->last_session = UINT_MAX; c->session = s_new; server_redraw_client(c); } diff --git a/tmux.1 b/tmux.1 index 07924b9e..b9e43876 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1,4 +1,4 @@ -.\" $Id: tmux.1,v 1.276 2010-12-10 21:19:13 nicm Exp $ +.\" $Id: tmux.1,v 1.277 2010-12-11 18:42:20 nicm Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -286,6 +286,8 @@ Briefly display pane indexes. Force redraw of the attached client. .It s Select a new session for the attached client interactively. +.It L +Switch the attached client back to the last session. .It t Show the time. .It w @@ -666,7 +668,7 @@ Suspend a client by sending .Dv SIGTSTP (tty stop). .It Xo Ic switch-client -.Op Fl np +.Op Fl lnp .Op Fl c Ar target-client .Op Fl t Ar target-session .Xc @@ -676,10 +678,12 @@ Switch the current session for client to .Ar target-session . If +.Fl l, .Fl n or .Fl p -is used, the client is moved to the next or previous session respectively. +is used, the client is moved to the last, next or previous session +respectively. .El .Sh WINDOWS AND PANES A diff --git a/tmux.h b/tmux.h index 84763bc7..e00a1837 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.586 2010-12-11 16:15:02 nicm Exp $ */ +/* $Id: tmux.h,v 1.587 2010-12-11 18:42:20 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1153,6 +1153,7 @@ struct client { struct mode_key_data prompt_mdata; struct session *session; + u_int last_session; int references; };