Tmux 忘记了会话创建的目录

Tmux 忘记了会话创建的目录

当我在 tmux 中创建多个会话时,后续会话中每个新窗口的当前目录都设置为第一个会话的当前目录。

例如:

-> cd /home/one && tmux new-session -n one\; new-window -n two
   # /home/one is the current directory for each window

-> cd /home/two && tmux new-session -n three\; new-window -n four #\; etc.
   # "/home/two" is the current directory for the window "three"
   # but for the window "four" and other created windows it is "/home/one"

我如何强制 tmux 将后续会话中每个新窗口的当前目录设置为创建会话的目录?

tmux 1.6

zsh 4.3

答案1

从 tmux 1.9 开始,default-path 选项已被删除

您可以使用以下命令在会话打开的目录中打开(名称中的“客户端”会向我表明它是当前在您的 shell 中运行的 tmux,但在同一客户端中的会话之间切换时似乎会切换路径):

bind-key c  new-window -c "#{client_cwd}"

否则复制当前窗格的路径:

bind-key c  new-window -c "#{pane_current_path}"

还有 pane_start_path 可能会对某些工作流程有吸引力。

bind-key c  new-window -c "#{pane_start_path}"

对于分割窗口命令。

bind-key % split-window -h -c "#{pane_current_path}"
bind-key '"' split-window -c "#{pane_current_path}"

答案2

我意识到这个问题已经很老了,但是当我自己寻找答案时,它是 StackExchange 上出现的唯一问题之一,所以这里是我针对 tmux 1.8 解决它的方法。

new-window命令使用-c标志来指定新窗口的当前目录。默认情况下,它是一个空字符串,它将使用当前窗格的工作目录作为新窗口的目录。传入标志-的值-c将把新窗口的目录设置为会话打开的目录。

以下是文档的摘录:

-c specifies the working directory in which the new window is created.  It may 
have an absolute path or one of the following values (or a subdirectory):

       Empty string    Current pane's directory
       ~               User's home directory
       -               Where session was started
       .               Where server was started

如果您想更改<PREFIX> c键绑定的默认行为以反映这一点,请按照我的做法操作~/.tmux.conf

bind-key c   new-window -c -

答案3

这里有很多答案:https://unix.stackexchange.com/questions/12032/create-new-window-with-current-directory-in-tmux

总之:

从 tmux FAQ 中,有一个难以理解的(但非常通用并且相当独立于 shell 的)方法:

  • 如何在与当前窗口相同的目录中打开一个新窗口?

一个选项是在窗口中运行“TMUX= tmux”。但是,这仅在没有命令运行时才有效,这样您才能输入命令。

一种解决方法是通过环境变量让 tmux 知道当前路径。为此,请使用以下命令:

[ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#I") $PWD

将 TMUXPWD_i(其中 i 是当前窗口的编号)设置为当前目录的路径。此命令可以添加到 PS1,例如:

PS1='$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#I") $PWD)\h$ '

创建新窗口时,应要求 shell 更改目录。您可以定义新的绑定(例如,如果使用 GNU bash):

bind-key C-c run-shell 'tmux neww "cd $(tmux display -p "\$TMUXPWD_#I"); exec bash"'

即使命令当前正在终端中运行,此解决方案仍可行,但它无法在刚刚与另一个窗口交换的窗口中工作,因为交换后 TMUXPWD_i 将不会更新。但是,一旦显示新的提示,TMUXPWD_i 就会正确更新。

只需根据您的需要替换对 shell 的调用即可。

此外,显然新版本的 tmux 已经通过命令解决了这个问题

tmux 新窗口

旧版本据称是这样工作的:

呼叫

tmux 新

从你的 shell 将在该目录中打开 tmux。

如果您希望能够从 tmux 中的当前工作目录打开新窗口或窗格,那么您应该这样做:

tmux 设置选项默认路径“$PWD”

相关内容