如何使用 shell 命令更改 tmux 工作目录

如何使用 shell 命令更改 tmux 工作目录

我想创建一个外壳命令当运行时,设置的工作目录当前 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-keysand 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 上的情况一样 - 使用以下任意一项:

  1. 附加到会话时
  2. 在会话中使用 tmux keybind 命令时
  3. 从会话中手动触发命令提示符时

在这里,我仍然在说明这些替代方案,只是为了回答完成问题,尽管这些并不是希望存档的内容。然而,我还没有在 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

相关内容