获取内部 tmux 会话的窗格编号

获取内部 tmux 会话的窗格编号

在外部会话中,我使用pane_cur="$(tmux display-message -p '#{pane_id}' | cut -c 2 | bc)"内部会话中的窗格来控制窗格切换行为。目前,我只是获取外部会话的窗格 ID,而不是内部会话。

根据外部窗格 id,如何深入了解嵌套会话,并获取窗格 id(如果存在)?

答案1

初步说明

在这个答案中,我假设所有 tmux 会话都存在于单个 tmux 服务器中。如果您的外部和内部会话属于不同的 tmux 服务器(在相同或不同的计算机上运行),那么情况要复杂得多,并且这个答案不适用。


分析

在一个 tmux 会话(例如外部会话)中,要从另一个 tmux 会话(例如内部会话)获取一些信息,您需要定位另一个会话。在许多 tmux 命令(包括display-message)中,您可以使用-t并指定目标。

如果你知道你的内部会话是1这个命令:

tmux display-message -t 1: -p '#{pane_id}'

将为您提供内部会话中当前窗口中当前活动窗格的 ID。

如果您不知道要使用什么数字(或会话名称),那么您需要询问 tmux。我想这就是你所说的“向下钻取”的意思。


程序

你可以这样做:

  1. 假设tmux display-message -p '#{pane_id}'给了你%5。它是外部会话中的活动窗格。

  2. 您实际上并不需要该窗格的 ID。您需要为窗格中的进程创建 tty tmux。您可以使用tmux display-message -p '#{pane_tty}'Eg it might be 来获取它/dev/pts/2

  3. 假设该窗格中有一个 tmux 客户端附加到内部会话,您需要找到使用 tty 的客户端会话。调用tmux list-clients -F '#{client_tty} #{client_session}'.它的输出可能是这样的:

    /dev/pts/1 foo
    /dev/pts/2 1
    

    现在您知道使用的会话/dev/pts/21.

  4. 识别此会话中的活动窗格:

    tmux display-message -t 1: -p '#{pane_id}'
    
  5. 如果您想更深入地钻取(因为还有另一个嵌套会话),请转到 (2),但这次您需要定位我们刚刚学习的窗格。


示例 shell 代码

#!/bin/sh

pane="$(tmux display-message -p '#{pane_id}')" || exit 1

while
   tty="$(tmux display-message -t "$pane" -p '#{pane_tty}')"
   session="$(
      tmux list-clients -F '#{client_tty} #{client_session}' \
      | grep "^$tty " | head -n 1 | cut -d ' ' -f 2-
   )"
   [ -n "$session" ]
do
   pane="$(tmux display-message -t "$session:" -p '#{pane_id}')"
done

printf '%s\n' "$pane"

该代码不会尝试处理所有错误。特别是,如果代码运行时窗格或会话被破坏,则$session一次调用中的信息(如 )tmux在与下一次调用一起使用时可能会无效tmux

我通过另存为来测试代码scrpt,使其可执行并watch ./scrpt在最外层 tmux 会话的 shell 中运行。在我的测试中,我创建了最多三个附加级别的嵌套 tmux,但代码旨在处理任何深度。


边注

printf '%s\n' "${pane#%}"%如果这是你想要的,会给你一个没有前导的数字。但请记住,在 tmux 中pane_id是唯一的并用 表示%pane_index不是唯一的并用 表示%。如果您%pane_id返回内容中删除并稍后在 tmux 中使用该数字(无需重新添加%),那么它可能会被解释为pane_index

相关内容