mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Store the current working directory in the session, change the default-path
option to default to empty and make that mean that the stored session CWD is used.
This commit is contained in:
		@@ -18,8 +18,10 @@
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include <pwd.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <termios.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#include "tmux.h"
 | 
			
		||||
 | 
			
		||||
@@ -125,8 +127,9 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
	struct window_pane		*wp;
 | 
			
		||||
	struct environ			 env;
 | 
			
		||||
	struct termios			 tio, *tiop;
 | 
			
		||||
	const char			*update;
 | 
			
		||||
	char				*overrides, *cmd, *cwd, *cause;
 | 
			
		||||
	struct passwd			*pw;
 | 
			
		||||
	const char			*update, *cwd;
 | 
			
		||||
	char				*overrides, *cmd, *cause;
 | 
			
		||||
	int				 detached, idx;
 | 
			
		||||
	u_int				 sx, sy, i;
 | 
			
		||||
 | 
			
		||||
@@ -198,8 +201,13 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
	/* Get the new session working directory. */
 | 
			
		||||
	if (ctx->cmdclient != NULL && ctx->cmdclient->cwd != NULL)
 | 
			
		||||
		cwd = ctx->cmdclient->cwd;
 | 
			
		||||
	else
 | 
			
		||||
		cwd = options_get_string(&global_s_options, "default-path");
 | 
			
		||||
	else {
 | 
			
		||||
		pw = getpwuid(getuid());
 | 
			
		||||
		if (pw->pw_dir != NULL && *pw->pw_dir != '\0')
 | 
			
		||||
			cwd = pw->pw_dir;
 | 
			
		||||
		else
 | 
			
		||||
			cwd = "/";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Find new session size. */
 | 
			
		||||
	if (detached) {
 | 
			
		||||
 
 | 
			
		||||
@@ -176,10 +176,13 @@ cmd_new_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
	cmd = data->cmd;
 | 
			
		||||
	if (cmd == NULL)
 | 
			
		||||
		cmd = options_get_string(&s->options, "default-command");
 | 
			
		||||
	if (ctx->cmdclient == NULL || ctx->cmdclient->cwd == NULL)
 | 
			
		||||
		cwd = options_get_string(&s->options, "default-path");
 | 
			
		||||
	else
 | 
			
		||||
		cwd = ctx->cmdclient->cwd;
 | 
			
		||||
	cwd = options_get_string(&s->options, "default-path");
 | 
			
		||||
	if (*cwd == '\0') {
 | 
			
		||||
		if (ctx->cmdclient != NULL && ctx->cmdclient->cwd != NULL)
 | 
			
		||||
			cwd = ctx->cmdclient->cwd;
 | 
			
		||||
		else
 | 
			
		||||
			cwd = s->cwd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (idx == -1)
 | 
			
		||||
		idx = -1 - options_get_number(&s->options, "base-index");
 | 
			
		||||
 
 | 
			
		||||
@@ -170,10 +170,13 @@ cmd_split_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
	cmd = data->cmd;
 | 
			
		||||
	if (cmd == NULL)
 | 
			
		||||
		cmd = options_get_string(&s->options, "default-command");
 | 
			
		||||
	if (ctx->cmdclient == NULL || ctx->cmdclient->cwd == NULL)
 | 
			
		||||
		cwd = options_get_string(&s->options, "default-path");
 | 
			
		||||
	else
 | 
			
		||||
		cwd = ctx->cmdclient->cwd;
 | 
			
		||||
	cwd = options_get_string(&s->options, "default-path");
 | 
			
		||||
	if (*cwd == '\0') {
 | 
			
		||||
		if (ctx->cmdclient != NULL && ctx->cmdclient->cwd != NULL)
 | 
			
		||||
			cwd = ctx->cmdclient->cwd;
 | 
			
		||||
		else
 | 
			
		||||
			cwd = s->cwd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type = LAYOUT_TOPBOTTOM;
 | 
			
		||||
	if (data->flag_horizontal)
 | 
			
		||||
 
 | 
			
		||||
@@ -68,6 +68,8 @@ session_create(const char *name, const char *cmd, const char *cwd,
 | 
			
		||||
		fatal("gettimeofday failed");
 | 
			
		||||
	memcpy(&s->activity_time, &s->creation_time, sizeof s->activity_time);
 | 
			
		||||
 | 
			
		||||
	s->cwd = xstrdup(cwd);
 | 
			
		||||
 | 
			
		||||
	s->curw = NULL;
 | 
			
		||||
	TAILQ_INIT(&s->lastw);
 | 
			
		||||
	RB_INIT(&s->windows);
 | 
			
		||||
@@ -142,6 +144,7 @@ session_destroy(struct session *s)
 | 
			
		||||
	while (!RB_EMPTY(&s->windows))
 | 
			
		||||
		winlink_remove(&s->windows, RB_ROOT(&s->windows));
 | 
			
		||||
 | 
			
		||||
	xfree(s->cwd);
 | 
			
		||||
	xfree(s->name);
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < ARRAY_LENGTH(&dead_sessions); i++) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								tmux.1
									
									
									
									
									
								
							@@ -1626,7 +1626,8 @@ is used as a login shell.
 | 
			
		||||
.It Ic default-path Ar path
 | 
			
		||||
Set the default working directory for processes created from keys, or
 | 
			
		||||
interactively from the prompt.
 | 
			
		||||
The default is the current working directory when the server is started.
 | 
			
		||||
The default is empty, which means to use the working directory of the shell
 | 
			
		||||
from which the server was started if it is available or the user's home if not.
 | 
			
		||||
.It Ic default-terminal Ar terminal
 | 
			
		||||
Set the default terminal for new windows created in this session - the
 | 
			
		||||
default value of the
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								tmux.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								tmux.c
									
									
									
									
									
								
							@@ -239,7 +239,7 @@ main(int argc, char **argv)
 | 
			
		||||
	struct env_data		 envdata;
 | 
			
		||||
	struct msg_command_data	 cmddata;
 | 
			
		||||
	char			*s, *shellcmd, *path, *label, *home, *cause;
 | 
			
		||||
	char			 cwd[MAXPATHLEN], **var;
 | 
			
		||||
	char		       **var;
 | 
			
		||||
	void			*buf;
 | 
			
		||||
	size_t			 len;
 | 
			
		||||
	int	 		 opt, flags, quiet = 0, cmdflags = 0;
 | 
			
		||||
@@ -339,6 +339,7 @@ main(int argc, char **argv)
 | 
			
		||||
	options_set_number(so, "bell-action", BELL_ANY);
 | 
			
		||||
	options_set_number(so, "buffer-limit", 9);
 | 
			
		||||
	options_set_string(so, "default-command", "%s", "");
 | 
			
		||||
	options_set_string(so, "default-path", "%s", "");
 | 
			
		||||
	options_set_string(so, "default-shell", "%s", getshell());
 | 
			
		||||
	options_set_string(so, "default-terminal", "screen");
 | 
			
		||||
	options_set_number(so, "detach-on-destroy", 1);
 | 
			
		||||
@@ -435,15 +436,6 @@ main(int argc, char **argv)
 | 
			
		||||
		options_set_number(wo, "utf8", 0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (getcwd(cwd, sizeof cwd) == NULL) {
 | 
			
		||||
		pw = getpwuid(getuid());
 | 
			
		||||
		if (pw->pw_dir != NULL && *pw->pw_dir != '\0')
 | 
			
		||||
			strlcpy(cwd, pw->pw_dir, sizeof cwd);
 | 
			
		||||
		else
 | 
			
		||||
			strlcpy(cwd, "/", sizeof cwd);
 | 
			
		||||
	}
 | 
			
		||||
	options_set_string(so, "default-path", "%s", cwd);
 | 
			
		||||
 | 
			
		||||
	if (cfg_file == NULL) {
 | 
			
		||||
		home = getenv("HOME");
 | 
			
		||||
		if (home == NULL || *home == '\0') {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user