Tmux:将一个键绑定到多个命令并将输出保存在环境变量中以隐藏(取消隐藏)窗格

Tmux:将一个键绑定到多个命令并将输出保存在环境变量中以隐藏(取消隐藏)窗格

我一直在研究如何在 tmux 中隐藏和取消隐藏窗格。我想绑定一个键来快速执行此操作。break-pane我可以隐藏一个窗格,命令的输出是窗格的名称(如果我输入正确的话,则为 :window.pane)。因此,我想绑定一个键,该键执行将break-pane输出存储在环境变量中,然后稍后取消隐藏它,获取环境变量并join-pane再次将其用于该窗格。这是我目前的情况:

bind h run-shell "export HIDDEN_PANE=$(tmux break-pane -dP)"
bind H join-pane -vs $HIDDEN_PANE

现在,隐藏功能已经可以正常工作,但是我该如何获取 break-pane 的输出并将其作为同一 bind 命令的一部分存储在环境变量中,以便稍后可以在其他窗格(以及 shell)中的HIDDEN_PANEjoin-pane 命令中使用它?目前,环境变量尚未在任何地方设置,正如Prefix++所示:show-environment

答案1

经过反复试验、谷歌搜索和阅读手册页后,我最终做到了这一点。

除了我的问题之外,我还有以下要求:

我需要能够隐藏多个窗格,并在取消隐藏时区分它们。这意味着,如果我隐藏了一个窗格,tmux 需要以某种方式存储隐藏窗格的相关信息,以便当我取消隐藏窗格时,它知道恢复原来位于“当前”窗格下方的窗格。

话虽如此,这是我的解决方案~/.tmux.conf

bind h run-shell "tmux setw $(echo @HIDDEN_PANE_#{pane_id}|sed -e 's/%//g') $(tmux break-pane -dP)"
bind H run-shell "tmux join-pane -hs $(tmux showw -v @HIDDEN_PANE_$(tmux run-shell \"echo '#{pane_id}+1'|sed -e 's/%//g'|bc\"))"

编辑:感谢@NicholasMariott 关于用户选项的评论(我之前使用的是环境变量)。

使用Prefix- :-h我可以隐藏窗格。它将 break-pane(隐藏窗格)的相关信息存储在窗口用户选项中(以 @ 开头的选项是用户选项),因此变量是特定于窗口的。为了区分窗格,用户选项使用 tmux 变量,#{pane_id}该变量以 a 开头,%后跟窗格的数字 ID。为了避免出现问题,%从 id 中删除了字符。因此,break-pane 中的窗格信息存储在选项中,就像@HIDDEN_PANE_2窗格是否%2被隐藏一样。

Prefix要使用- :-恢复窗格,H我使用tmux showw -v显示选项。但在本例中,它为“当前” #{pane_id}+1 构建变量名,该变量名应该是当前窗格“下方”窗格的 ID,因此这是要恢复的窗格。bc用于执行实际的添加。

这对我来说似乎有用,尽管它相当可怕:)欢迎任何评论,我会尝试将它们包含在答案中。

可能的改进是将其放在一个单独的 bash 脚本中,然后使用 run-shell 从 tmux.conf 运行该脚本。然后,我还可以在其中测试垂直分割窗格和水平分割窗格(使用#{window_height} - #{pane_height}),并相应地调整连接窗格(join-pane -vsjoin-pane -hs)。

还可以调整变量名称以使其更加健壮,例如通过包含窗口/会话 ID。

相关内容