当我通过创建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.
无法禁用此行为,似乎甚至无法在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)
总结 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.bashrc
shell 是否在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)
这可能令人难以承受,但效果还不错。