Add a variant of remain-on-exit that only keeps the pane if the program

failed, GitHub issue 2513.
This commit is contained in:
nicm
2021-01-04 08:43:16 +00:00
parent 606bd5f8c6
commit bd0fb22f0a
3 changed files with 22 additions and 7 deletions

View File

@ -69,6 +69,9 @@ static const char *options_table_set_clipboard_list[] = {
static const char *options_table_window_size_list[] = { static const char *options_table_window_size_list[] = {
"largest", "smallest", "manual", "latest", NULL "largest", "smallest", "manual", "latest", NULL
}; };
static const char *options_table_remain_on_exit_list[] = {
"off", "on", "failed", NULL
};
/* Status line format. */ /* Status line format. */
#define OPTIONS_TABLE_STATUS_FORMAT1 \ #define OPTIONS_TABLE_STATUS_FORMAT1 \
@ -949,11 +952,12 @@ const struct options_table_entry options_table[] = {
}, },
{ .name = "remain-on-exit", { .name = "remain-on-exit",
.type = OPTIONS_TABLE_FLAG, .type = OPTIONS_TABLE_CHOICE,
.scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE, .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
.choices = options_table_remain_on_exit_list,
.default_num = 0, .default_num = 0,
.text = "Whether panes should remain ('on') or be automatically " .text = "Whether panes should remain ('on') or be automatically "
"killed ('off') when the program inside exits." "killed ('off' or 'failed') when the program inside exits."
}, },
{ .name = "synchronize-panes", { .name = "synchronize-panes",

View File

@ -314,6 +314,7 @@ server_destroy_pane(struct window_pane *wp, int notify)
struct grid_cell gc; struct grid_cell gc;
time_t t; time_t t;
char tim[26]; char tim[26];
int remain_on_exit;
if (wp->fd != -1) { if (wp->fd != -1) {
bufferevent_free(wp->event); bufferevent_free(wp->event);
@ -322,10 +323,17 @@ server_destroy_pane(struct window_pane *wp, int notify)
wp->fd = -1; wp->fd = -1;
} }
if (options_get_number(wp->options, "remain-on-exit")) { remain_on_exit = options_get_number(wp->options, "remain-on-exit");
if (~wp->flags & PANE_STATUSREADY) if (remain_on_exit != 0 && (~wp->flags & PANE_STATUSREADY))
return; return;
switch (remain_on_exit) {
case 0:
break;
case 2:
if (WIFEXITED(wp->status) && WEXITSTATUS(wp->status) == 0)
break;
/* FALLTHROUGH */
case 1:
if (wp->flags & PANE_STATUSDRAWN) if (wp->flags & PANE_STATUSDRAWN)
return; return;
wp->flags |= PANE_STATUSDRAWN; wp->flags |= PANE_STATUSDRAWN;

5
tmux.1
View File

@ -4181,10 +4181,13 @@ interactive application starts and restores it on exit, so that any output
visible before the application starts reappears unchanged after it exits. visible before the application starts reappears unchanged after it exits.
.Pp .Pp
.It Xo Ic remain-on-exit .It Xo Ic remain-on-exit
.Op Ic on | off .Op Ic on | off | failed
.Xc .Xc
A pane with this flag set is not destroyed when the program running in it A pane with this flag set is not destroyed when the program running in it
exits. exits.
If set to
.Ic failed ,
then only when the program exit status is not zero.
The pane may be reactivated with the The pane may be reactivated with the
.Ic respawn-pane .Ic respawn-pane
command. command.