创建新窗口/窗格时,停止Tmux取消引用路径

时间:2015-10-03 13:27:19

标签: symlink tmux

当我在tmux中创建新的窗口/窗格时,例如通过tmux neww或键绑定prefix+cprefix+%等,新窗格的工作目录与上一个窗格相同,但是在路径中取消引用符号链接。

例如,如果我在

/home/user/my-link/a

my-link -> /mnt/user/,我到了

/mnt/user/a

将新目录明确传递给tmux也不起作用:

tmux neww -c $(pwd)

我可以禁用此类解除引用吗?我想我可以通过tmux环境变量编写一个解决方法,但我想要一个更清晰的解决方案。

我在Ubuntu 14.04上从repos运行tmux 1.8。

3 个答案:

答案 0 :(得分:6)

无法禁用此行为,似乎甚至无法在tmux(source)中实现此功能。

在Linux中,始终将进程的工作目录作为实际目录进行跟踪(解析符号链接)。您可以通过在ls -l /proc/self/cwd目录中发出/home/user/my-link/a来查看此信息,它将显示当前工作目录实际上是/mnt/user/a。原因可能是当进程在该目录中时删除(甚至更改)符号链接时没有遇到麻烦。

shell将/home/user/my-link/a显示为工作目录的功能完全在shell本身中实现。它在pwd环境变量中跟踪它,但tmux无法访问子进程的环境变量。

我发现按照您的意愿创建新窗口的最简单方法是

tmux neww "cd $(pwd); exec $SHELL"

答案 1 :(得分:3)

总结Philipp Wendler和Yacc的所有答案和评论,我提出了适合我的解决方案。我应该在我的机器上使用一些技巧,因此应该小心使用它们。

有人证明tmux无法解决问题,我们需要一些技巧。

首先,让每个窗格在tmux变量TMUX_<pane-id>_PATH中描述它的路径。这可以通过别名cd或提示代码(我正在使用它)来完成,这并不重要:

# get $pane set to pane id without %
tmux set-environment TMUX_"$pane"_PATH $(pwd)

其次,有路径脚本tmux-neww.sh。它将NEWW变量设置为当前实际路径的方式。它将当前窗格id作为参数:

#!/bin/bash
pane=$(echo "$1" | tr -d '%')
pane_path=$(tmux show-environment TMUX_"$pane"_PATH | sed 's/^[^=]*=//g')
tmux set-environment NEWW "$pane_path"
tmux neww

第三,tmux.conf

bind C \
    run "tmux-neww.sh #{pane_id}"

第四,我在bash.bashrc测试中,如果正在tmux中运行shell。如果是这样,它会进行一些更改(即添加一些变量,我的重度提示会将一些数据发送到tmux变量)。如果设置了NEWW,它会在这里进行测试:

neww=$(tmux show-environment NEWW 2> /dev/null | sed 's/^[^=]*=//')
if [ "$neww" != "-NEWW" ] && [ "$neww" != "" ] ; then
    cd "$neww"
fi
tmux set-environment -r NEWW

这可能是压倒性的,但可以正常工作。

答案 2 :(得分:2)

除了Philipp的答案之外,还有一种方法可以解决运行时替换问题。您只需要注意每次更改目录时,使用$ PWD更新全局tmux变量PWD。 在.bashrc中:

mycd() {
  \cd "$@"
  [ -n "$TMUX" ] && tmux set-environment -g PWD $PWD
}
alias cd=mycd

在.tmux.conf中:

bind-key C-n new-window