将 i3wm 工作区/Windows 状态更改为紧急

将 i3wm 工作区/Windows 状态更改为紧急

我有一个在远程服务器上运行的 shell 脚本,我想让 i3 窗口状态变为紧急,以便工作区按钮变为红色。我该如何实现?

答案1

许多终端可以在其窗口上设置紧急标志,如果钟形字符- \a- 被打印出来。因此

me-runs-long-time.sh ; echo -e '\a'

应该可以解决问题。记住i3当窗口聚焦或已经聚焦时,将立即删除紧急标志。因此,您可以通过运行来测试这是否有效

sleep 3; echo -e '\a'

并立即聚焦另一个窗口。

笔记:终端可能需要针对此行为进行配置:

  • 对于rxvt-unicode资源,urgentOnBell需要设置为True。对于xterm它是资源bellIsUrgent。您可以根据发行版在~/.Xresources或中设置资源。~/.Xdefaults

    XTerm*bellIsUrgent: True
    URxvt.urgentOnBell: True
    

    运行xrdb ~/.Xresources或重新启动 X 会话以启用更改(对于新终端)。

  • 可以通过在其配置中设置选项来termite启用此功能- :urgent_on_belltrue~/.config/termite/config

    [options]
    urgent_on_bell = true
    

    这将立即对任何新的白蚁窗户起作用。


当然,上述解决方案取决于你; echo -e '\a'每次都记得附加。有几种方法可以自动执行此操作。例如:

  • 一个简单的解决方法就是在脚本本身中在适当的时间输出\a。这当然需要写权限,并且需要为每个脚本单独执行。

  • 如果您使用zsh,您可以将以下内容添加到您的~/.zshrc(在远程机器上):

    # this may already be in your ~/.zshrc
    autoload -Uz add-zsh-hook
    # duration in seconds after which a bell should be sent
    typeset -i LONGRUNTIME=60
    # function to save time at which a command was started
    save_starttime () {
      starttime=$SECONDS
    }
    # function to print \a if the command took longer than LONGRUNTIME
    set_longrunning_alert () {
      if ((LONGRUNTIME > 0 && SECONDS - starttime >= LONGRUNTIME)); then
        print "\a"
      fi
    }
    # run save_starttime before a command is executed
    add-zsh-hook preexec save_starttime
    # run set_longrunning_alert after a command finishes (before the prompt)
    add-zsh-hook precmd set_longrunning_alert
    

    这将自动打印钟形字符如果某个命令花费的时间超过一分钟。

  • 如果您使用,bash您可以在远程机器上使用以下命令。

    PROMPT_COMMAND='echo -e "\a"'
    

    这将运行echo -e "\a" 每一个发出主提示之前的时间。虽然这会在每个命令之后将窗口标记为紧急,但在大多数情况下并不明显,因为不会在焦点窗口上保留紧急标志。

bash如果您在本地计算机上也使用或的设置,则在 SSH 连接断开时也会收到通知(仅在 几秒后断开的zsh情况下)。当然,假设您从 shell 启动。zshLONGRUNTIMEssh

相关内容