mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Add a variant of remain-on-exit that only keeps the pane if the program
failed, GitHub issue 2513.
This commit is contained in:
		@@ -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",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								server-fn.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								server-fn.c
									
									
									
									
									
								
							@@ -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
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								tmux.1
									
									
									
									
									
								
							@@ -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.
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user