Tmux忘记了创建会话的目录


8

当我在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

Answers:


21

从tmux 1.9开始,默认路径选项已被删除

您可以使用以下命令在打开会话的目录中打开(名称中的“ client”会告诉我,这是您外壳程序中当前的tmux runnin,但是当在会话中切换会话时,似乎会切换路径)同一客户):

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}"

1
这是正确的答案。特别是在我的情况下的第二个选项。
Mike Rapadas 2014年

顺便说一句,在更改配置文件之前,请不要忘记关闭所有当前工作的tmux终端(包括后台),否则tmux不会加载新配置。
randomness2077 2014年

@lightmanhk您应该能够:source〜/ .tmux.conf
David C. Bishop

1
有什么方法可以概括窗格拆分吗?split-window -h "#{pane_current_path}"将无法工作...
2014年

1
@Bach尝试使用-c。split-window -h -c "#{pane_current_path}"
David C. Bishop

3

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

new-window命令带有-c标志,它将允许您指定新窗口的当前目录。默认情况下,它是一个空字符串,它将使用当前窗格的工作目录作为新窗口的目录。传递a -作为-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 -

0

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

综上所述:

从tmux常见问题解答中,一种钝(但非常普遍且完全独立于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$ '

创建新窗口时,应要求外壳程序更改目录。您可以定义一个新的绑定(例如,如果使用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 neww

从您的外壳程序将在该目录中打开tmux。

如果您希望能够从tmux中的当前工作目录中打开新窗口或窗格,则应该改为:

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


海象,感谢您的帮助。我在unix.stackexchange上看到了这个问题,并阅读了FAQ。但是,这些不是我的问题的答案。
Shamaoke 2012年

1
当您创建新会话时,您在该会话中打开的每个新窗口或窗格的当前目录都将是您在其中启动会话的目录。如果我创建一个会话,则为true。但是,当我打开一个新的终端窗口并在其中启动另一个会话时,每个新窗口的当前工作目录将是我启动第一个会话的目录,而不是当前的目录。这显然是tmux 1.6中的错误,因为当我将其降级到1.3版时,该错误没有出现。
Shamaoke 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.