我想创建一个外壳命令当运行时,设置的工作目录当前 tmux 会话到当前工作目录。
关于如何设置会话工作目录有许多已解答的问题;答案似乎是attach-session -t . -c /path/to/directory
在 tmux 命令提示符下运行。在我的(默认)配置下,那就是C-b : attach-session -t . -c /path/to/directory
.
我不想手动与 tmux 命令提示符交互;我想要一个简单的命令,主要是因为我不想处理键入或复制粘贴目标目录的问题。我知道可以从 shell 提示符向 tmux 发送命令;例如,我可以tmux display-message MESSAGE
在 shell 中运行,而不是C-b : display-message HELLO
在状态栏中显示消息。但是,运行tmux attach-session -t (tmux display-message -p '#S') -c (pwd)
会引发错误:“会话应小心嵌套,取消设置 $TMUX 以强制”。当然,我并不想嵌套 tmux 会话,我只想更改 tmux 的目录当前的会议。
我也尝试过使用tmux send-keys
and tmux-send-prefix
,但这些似乎将按键序列转发到底层 tty(shell 响应它们)而不是直接转发到 tmux。
我正在使用 Fish shell,但我假设该解决方案适合 shell 脚本,因此我对任何语言的解决方案都很满意。
答案1
我认为一种解决方案是:
tmux bind n new-window -c "/the/dir/you/want"
(将“n”替换为创建新窗口时使用的实际字符。)
如果我理解正确,您希望在运行时间my-script /some/dir
和运行时间之间my-script /some/other/dir
您希望每个新窗口都在目录中打开/some/dir
。
我建议的命令只会覆盖您最有可能使用的“新窗口”绑定。我每次需要一个新窗口时都手动运行tmux new-window
,但它不起作用。
(编辑1)虽然,如果您tmux new-window
从脚本运行,则不需要花费太多成本tmux new-window -c "${the_dir:-(pwd)}"
。
答案2
直到tmux3.1版可以通过组合命令从 tmux 会话本身的 shell 中以编程方式更改工作目录命令提示符和附加会话(要不就附/在)。请参阅以下 bash 会话示例:
$ pwd
/tmp/test
$ tmux new-session -t test
$ cd /home
$ tmux command-prompt -I "$PWD" -p "New session dir:" "attach -c%1"
$ tmux new-window
$ pwd
/home
注意:tmux 命令提示符将使用提供的模板填充当前客户端命令提示符,需要确认 (ENTER) 才能执行 tmux 的命令提示符行。
不幸的是3.2版本如果在 tmux 会话本身上执行,这样的命令会被破坏,但如果从会话外部运行,它仍然有效。例如,按照前面的终端会话摘录,当尝试更改版本 3.2 上的工作目录时,将产生以下错误:
$ tmux command-prompt -I "$PWD" -p "New session dir:" "attach -c%1"
sessions should be nested with care, unset $TMUX to force
尽管在版本 3.2 上进行了所有更改,但仍然可以更改工作目录 - 正如 tmux 版本 3.1 上的情况一样 - 使用以下任意一项:
- 附加到会话时
- 在会话中使用 tmux keybind 命令时
- 从会话中手动触发命令提示符时
在这里,我仍然在说明这些替代方案,只是为了回答完成问题,尽管这些并不是希望存档的内容。然而,我还没有在 tmux 3.2 上找到任何解决方案,以便仅使用 shell 命令更改 tmux 工作目录!
[1] 通过附加到新会话,请参阅以下终端会话示例:
$ pwd
/tmp/test
$ tmux new-session -t test
$ tmux detach-client
$ tmux attach -c /home -t test
$ tmux new-window
$ pwd
/home
[2] 相反,以下示例可以用于 tmux 配置($HOME/tmux.conf) 使用快捷键 Alt+c 将工作目录更改为当前窗格的当前工作目录:
bind M-c attach-session -c "#{pane_current_path}"
[3] 要手动使用 tmux 命令提示符,只需键入转义键绑定(默认为C-b
),然后键入:attach -c /new/working/dir/path
后跟ENTER
。