mirror of
https://github.com/tmux/tmux.git
synced 2025-01-08 00:38:47 +00:00
Add a flag to cmd_find_session so that attach-session can prefer
unattached sessions when choosing the most recently used (if -t is not given). Suggested by claudio@.
This commit is contained in:
parent
f16ea60cc0
commit
5d519ba526
@ -51,7 +51,7 @@ cmd_attach_session_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((s = cmd_find_session(ctx, args_get(args, 't'))) == NULL)
|
if ((s = cmd_find_session(ctx, args_get(args, 't'), 1)) == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
if (ctx->cmdclient == NULL && ctx->curclient == NULL)
|
if (ctx->cmdclient == NULL && ctx->curclient == NULL)
|
||||||
|
@ -41,7 +41,7 @@ cmd_has_session_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
{
|
{
|
||||||
struct args *args = self->args;
|
struct args *args = self->args;
|
||||||
|
|
||||||
if (cmd_find_session(ctx, args_get(args, 't')) == NULL)
|
if (cmd_find_session(ctx, args_get(args, 't'), 0) == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
|
@ -45,7 +45,7 @@ cmd_kill_session_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
struct args *args = self->args;
|
struct args *args = self->args;
|
||||||
struct session *s;
|
struct session *s;
|
||||||
|
|
||||||
if ((s = cmd_find_session(ctx, args_get(args, 't'))) == NULL)
|
if ((s = cmd_find_session(ctx, args_get(args, 't'), 0)) == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
server_destroy_session(s);
|
server_destroy_session(s);
|
||||||
|
@ -52,7 +52,7 @@ cmd_list_panes_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
if (args_has(args, 'a'))
|
if (args_has(args, 'a'))
|
||||||
cmd_list_panes_server(ctx);
|
cmd_list_panes_server(ctx);
|
||||||
else if (args_has(args, 's')) {
|
else if (args_has(args, 's')) {
|
||||||
s = cmd_find_session(ctx, args_get(args, 't'));
|
s = cmd_find_session(ctx, args_get(args, 't'), 0);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
cmd_list_panes_session(s, ctx);
|
cmd_list_panes_session(s, ctx);
|
||||||
|
@ -50,7 +50,7 @@ cmd_list_windows_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
if (args_has(args, 'a'))
|
if (args_has(args, 'a'))
|
||||||
cmd_list_windows_server(ctx);
|
cmd_list_windows_server(ctx);
|
||||||
else {
|
else {
|
||||||
s = cmd_find_session(ctx, args_get(args, 't'));
|
s = cmd_find_session(ctx, args_get(args, 't'), 0);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
cmd_list_windows_session(s, ctx);
|
cmd_list_windows_session(s, ctx);
|
||||||
|
@ -71,7 +71,7 @@ cmd_lock_server_exec(struct cmd *self, unused struct cmd_ctx *ctx)
|
|||||||
if (self->entry == &cmd_lock_server_entry)
|
if (self->entry == &cmd_lock_server_entry)
|
||||||
server_lock();
|
server_lock();
|
||||||
else if (self->entry == &cmd_lock_session_entry) {
|
else if (self->entry == &cmd_lock_session_entry) {
|
||||||
if ((s = cmd_find_session(ctx, args_get(args, 't'))) == NULL)
|
if ((s = cmd_find_session(ctx, args_get(args, 't'), 0)) == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
server_lock_session(s);
|
server_lock_session(s);
|
||||||
} else {
|
} else {
|
||||||
|
@ -75,7 +75,7 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
|
|
||||||
target = args_get(args, 't');
|
target = args_get(args, 't');
|
||||||
if (target != NULL) {
|
if (target != NULL) {
|
||||||
groupwith = cmd_find_session(ctx, target);
|
groupwith = cmd_find_session(ctx, target, 0);
|
||||||
if (groupwith == NULL)
|
if (groupwith == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
} else
|
} else
|
||||||
|
@ -51,7 +51,7 @@ cmd_rename_session_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((s = cmd_find_session(ctx, args_get(args, 't'))) == NULL)
|
if ((s = cmd_find_session(ctx, args_get(args, 't'), 0)) == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
RB_REMOVE(sessions, &sessions, s);
|
RB_REMOVE(sessions, &sessions, s);
|
||||||
|
@ -102,7 +102,7 @@ cmd_select_window_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
last = 1;
|
last = 1;
|
||||||
|
|
||||||
if (next || previous || last) {
|
if (next || previous || last) {
|
||||||
s = cmd_find_session(ctx, args_get(args, 't'));
|
s = cmd_find_session(ctx, args_get(args, 't'), 0);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ cmd_set_environment_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
if (args_has(self->args, 'g'))
|
if (args_has(self->args, 'g'))
|
||||||
env = &global_environ;
|
env = &global_environ;
|
||||||
else {
|
else {
|
||||||
if ((s = cmd_find_session(ctx, args_get(args, 't'))) == NULL)
|
if ((s = cmd_find_session(ctx, args_get(args, 't'), 0)) == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
env = &s->environ;
|
env = &s->environ;
|
||||||
}
|
}
|
||||||
|
@ -164,7 +164,7 @@ cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
if (args_has(self->args, 'g'))
|
if (args_has(self->args, 'g'))
|
||||||
oo = &global_s_options;
|
oo = &global_s_options;
|
||||||
else {
|
else {
|
||||||
s = cmd_find_session(ctx, args_get(args, 't'));
|
s = cmd_find_session(ctx, args_get(args, 't'), 0);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
oo = &s->options;
|
oo = &s->options;
|
||||||
|
@ -49,7 +49,7 @@ cmd_show_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
size_t size, len;
|
size_t size, len;
|
||||||
u_int width;
|
u_int width;
|
||||||
|
|
||||||
if ((s = cmd_find_session(ctx, NULL)) == NULL)
|
if ((s = cmd_find_session(ctx, NULL, 0)) == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
if (!args_has(args, 'b')) {
|
if (!args_has(args, 'b')) {
|
||||||
|
@ -50,7 +50,7 @@ cmd_show_environment_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
if (args_has(self->args, 'g'))
|
if (args_has(self->args, 'g'))
|
||||||
env = &global_environ;
|
env = &global_environ;
|
||||||
else {
|
else {
|
||||||
if ((s = cmd_find_session(ctx, args_get(args, 't'))) == NULL)
|
if ((s = cmd_find_session(ctx, args_get(args, 't'), 0)) == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
env = &s->environ;
|
env = &s->environ;
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ cmd_show_options_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
if (args_has(self->args, 'g'))
|
if (args_has(self->args, 'g'))
|
||||||
oo = &global_s_options;
|
oo = &global_s_options;
|
||||||
else {
|
else {
|
||||||
s = cmd_find_session(ctx, args_get(args, 't'));
|
s = cmd_find_session(ctx, args_get(args, 't'), 0);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
oo = &s->options;
|
oo = &s->options;
|
||||||
|
@ -86,7 +86,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
s = cmd_find_session(ctx, args_get(args, 't'));
|
s = cmd_find_session(ctx, args_get(args, 't'), 0);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
|
32
cmd.c
32
cmd.c
@ -112,7 +112,7 @@ const struct cmd_entry *cmd_table[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct session *cmd_choose_session_list(struct sessionslist *);
|
struct session *cmd_choose_session_list(struct sessionslist *);
|
||||||
struct session *cmd_choose_session(void);
|
struct session *cmd_choose_session(int);
|
||||||
struct client *cmd_choose_client(struct clients *);
|
struct client *cmd_choose_client(struct clients *);
|
||||||
struct client *cmd_lookup_client(const char *);
|
struct client *cmd_lookup_client(const char *);
|
||||||
struct session *cmd_lookup_session(const char *, int *);
|
struct session *cmd_lookup_session(const char *, int *);
|
||||||
@ -316,7 +316,7 @@ cmd_print(struct cmd *cmd, char *buf, size_t len)
|
|||||||
* session from all sessions.
|
* session from all sessions.
|
||||||
*/
|
*/
|
||||||
struct session *
|
struct session *
|
||||||
cmd_current_session(struct cmd_ctx *ctx)
|
cmd_current_session(struct cmd_ctx *ctx, int prefer_unattached)
|
||||||
{
|
{
|
||||||
struct msg_command_data *data = ctx->msgdata;
|
struct msg_command_data *data = ctx->msgdata;
|
||||||
struct client *c = ctx->cmdclient;
|
struct client *c = ctx->cmdclient;
|
||||||
@ -365,19 +365,25 @@ cmd_current_session(struct cmd_ctx *ctx)
|
|||||||
return (s);
|
return (s);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (cmd_choose_session());
|
return (cmd_choose_session(prefer_unattached));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the most recently used session. */
|
/*
|
||||||
|
* Find the most recently used session, preferring unattached if the flag is
|
||||||
|
* set.
|
||||||
|
*/
|
||||||
struct session *
|
struct session *
|
||||||
cmd_choose_session(void)
|
cmd_choose_session(int prefer_unattached)
|
||||||
{
|
{
|
||||||
struct session *s, *sbest;
|
struct session *s, *sbest;
|
||||||
struct timeval *tv = NULL;
|
struct timeval *tv = NULL;
|
||||||
|
|
||||||
sbest = NULL;
|
sbest = NULL;
|
||||||
RB_FOREACH(s, sessions, &sessions) {
|
RB_FOREACH(s, sessions, &sessions) {
|
||||||
if (tv == NULL || timercmp(&s->activity_time, tv, >)) {
|
if (tv == NULL || timercmp(&s->activity_time, tv, >) ||
|
||||||
|
(prefer_unattached &&
|
||||||
|
!(sbest->flags & SESSION_UNATTACHED) &&
|
||||||
|
(s->flags & SESSION_UNATTACHED))) {
|
||||||
sbest = s;
|
sbest = s;
|
||||||
tv = &s->activity_time;
|
tv = &s->activity_time;
|
||||||
}
|
}
|
||||||
@ -428,7 +434,7 @@ cmd_current_client(struct cmd_ctx *ctx)
|
|||||||
* No current client set. Find the current session and return the
|
* No current client set. Find the current session and return the
|
||||||
* newest of its clients.
|
* newest of its clients.
|
||||||
*/
|
*/
|
||||||
s = cmd_current_session(ctx);
|
s = cmd_current_session(ctx, 0);
|
||||||
if (s != NULL && !(s->flags & SESSION_UNATTACHED)) {
|
if (s != NULL && !(s->flags & SESSION_UNATTACHED)) {
|
||||||
ARRAY_INIT(&cc);
|
ARRAY_INIT(&cc);
|
||||||
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
|
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
|
||||||
@ -671,7 +677,7 @@ cmd_pane_session(struct cmd_ctx *ctx, struct window_pane *wp,
|
|||||||
struct winlink *wl;
|
struct winlink *wl;
|
||||||
|
|
||||||
/* If this pane is in the current session, return that winlink. */
|
/* If this pane is in the current session, return that winlink. */
|
||||||
s = cmd_current_session(ctx);
|
s = cmd_current_session(ctx, 0);
|
||||||
if (s != NULL) {
|
if (s != NULL) {
|
||||||
wl = winlink_find_by_window(&s->windows, wp->window);
|
wl = winlink_find_by_window(&s->windows, wp->window);
|
||||||
if (wl != NULL) {
|
if (wl != NULL) {
|
||||||
@ -696,7 +702,7 @@ cmd_pane_session(struct cmd_ctx *ctx, struct window_pane *wp,
|
|||||||
|
|
||||||
/* Find the target session or report an error and return NULL. */
|
/* Find the target session or report an error and return NULL. */
|
||||||
struct session *
|
struct session *
|
||||||
cmd_find_session(struct cmd_ctx *ctx, const char *arg)
|
cmd_find_session(struct cmd_ctx *ctx, const char *arg, int prefer_unattached)
|
||||||
{
|
{
|
||||||
struct session *s;
|
struct session *s;
|
||||||
struct window_pane *wp;
|
struct window_pane *wp;
|
||||||
@ -707,7 +713,7 @@ cmd_find_session(struct cmd_ctx *ctx, const char *arg)
|
|||||||
|
|
||||||
/* A NULL argument means the current session. */
|
/* A NULL argument means the current session. */
|
||||||
if (arg == NULL)
|
if (arg == NULL)
|
||||||
return (cmd_current_session(ctx));
|
return (cmd_current_session(ctx, prefer_unattached));
|
||||||
tmparg = xstrdup(arg);
|
tmparg = xstrdup(arg);
|
||||||
|
|
||||||
/* Lookup as pane id. */
|
/* Lookup as pane id. */
|
||||||
@ -753,7 +759,7 @@ cmd_find_window(struct cmd_ctx *ctx, const char *arg, struct session **sp)
|
|||||||
* Find the current session. There must always be a current session, if
|
* Find the current session. There must always be a current session, if
|
||||||
* it can't be found, report an error.
|
* it can't be found, report an error.
|
||||||
*/
|
*/
|
||||||
if ((s = cmd_current_session(ctx)) == NULL) {
|
if ((s = cmd_current_session(ctx, 0)) == NULL) {
|
||||||
ctx->error(ctx, "can't establish current session");
|
ctx->error(ctx, "can't establish current session");
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
@ -900,7 +906,7 @@ cmd_find_index(struct cmd_ctx *ctx, const char *arg, struct session **sp)
|
|||||||
* Find the current session. There must always be a current session, if
|
* Find the current session. There must always be a current session, if
|
||||||
* it can't be found, report an error.
|
* it can't be found, report an error.
|
||||||
*/
|
*/
|
||||||
if ((s = cmd_current_session(ctx)) == NULL) {
|
if ((s = cmd_current_session(ctx, 0)) == NULL) {
|
||||||
ctx->error(ctx, "can't establish current session");
|
ctx->error(ctx, "can't establish current session");
|
||||||
return (-2);
|
return (-2);
|
||||||
}
|
}
|
||||||
@ -1054,7 +1060,7 @@ cmd_find_pane(struct cmd_ctx *ctx,
|
|||||||
u_int idx;
|
u_int idx;
|
||||||
|
|
||||||
/* Get the current session. */
|
/* Get the current session. */
|
||||||
if ((s = cmd_current_session(ctx)) == NULL) {
|
if ((s = cmd_current_session(ctx, 0)) == NULL) {
|
||||||
ctx->error(ctx, "can't establish current session");
|
ctx->error(ctx, "can't establish current session");
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
11
tmux.1
11
tmux.1
@ -562,6 +562,17 @@ If no server is started,
|
|||||||
.Ic attach-session
|
.Ic attach-session
|
||||||
will attempt to start it; this will fail unless sessions are created in the
|
will attempt to start it; this will fail unless sessions are created in the
|
||||||
configuration file.
|
configuration file.
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Ar target-session
|
||||||
|
rules for
|
||||||
|
.Ic attach-session
|
||||||
|
are slightly adjusted: if
|
||||||
|
.Nm
|
||||||
|
needs to select the most recently used session, it will prefer the most
|
||||||
|
recently used
|
||||||
|
.Em unattached
|
||||||
|
session.
|
||||||
.It Xo Ic detach-client
|
.It Xo Ic detach-client
|
||||||
.Op Fl P
|
.Op Fl P
|
||||||
.Op Fl t Ar target-client
|
.Op Fl t Ar target-client
|
||||||
|
4
tmux.h
4
tmux.h
@ -1487,10 +1487,10 @@ struct cmd *cmd_parse(int, char **, char **);
|
|||||||
int cmd_exec(struct cmd *, struct cmd_ctx *);
|
int cmd_exec(struct cmd *, struct cmd_ctx *);
|
||||||
void cmd_free(struct cmd *);
|
void cmd_free(struct cmd *);
|
||||||
size_t cmd_print(struct cmd *, char *, size_t);
|
size_t cmd_print(struct cmd *, char *, size_t);
|
||||||
struct session *cmd_current_session(struct cmd_ctx *);
|
struct session *cmd_current_session(struct cmd_ctx *, int);
|
||||||
struct client *cmd_current_client(struct cmd_ctx *);
|
struct client *cmd_current_client(struct cmd_ctx *);
|
||||||
struct client *cmd_find_client(struct cmd_ctx *, const char *);
|
struct client *cmd_find_client(struct cmd_ctx *, const char *);
|
||||||
struct session *cmd_find_session(struct cmd_ctx *, const char *);
|
struct session *cmd_find_session(struct cmd_ctx *, const char *, int);
|
||||||
struct winlink *cmd_find_window(
|
struct winlink *cmd_find_window(
|
||||||
struct cmd_ctx *, const char *, struct session **);
|
struct cmd_ctx *, const char *, struct session **);
|
||||||
int cmd_find_index(
|
int cmd_find_index(
|
||||||
|
Loading…
Reference in New Issue
Block a user