7

我帮助维护了大量的类 Unix 服务器,因此保留了一个脚本tmux-rebuild,我用它来重建所有 tmux 会话和窗口,并通过 SSH 链接到每个服务器。

我已将 tmux 配置为当在该窗口中打印终端响铃字符时,在其状态栏中显示带有感叹号的红色窗口名称。irssi这对于像在另一个窗口中有消息时提醒我这样的程序非常方便。

我还在$PS1每台服务器上设置了在每次提示结束时打印终端铃声。这很有用,因为如果我在一个窗口中运行一个长作业并切换到另一个窗口,我可以立即看到它何时完成,因为当我的提示在作业完成后写入屏幕时,tmux 会使窗口名称以红色显示一个感叹号。这对我的工作流程非常有用。

然而,它会导致上面提到的重建脚本出现一个小问题,因为当我在运行它后启动 tmux 时,每个会话中的每个窗口都被标记为红色,因为第一个提示被打印到屏幕上。这使得该功能在我访问每个窗口之前都没用,其中有 40-50 个。

有什么我可以添加到我的脚本中的东西,可以在创建会话和窗口后清除所有警报吗?如有必要,我不介意使用 kludge。

4

3 回答 3

7

从 tmux 手册页,特别是这里的最后一句话:

kill-session [-aC] [-t target-session]
          Destroy the given session, closing any windows linked to it
          and no other sessions, and detaching all clients attached 
          to it.  If -a is given, all sessions but the specified one is
          killed.  The -C flag clears alerts (bell, activity, or
          silence) in all windows linked to the session.

所以,简单地说:

tmux kill-session -C
于 2017-10-13T02:02:45.873 回答
6

想出一个可接受的解决方法;我重新定义了下一个/上一个绑定以允许重复:

# Allow repeats for next/prev window
bind-key -r n next-window
bind-key -r p previous-window

这使我可以通过按前缀键并点击“n”来快速清除会话中所有窗口的警报,直到它们全部清除,然后我又回到原来的窗口中。

于 2012-09-30T12:30:13.657 回答
4

使用tmux 1.6(及更高版本),list-windows可以生成可定制的输出,因此读取输出行并select-window为每个窗口运行一个循环相当简单。

添加list-session(循环遍历所有会话,可选)和display-message(解析会话说明符,并记录当前/“最后一个”窗口,以便它们可以正确恢复),你可能会得到这样的结果:

#!/bin/sh

# usage: tmux-select-each [session [...]]
#
# Select every window in specified session(s). If no sessions are
# specified, process all windows in all sessions.
#
# This can be handy for clearing the activity flags of windows in
# freshly spawned sessions.

if test $# -gt 0; then
    for session; do
        tmux display-message -p -t "$session:" '#S'
    done
else
    tmux list-sessions -F '#{session_name}'
fi |
while read -r session; do
    active_window=$(tmux display-message -p -t "$session:" '#S:#I')
    last_window=$(tmux display-message -p -t "$session:"\! '#S:#I' 2>/dev/null)
    tmux list-windows -t "$session" -F '#{session_name}:#{window_index}' |
    while read -r window; do
        if test "$window" = "$active_window" ||
           test "$window" = "$last_window"; then
            continue
        fi
        tmux select-window -t "$window"
    done
    if [ -n "$last_window" ]; then
        tmux select-window -t "$last_window"
    fi
    tmux select-window -t "$active_window"
done
于 2012-10-01T09:14:16.637 回答