如何从所有tmux窗口清除铃状态

时间:2012-09-24 03:45:47

标签: terminal alert tmux

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

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

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

但是它会导致上面提到的重建脚本出现轻微问题,因为当我运行tmux后,每个会话中的每个窗口都会标记为红色,因为第一个提示被打印到屏幕上。这使得该功能在我访问每个窗口之前无用,并且有40-50个这样的功能。

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

3 个答案:

答案 0 :(得分:6)

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

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

这样我就可以快速扫描会话中所有窗口的警报,方法是按前缀键并点击“n”直到它们全部清除,然后我回到原来的窗口。

答案 1 :(得分: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

答案 2 :(得分:4)

从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