在外部会话中,我使用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。我想这就是你所说的“向下钻取”的意思。
程序
你可以这样做:
假设
tmux display-message -p '#{pane_id}'
给了你%5
。它是外部会话中的活动窗格。您实际上并不需要该窗格的 ID。您需要为窗格中的进程创建 tty tmux。您可以使用
tmux display-message -p '#{pane_tty}'
Eg it might be 来获取它/dev/pts/2
。假设该窗格中有一个 tmux 客户端附加到内部会话,您需要找到使用 tty 的客户端会话。调用
tmux list-clients -F '#{client_tty} #{client_session}'
.它的输出可能是这样的:/dev/pts/1 foo /dev/pts/2 1
现在您知道使用的会话
/dev/pts/2
是1
.识别此会话中的活动窗格:
tmux display-message -t 1: -p '#{pane_id}'
如果您想更深入地钻取(因为还有另一个嵌套会话),请转到 (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
。