Online video hd

Смотреть гиг видео

Официальный сайт aquaexpert 24/7/365

Смотреть видео бесплатно

SIO 17.02.2010 18:20

Tips & tricksZsh: скринсейвер в шелле

Недавно задался таким необычным вопросом, как обустройство скринсейвера в шелле. На самом деле, мне был нужен не совсем скринсейвер, но сути дела это не меняет: после некоторого времени простоя в терминале должна выполниться заданная команда (а что уж она будет делать - дело десятое)

Итак, приступим. За костыли просьба сильно не пинать ^_^

В zsh есть такая полезная переменная окружения как TMOUT. Цитата из man zshall:
1
2
3
4
5
6
7
8
9
       TMOUT  If this parameter is nonzero, the shell  will  receive  an  ALRM
signal if a command is not entered within the specified number
of seconds after issuing a prompt. If there is a trap on
SIGALRM, it will be executed and a new alarm is scheduled using
the value of the TMOUT parameter after executing the trap. If
no trap is set, and the idle time of the terminal is not less
than the value of the TMOUT parameter, zsh terminates. Other?
wise a new alarm is scheduled to TMOUT seconds after the last
keypress.



Т.е. через $TMOUT секунд бездействия шеллу будет передан сигнал ALRM. А на этот сигнал мы уже и можем поставить trap с каким угодно содержанием.

Казалось бы, вот оно, решение. Но что-то пошло не так.. Или руки у меня кривые, или звезды не так встали, или мы с авторами мана просто друг друга не поняли, но работало оно как описано в мане только если trap не была установлена. Если же trap была задана, zsh выполнял ее ровно через $TMOUT секунд после выполнения последней команды, а не после последнего нажатия клавиши, как должно быть в соответствии с моим пониманием мануала.

Вот тут и начинается мое главное костылестроение

Если фича работает как-то - это уже лучше, чем если бы она не работала никак, правда ведь? О:-) Ну я и приспособил ее к своим нуждам с использованием второй переменной окружения: TTYIDLE (она показывает время бездействия терминала в секундах, и как раз обнуляется при каждом нажатии клавиши). Простенькое сравнение времени простоя с эталоном, и в благоприятном случае - запуск нашего скринсейвера. Вот и всё.

Окончательный вариант (кусок ~/.zshrc) выглядит примерно так:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TMOUT=60
#~ Каждые 60 секунд после ввода последней команды будет срабатывать SIGALRM
#~ (trap 14) и будет проверяться условие

IDLELIMIT=360
#~ IDLELIMIT - максимальная величина idle к моменту проверки (замените на
#~ удобное вам значение в секундах)

trap 'screensaver' 14
screensaver()
{
if < $TTYIDLE -ge $IDLELIMIT >
then
#~ ??? Замените этот блок на собственный ???
watch -n 1 tail -n 3 /var/log/wimax
echo -ne "\e<1;34;49m<$USER> \e<1;32;49m$PWD# \e<0m"
#~ ??? Замените этот блок на собственный ???
fi
}



Если вы не хотите, чтобы эта "красота" распространялась не на все сессии zsh - закомментируйте строку с TMOUT в zshrc и передавайте его по отдельности только нужным сессиям. У меня, к примеру, скринсейвер будет только в терминале стартующем вместе с WM, и терминалах, запускающихся из меню, но шеллы в IDE, файловом менеджере и tty-консолях "засыпать" не будут =)

А уж что выбрать в качестве "заставки" пусть подскажет ваша фантазия :) Как вариант: слежение за логами беспроводного соединения (представлено в примере выше), запуск ncmpc для слежения за mpd, запуск cacafire просто для красоты..


Тэги: screensaver zsh
+ 11 -
Похожие Поделиться

bosha 17.02.2010 23:23 #
+ 0 -
Туда лучше писать закрытие шелла после простоя, ибо кто либо может что либо напортачить. Ваш К.О.

З.Ы - Пардон за неровный почерк. Это был совет... :3
SIO 17.02.2010 23:28 #
+ 0 -
Закрытие шелла - это и есть дефолтное поведение в этом случае: "If no trap is set, and <...>, zsh terminates". Т.е надо только задать ненулевой TMOUT и все будет само собой.

А от чужих шаловливых ручек меня прекрасно оберегает xlock.

PS: наконец-то комментарий. А то смотрю: пост на главной, 8 плюсов и ни одного камента, даж как-то скучно :D Думал жаловаться после +10/0
bosha 17.02.2010 23:30 #
+ 0 -
Я редко комментирую, так что тебе считай повезло ;)
booley 18.02.2010 08:36 #
+ 0 -
Ахтунг, два коммента bosha в одном треде, пост немедленно в избранное!

Насчет поста - понравилось. Но мне лень ставить zsh, хотя его расхваливают на все лады.
kstep 19.02.2010 02:52 #
+ 0 -
А я в своё время не поленился и поставил. Ни разу не пожалел =)
hayao 18.02.2010 09:13 #
+ 1 -
еще есть cmatrix
muhas 18.02.2010 10:10 #
+ 0 -
прикольная штука, сам в screen его юзаю как скринсейвер (без издевательств над zsh ибо screen сам умеет - а на zsh TMOUT юзается по прямому назначений, т.е. закрывает неактивные шелы работающие во вкладках скрина и соответственно закрывают неактивные вкладки)
xT 18.02.2010 14:32 #
+ 0 -
странно, у меня(Lenny) работает именно от последнего нажатия клавиши

TMOUT=60
trap 'screensaver' 14
screensaver() {
cmatrix -abs
}

kstep 19.02.2010 02:51 #
+ 0 -
А какая версия zsh? Может они между версиями поменяли поведение.
xT 19.02.2010 14:58 #
+ 0 -
$ zsh --version
zsh 4.3.6 (i686-pc-linux-gnu)
SIO 19.02.2010 18:30 #
+ 0 -
zsh 4.3.10 (i686-pc-linux-gnu)

Не факт, что причина в версии. Это может зависеть и от других факторов, в т.ч. и от кривости моих рук =)

Смотреть онлайн бесплатно

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн