Add options to new-pane: -k -m message to wait for key before closing a floating pane.

This commit is contained in:
Michael Grant
2026-03-24 14:23:58 +00:00
parent f201d246fd
commit 6a62d49720
4 changed files with 23 additions and 6 deletions

View File

@@ -35,9 +35,9 @@ const struct cmd_entry cmd_new_pane_entry = {
.name = "new-pane",
.alias = "newp",
.args = { "bc:de:fF:h:Il:p:Pt:w:x:y:Z", 0, -1, NULL },
.usage = "[-bdefhIPvZ] [-c start-directory] [-e environment] "
"[-F format] [-l size] " CMD_TARGET_PANE_USAGE
.args = { "bc:de:fF:h:Iklm:p:Pt:w:x:y:Z", 0, -1, NULL },
.usage = "[-bdefhIklPvZ] [-c start-directory] [-e environment] "
"[-F format] [-l size] [-m message] " CMD_TARGET_PANE_USAGE
" [shell-command [argument ...]]",
.target = { 't', CMD_FIND_PANE, 0 },
@@ -204,6 +204,12 @@ cmd_new_pane_exec(struct cmd *self, struct cmdq_item *item)
environ_free(sc.environ);
return (CMD_RETURN_ERROR);
}
if (args_has(args, 'k') || args_has(args, 'm')) {
options_set_number(new_wp->options, "remain-on-exit", 3);
if (args_has(args, 'm'))
options_set_string(new_wp->options, "remain-on-exit-format",
0, "%s", args_get(args, 'm'));
}
if (input) {
switch (window_pane_start_input(new_wp, item, &cause)) {
case -1:

View File

@@ -91,7 +91,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", "keypress", NULL
};
static const char *options_table_destroy_unattached_list[] = {
"off", "on", "keep-last", "keep-group", NULL
@@ -1414,7 +1414,7 @@ const struct options_table_entry options_table[] = {
{ .name = "remain-on-exit-format",
.type = OPTIONS_TABLE_STRING,
.scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
.default_str = "Pane is dead ("
.default_str = "Command exited ("
"#{?#{!=:#{pane_dead_status},},"
"status #{pane_dead_status},}"
"#{?#{!=:#{pane_dead_signal},},"

View File

@@ -2665,6 +2665,14 @@ try_again:
forward_key:
if (c->flags & CLIENT_READONLY)
goto out;
if (wp != NULL &&
options_get_number(wp->options, "remain-on-exit") == 3 &&
(wp->flags & PANE_EXITED) &&
!KEYC_IS_MOUSE(key) && !KEYC_IS_PASTE(key)) {
options_set_number(wp->options, "remain-on-exit", 0);
server_destroy_pane(wp, 0);
goto out;
}
if (wp != NULL)
window_pane_key(wp, c, s, wl, key, m);
goto out;

View File

@@ -339,8 +339,11 @@ server_destroy_pane(struct window_pane *wp, int notify)
switch (remain_on_exit) {
case 0:
break;
case 3: /* keypress — fall through to draw remain-on-exit-format message */
/* FALLTHROUGH */
case 2:
if (WIFEXITED(wp->status) && WEXITSTATUS(wp->status) == 0)
if (remain_on_exit == 2 &&
WIFEXITED(wp->status) && WEXITSTATUS(wp->status) == 0)
break;
/* FALLTHROUGH */
case 1: