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

Lap*_*try 7 symlink tmux

当我通过创建TMUX新窗口/窗格中,例如tmux neww或按键绑定prefix+c,prefix+%等等,新的面板被工作目录同一个窗格,但在路径解引用符号链接.

例如,如果我在

/home/user/my-link/a
Run Code Online (Sandbox Code Playgroud)

在哪里my-link -> /mnt/user/,我得到了

/mnt/user/a
Run Code Online (Sandbox Code Playgroud)

显式传递新目录tmux也不起作用:

tmux neww -c $(pwd)
Run Code Online (Sandbox Code Playgroud)

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

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

Phi*_*ler 6

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

在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"
Run Code Online (Sandbox Code Playgroud)


Lap*_*try 4

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

事实证明,tmux光靠自己是无法解决问题的,我们需要一些技巧。

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

# get $pane set to pane id without %
tmux set-environment TMUX_"$pane"_PATH $(pwd)
Run Code Online (Sandbox Code Playgroud)

其次,有路径 script 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
Run Code Online (Sandbox Code Playgroud)

第三,在tmux.conf

bind C \
    run "tmux-neww.sh #{pane_id}"
Run Code Online (Sandbox Code Playgroud)

第四,我测试了bash.bashrcshell 是否在tmux. 如果是这样,它会进行一些更改(即添加一些变量,我的重提示将向 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
Run Code Online (Sandbox Code Playgroud)

这可能令人难以承受,但效果还不错。