Sync OpenBSD patchset 780:

Add a last-pane command (bound to ; by default). Requested ages ago by
somebody whose name I have forgotten.
This commit is contained in:
Tiago Cunha 2010-10-24 01:34:30 +00:00
parent 8703e9f2f9
commit cd079e8fbf
6 changed files with 83 additions and 10 deletions

58
cmd-last-pane.c Normal file
View File

@ -0,0 +1,58 @@
/* $Id: cmd-last-pane.c,v 1.1 2010-10-24 01:34:30 tcunha Exp $ */
/*
* Copyright (c) 2010 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include "tmux.h"
/*
* Move to last pane.
*/
int cmd_last_pane_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_last_pane_entry = {
"last-pane", "lastp",
CMD_TARGET_WINDOW_USAGE,
0, "",
cmd_target_init,
cmd_target_parse,
cmd_last_pane_exec,
cmd_target_free,
cmd_target_print
};
int
cmd_last_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct winlink *wl;
struct window *w;
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL)
return (-1);
w = wl->window;
if (w->last == NULL) {
ctx->error(ctx, "no last pane");
return (-1);
}
window_set_active_pane(w, w->last);
return (0);
}

3
cmd.c
View File

@ -1,4 +1,4 @@
/* $Id: cmd.c,v 1.143 2010-10-24 00:32:35 tcunha Exp $ */ /* $Id: cmd.c,v 1.144 2010-10-24 01:34:30 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -53,6 +53,7 @@ const struct cmd_entry *cmd_table[] = {
&cmd_kill_server_entry, &cmd_kill_server_entry,
&cmd_kill_session_entry, &cmd_kill_session_entry,
&cmd_kill_window_entry, &cmd_kill_window_entry,
&cmd_last_pane_entry,
&cmd_last_window_entry, &cmd_last_window_entry,
&cmd_link_window_entry, &cmd_link_window_entry,
&cmd_list_buffers_entry, &cmd_list_buffers_entry,

View File

@ -1,4 +1,4 @@
/* $Id: key-bindings.c,v 1.95 2010-09-10 13:36:17 tcunha Exp $ */ /* $Id: key-bindings.c,v 1.96 2010-10-24 01:34:30 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -124,6 +124,7 @@ key_bindings_init(void)
{ '8', 0, &cmd_select_window_entry }, { '8', 0, &cmd_select_window_entry },
{ '9', 0, &cmd_select_window_entry }, { '9', 0, &cmd_select_window_entry },
{ ':', 0, &cmd_command_prompt_entry }, { ':', 0, &cmd_command_prompt_entry },
{ ';', 0, &cmd_last_pane_entry },
{ '=', 0, &cmd_choose_buffer_entry }, { '=', 0, &cmd_choose_buffer_entry },
{ '?', 0, &cmd_list_keys_entry }, { '?', 0, &cmd_list_keys_entry },
{ 'D', 0, &cmd_choose_client_entry }, { 'D', 0, &cmd_choose_client_entry },

9
tmux.1
View File

@ -1,4 +1,4 @@
.\" $Id: tmux.1,v 1.268 2010-10-24 00:29:57 tcunha Exp $ .\" $Id: tmux.1,v 1.269 2010-10-24 01:34:30 tcunha Exp $
.\" .\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> .\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\" .\"
@ -14,7 +14,7 @@
.\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
.\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.Dd $Mdocdate: October 14 2010 $ .Dd $Mdocdate: October 23 2010 $
.Dt TMUX 1 .Dt TMUX 1
.Os .Os
.Sh NAME .Sh NAME
@ -248,6 +248,8 @@ Select windows 0 to 9.
Enter the Enter the
.Nm .Nm
command prompt. command prompt.
.It ;
Move to the previously active pane.
.It = .It =
Choose which buffer to paste interactively from a list. Choose which buffer to paste interactively from a list.
.It \&? .It \&?
@ -1037,6 +1039,9 @@ option kills all but the pane given with
Kill the current window or the window at Kill the current window or the window at
.Ar target-window , .Ar target-window ,
removing it from any sessions to which it is linked. removing it from any sessions to which it is linked.
.It Ic last-pane Op Fl t Ar target-window
.D1 (alias: Ic lastp )
Select the last (previously selected) pane.
.It Ic last-window Op Fl t Ar target-session .It Ic last-window Op Fl t Ar target-session
.D1 (alias: Ic last ) .D1 (alias: Ic last )
Select the last (previously selected) window. Select the last (previously selected) window.

4
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.580 2010-10-24 01:31:08 tcunha Exp $ */ /* $Id: tmux.h,v 1.581 2010-10-24 01:34:30 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -830,6 +830,7 @@ struct window {
struct event name_timer; struct event name_timer;
struct window_pane *active; struct window_pane *active;
struct window_pane *last;
struct window_panes panes; struct window_panes panes;
int lastlayout; int lastlayout;
@ -1505,6 +1506,7 @@ extern const struct cmd_entry cmd_kill_pane_entry;
extern const struct cmd_entry cmd_kill_server_entry; extern const struct cmd_entry cmd_kill_server_entry;
extern const struct cmd_entry cmd_kill_session_entry; extern const struct cmd_entry cmd_kill_session_entry;
extern const struct cmd_entry cmd_kill_window_entry; extern const struct cmd_entry cmd_kill_window_entry;
extern const struct cmd_entry cmd_last_pane_entry;
extern const struct cmd_entry cmd_last_window_entry; extern const struct cmd_entry cmd_last_window_entry;
extern const struct cmd_entry cmd_link_window_entry; extern const struct cmd_entry cmd_link_window_entry;
extern const struct cmd_entry cmd_list_buffers_entry; extern const struct cmd_entry cmd_list_buffers_entry;

View File

@ -1,4 +1,4 @@
/* $Id: window.c,v 1.139 2010-10-24 01:32:35 tcunha Exp $ */ /* $Id: window.c,v 1.140 2010-10-24 01:34:30 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -322,6 +322,7 @@ window_resize(struct window *w, u_int sx, u_int sy)
void void
window_set_active_pane(struct window *w, struct window_pane *wp) window_set_active_pane(struct window *w, struct window_pane *wp)
{ {
w->last = w->active;
w->active = wp; w->active = wp;
while (!window_pane_visible(w->active)) { while (!window_pane_visible(w->active)) {
w->active = TAILQ_PREV(w->active, window_panes, entry); w->active = TAILQ_PREV(w->active, window_panes, entry);
@ -366,10 +367,15 @@ void
window_remove_pane(struct window *w, struct window_pane *wp) window_remove_pane(struct window *w, struct window_pane *wp)
{ {
if (wp == w->active) { if (wp == w->active) {
w->active = TAILQ_PREV(wp, window_panes, entry); w->active = w->last;
if (w->active == NULL) w->last = NULL;
w->active = TAILQ_NEXT(wp, entry); if (w->active == NULL) {
} w->active = TAILQ_PREV(wp, window_panes, entry);
if (w->active == NULL)
w->active = TAILQ_NEXT(wp, entry);
}
} else if (wp == w->last)
w->last = NULL;
TAILQ_REMOVE(&w->panes, wp, entry); TAILQ_REMOVE(&w->panes, wp, entry);
window_pane_destroy(wp); window_pane_destroy(wp);