From 7f2ac9c8718355a88d3c21ef127fd0292e7d3013 Mon Sep 17 00:00:00 2001 From: nicm Date: Sat, 4 Apr 2026 17:00:33 +0000 Subject: [PATCH] Add remain-on-exit key to keep pane around until a key is pressed, from Michael Grant. --- options-table.c | 7 ++++--- server-client.c | 9 +++++++++ server-fn.c | 1 + tmux.1 | 5 ++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/options-table.c b/options-table.c index 8101a92c..55abe679 100644 --- a/options-table.c +++ b/options-table.c @@ -92,7 +92,7 @@ static const char *options_table_window_size_list[] = { "largest", "smallest", "manual", "latest", NULL }; static const char *options_table_remain_on_exit_list[] = { - "off", "on", "failed", NULL + "off", "on", "failed", "key", NULL }; static const char *options_table_destroy_unattached_list[] = { "off", "on", "keep-last", "keep-group", NULL @@ -1408,8 +1408,9 @@ const struct options_table_entry options_table[] = { .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE, .choices = options_table_remain_on_exit_list, .default_num = 0, - .text = "Whether panes should remain ('on') or be automatically " - "killed ('off' or 'failed') when the program inside exits." + .text = "Whether panes should remain ('on'), remain until a key is " + "pressed ('key') or be automatically killed ('off' or " + "'failed') when the program inside exits." }, { .name = "remain-on-exit-format", diff --git a/server-client.c b/server-client.c index ca57d397..88de60d0 100644 --- a/server-client.c +++ b/server-client.c @@ -1359,6 +1359,15 @@ try_again: } forward_key: + if (wp != NULL && + (wp->flags & PANE_EXITED) && + !KEYC_IS_MOUSE(key) && + !KEYC_IS_PASTE(key) && + options_get_number(wp->options, "remain-on-exit") == 3) { + options_set_number(wp->options, "remain-on-exit", 0); + server_destroy_pane(wp, 0); + goto out; + } if (c->flags & CLIENT_READONLY) goto out; if (wp != NULL) diff --git a/server-fn.c b/server-fn.c index c36dc74f..6c4c9c61 100644 --- a/server-fn.c +++ b/server-fn.c @@ -341,6 +341,7 @@ server_destroy_pane(struct window_pane *wp, int notify) break; /* FALLTHROUGH */ case 1: + case 3: if (wp->flags & PANE_STATUSDRAWN) return; wp->flags |= PANE_STATUSDRAWN; diff --git a/tmux.1 b/tmux.1 index 9c2932ad..5a457420 100644 --- a/tmux.1 +++ b/tmux.1 @@ -5569,13 +5569,16 @@ uses when the colour with that index is requested. The index may be from zero to 255. .Pp .It Xo Ic remain\-on\-exit -.Op Ic on | off | failed +.Op Ic on | off | failed | key .Xc A pane with this flag set is not destroyed when the program running in it exits. If set to .Ic failed , then only when the program exit status is not zero. +If set to +.Ic key , +the pane stays open and closes when a key is pressed. The pane may be reactivated with the .Ic respawn\-pane command.