我正在尝试设置一个键绑定来切换top
活动窗口中的窗格。我想要这样做的方式是:
- 检查
top
当前窗口中是否存在以该命令开头的窗格 - 如果不存在这样的窗格,
splitw -h top
- 如果确实存在这样的窗格,
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。第二个命令本质上只是grep
s 表示%
符号,我假设要么有一个匹配项,要么没有匹配项,在这种情况下$?
将正确推断窗格是否存在。
我可以(无论如何,理论上)用它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
从顶部开始。:) 根据您的需要进行调整。