SIO 17.02.2010 18:20
Tips & tricks — Zsh: скринсейвер в шелле
Недавно задался таким необычным вопросом, как обустройство скринсейвера в шелле. На самом деле, мне был нужен не совсем скринсейвер, но сути дела это не меняет: после некоторого времени простоя в терминале должна выполниться заданная команда (а что уж она будет делать - дело десятое)Итак, приступим. За костыли просьба сильно не пинать ^_^
В zsh есть такая полезная переменная окружения как TMOUT. Цитата из man zshall:
Т.е. через $TMOUT секунд бездействия шеллу будет передан сигнал ALRM. А на этот сигнал мы уже и можем поставить trap с каким угодно содержанием.
Казалось бы, вот оно, решение. Но что-то пошло не так.. Или руки у меня кривые, или звезды не так встали, или мы с авторами мана просто друг друга не поняли, но работало оно как описано в мане только если trap не была установлена. Если же trap была задана, zsh выполнял ее ровно через $TMOUT секунд после выполнения последней команды, а не после последнего нажатия клавиши, как должно быть в соответствии с моим пониманием мануала.
Вот тут и начинается мое главное костылестроение
Если фича работает как-то - это уже лучше, чем если бы она не работала никак, правда ведь? О:-) Ну я и приспособил ее к своим нуждам с использованием второй переменной окружения: TTYIDLE (она показывает время бездействия терминала в секундах, и как раз обнуляется при каждом нажатии клавиши). Простенькое сравнение времени простоя с эталоном, и в благоприятном случае - запуск нашего скринсейвера. Вот и всё.
Окончательный вариант (кусок ~/.zshrc) выглядит примерно так:
Если вы не хотите, чтобы эта "красота" распространялась не на все сессии zsh - закомментируйте строку с TMOUT в zshrc и передавайте его по отдельности только нужным сессиям. У меня, к примеру, скринсейвер будет только в терминале стартующем вместе с WM, и терминалах, запускающихся из меню, но шеллы в IDE, файловом менеджере и tty-консолях "засыпать" не будут =)
А уж что выбрать в качестве "заставки" пусть подскажет ваша фантазия :) Как вариант: слежение за логами беспроводного соединения (представлено в примере выше), запуск ncmpc для слежения за mpd, запуск cacafire просто для красоты..
Закрытие шелла - это и есть дефолтное поведение в этом случае: "If no trap is set, and <...>, zsh terminates". Т.е надо только задать ненулевой TMOUT и все будет само собой.
А от чужих шаловливых ручек меня прекрасно оберегает xlock.
PS: наконец-то комментарий. А то смотрю: пост на главной, 8 плюсов и ни одного камента, даж как-то скучно :D Думал жаловаться после +10/0
А от чужих шаловливых ручек меня прекрасно оберегает xlock.
PS: наконец-то комментарий. А то смотрю: пост на главной, 8 плюсов и ни одного камента, даж как-то скучно :D Думал жаловаться после +10/0
Ахтунг, два коммента bosha в одном треде, пост немедленно в избранное!
Насчет поста - понравилось. Но мне лень ставить zsh, хотя его расхваливают на все лады.
Насчет поста - понравилось. Но мне лень ставить zsh, хотя его расхваливают на все лады.
прикольная штука, сам в screen его юзаю как скринсейвер (без издевательств над zsh ибо screen сам умеет - а на zsh TMOUT юзается по прямому назначений, т.е. закрывает неактивные шелы работающие во вкладках скрина и соответственно закрывают неактивные вкладки)
странно, у меня(Lenny) работает именно от последнего нажатия клавиши
TMOUT=60
trap 'screensaver' 14
screensaver() {
cmatrix -abs
}
З.Ы - Пардон за неровный почерк. Это был совет... :3