将 tmux 命令的输出传递到后面的窗格命令中

将 tmux 命令的输出传递到后面的窗格命令中

我正在尝试设置一个键绑定来切换top活动窗口中的窗格。我想要这样做的方式是:

  1. 检查top当前窗口中是否存在以该命令开头的窗格
  2. 如果不存在这样的窗格,splitw -h top
  3. 如果确实存在这样的窗格,killp -t PANE_ID

我可以完成前两个部分,假设我只有一个窗格,top使用以下命令在我的计算机上启动以下 shell 命令.tmux.conf

topid="tmux lsp -f '#{==:#{pane_start_command},top}' -F '#D'"
hastop="$topid | grep '%' -q"

因此,第一个 shell 命令会查找所有以 开头的窗格top并打印它们的窗格 ID。第二个命令本质上只是greps 表示%符号,我假设要么有一个匹配项,要么没有匹配项,在这种情况下$?将正确推断窗格是否存在。

我可以(无论如何,理论上)用它if-shell "$hastop"来检测当前窗口是否有窗格top,或者至少如果我直接在 shell 中操作,命令是否有效。

问题是我想将的结果存储topid在一个变量中,以便我可以将其传递给killp -t ID_HERE,并且我不确定如何保留该字符串,以便我可以将其传递(插入?)到我的killp命令中。

答案1

而不是if-shell使用run-shell和编码内部逻辑单件您可以自由地使用 shell 变量的 shell 代码。

以下示例是在 tmux 中的 shell 中运行的命令。它绑定到prefixT(注意它的首都T)。如果您想将命令放入您的,.tmux.conf则省略前导的tmux

tmux bind-key T run-shell '
pane="$(
   tmux list-panes -f "#""{==:#""{pane_start_command},top}" -F "#""D" | head -n 1
)"
[ -n "$pane" ] && tmux kill-pane -t "$pane" || tmux split-window -bf top
'

逻辑是:如果$pane扩展为非空字符串则kill-pane。否则(或 ifkill-pane失败)执行split-window

每个后面的双引号#都很重要。我们不想run-shell看到并扩展#{#D,我们希望list-panes看到它们。击键后将run-shell解析整个单引号字符串,包括双引号,因此它将看到“无意义的”#""{#""D。然后由运行的 shellrun-shell将删除双引号,从而list-panes看到有意义的#{#D

我以前split-window -bf top总是top从顶部开始。:) 根据您的需要进行调整。

相关内容