Add a refresh-now command and change the r binding back to it in copy mode.

This commit is contained in:
nicm
2026-08-05 12:23:25 +00:00
committed by tmux update bot
parent bd483a63cf
commit 4a9dbac435
3 changed files with 51 additions and 11 deletions

View File

@@ -1,4 +1,4 @@
/* $OpenBSD: key-bindings.c,v 1.190 2026/07/22 19:23:59 nicm Exp $ */
/* $OpenBSD: key-bindings.c,v 1.191 2026/08/05 12:23:25 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -595,7 +595,7 @@ key_bindings_init(void)
"bind -Tcopy-mode g { command-prompt -P -p'(goto line)' { send -X goto-line -- '%%' } }",
"bind -Tcopy-mode n { send -X search-again }",
"bind -Tcopy-mode q { send -X cancel }",
"bind -Tcopy-mode r { send -X refresh-toggle }",
"bind -Tcopy-mode r { send -X refresh-now }",
"bind -Tcopy-mode t { command-prompt -P -1p'(jump to forward)' { send -X jump-to-forward -- '%%' } }",
"bind -Tcopy-mode Home { send -X start-of-line }",
"bind -Tcopy-mode End { send -X end-of-line }",
@@ -705,7 +705,7 @@ key_bindings_init(void)
"bind -Tcopy-mode-vi n { send -X search-again }",
"bind -Tcopy-mode-vi o { send -X other-end }",
"bind -Tcopy-mode-vi q { send -X cancel }",
"bind -Tcopy-mode-vi r { send -X refresh-toggle }",
"bind -Tcopy-mode-vi r { send -X refresh-now }",
"bind -Tcopy-mode-vi t { command-prompt -P -1p'(jump to forward)' { send -X jump-to-forward -- '%%' } }",
"bind -Tcopy-mode-vi v { send -X rectangle-toggle }",
"bind -Tcopy-mode-vi w { send -X next-word }",

8
tmux.1
View File

@@ -1,4 +1,4 @@
.\" $OpenBSD: tmux.1,v 1.1153 2026/08/05 07:31:08 nicm Exp $
.\" $OpenBSD: tmux.1,v 1.1154 2026/08/05 12:23:25 nicm Exp $
.\"
.\" Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
.\"
@@ -2317,10 +2317,14 @@ the bottom and is paused while a selection is in progress.
.Xc
Turn off automatic refresh of the content from the pane.
.It Xo
.Ic refresh\-toggle
.Ic refresh\-now
(vi: r)
(emacs: r)
.Xc
Refresh the content from the pane once.
.It Xo
.Ic refresh\-toggle
.Xc
Toggle automatic refresh of the content from the pane.
.It Xo
.Ic scroll\-bottom

View File

@@ -1,4 +1,4 @@
/* $OpenBSD: window-copy.c,v 1.424 2026/07/29 17:42:56 nicm Exp $ */
/* $OpenBSD: window-copy.c,v 1.425 2026/08/05 12:23:25 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -54,6 +54,7 @@ static void window_copy_redraw_screen(struct window_mode_entry *);
static void window_copy_do_refresh(struct window_mode_entry *, int);
static void window_copy_refresh_timer(int, short, void *);
static void window_copy_refresh_arm(struct window_mode_entry *);
static int window_copy_refresh_allowed(struct window_mode_entry *);
static void window_copy_refresh_start(struct window_mode_entry *);
static void window_copy_refresh_stop(struct window_mode_entry *);
static void window_copy_style_changed(struct window_mode_entry *);
@@ -3036,6 +3037,20 @@ window_copy_refresh_arm(struct window_mode_entry *wme)
evtimer_add(&data->refresh_timer, &tv);
}
static int
window_copy_refresh_allowed(struct window_mode_entry *wme)
{
struct window_copy_mode_data *data = wme->data;
/*
* Do not refresh a view of another pane (copy-mode -s): the source may
* disappear and changes are not tracked on this pane.
*/
if (data->viewmode || wme->swp != wme->wp)
return (0);
return (1);
}
static void
window_copy_refresh_timer(__unused int fd, __unused short events, void *arg)
{
@@ -3070,11 +3085,7 @@ window_copy_refresh_start(struct window_mode_entry *wme)
{
struct window_copy_mode_data *data = wme->data;
/*
* Do not refresh a view of another pane (copy-mode -s): the source may
* disappear and changes are not tracked on this pane.
*/
if (data->viewmode || wme->swp != wme->wp || data->refresh_active)
if (!window_copy_refresh_allowed(wme) || data->refresh_active)
return;
data->refresh_active = 1;
window_copy_refresh_arm(wme);
@@ -3089,6 +3100,25 @@ window_copy_refresh_stop(struct window_mode_entry *wme)
evtimer_del(&data->refresh_timer);
}
static enum window_copy_cmd_action
window_copy_cmd_refresh_now(struct window_copy_cmd_state *cs)
{
struct window_mode_entry *wme = cs->wme;
struct window_copy_mode_data *data = wme->data;
struct window_pane *wp = wme->wp;
int follow;
if (!window_copy_refresh_allowed(wme))
return (WINDOW_COPY_CMD_NOTHING);
follow = (data->oy == 0 &&
data->cy == screen_size_y(&data->screen) - 1);
window_copy_do_refresh(wme, follow);
wp->flags &= ~PANE_UNSEENCHANGES;
return (WINDOW_COPY_CMD_REDRAW);
}
static enum window_copy_cmd_action
window_copy_cmd_refresh_on(struct window_copy_cmd_state *cs)
{
@@ -3631,6 +3661,12 @@ static const struct {
.clear = WINDOW_COPY_CMD_CLEAR_NEVER,
.f = window_copy_cmd_refresh_off
},
{ .command = "refresh-now",
.args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,
.clear = WINDOW_COPY_CMD_CLEAR_NEVER,
.f = window_copy_cmd_refresh_now
},
{ .command = "refresh-toggle",
.args = { "", 0, 0, NULL },
.flags = WINDOW_COPY_CMD_FLAG_READONLY,