У меня есть сценарий оболочки, который я запускаю на удаленном сервере, и я хотел бы, чтобы состояние окна i3 стало неотложным, чтобы кнопка рабочей области стала красной. Как я могу этого достичь?

1 ответ1

2

Многие терминалы могут установить флаг срочности в своих окнах, если напечатан символ колокольчика - \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_bell значение true в своей конфигурации - ~/.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 или zsh также на своем локальном компьютере, вы также будете уведомлены в случае обрыва соединения SSH (в случае zsh только если оно умирает через LONGRUNTIME секунд). Предполагая, конечно, что вы запускаете ssh из вашей оболочки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .