Что делать с лишними клавишами на клавиатуре?
На моей клавиатуре (Microsoft Natural) полно всяких кнопочек. Долгое время я их игнорировал, но недавно все-таки заставил их работать и дико доволен результатом.

Для этого пришлось написать несколько скриптов, которые у меня живут в ~/quickscripts:
% ls -lh quickscripts drwxr-xr-x 2 zed zed 39 2010-11-17 21:49 example drwxr-xr-x 2 zed zed 39 2010-11-19 22:43 apache lrwxrwxrwx 1 zed zed 6 2010-11-21 19:12 current -> apache drwxr-xr-x 2 zed zed 28 2010-11-17 21:49 builder -rwxr-xr-x 1 zed zed 269 2010-11-16 23:52 select-scripts -rwxr-xr-x 1 zed zed 101 2010-11-19 19:53 show-current
% ls -lh current/ -rwxr-xr-x 1 zed zed 430 2010-11-19 22:43 cmdF lrwxrwxrwx 1 zed zed 4 2010-11-17 20:55 cmd1 -> cmdF lrwxrwxrwx 1 zed zed 4 2010-11-17 20:55 cmd2 -> cmdF
Вот какая за этим стоит идея: по дополнительным кнопкам вызываются скрипты ~/quickscripts/current/cmd{1,2,3}, где current – это симлинк на конкретный набор скриптов. Этих наборов несколько, каждый для какой-то отдельной задачи. Например, скрипты в директории apache вызывают /etc/init.d/apache2 reload|restart на разработческом сервере.
Чтобы выбрать конкретный набор скриптов я нажимаю на кнопку “5″:

Это окошко отображает скрипт select-scripts, он написан на kaptain + bash, вот как он выглядит:
#!/usr/bin/kaptain start "Quickscript selector" -> dir @exec(script)="OK"; dir -> @list(`cd ~/quickscripts && ls | grep -vE 'select-scripts|current' `)=`cd ~/quickscripts && readlink current`; script -> "cd ~/quickscripts && rm -f current && ln -s " dir " current";
Kaptain – удивительный по своей функциональности и лакончности фреймворк для создания несложных GUI, даже немного жаль, что нечасто возникает в этом необходимость.
Вот пример скрипта, по кнопке Favorites он выполняет какие-то рутинные действия на удаленном сервере, а по кнопке “1″ запрашивает аргумент через всплывающее окошко.
#!/bin/bash
id=`cat /tmp/task_id`
if [[ "`basename $0`" = 'cmdF' ]]; then
cat > /tmp/r <<EOF
update BuildTasks set Log='', Status='waiting', Version='', Cancelled=0, RepositoryName='' where TaskID=$id
EOF
a=`cat /tmp/r | ssh devserver 'killall builder </dev/null; mysql testdb' 2>&1 && echo "task $r was restarted"`
rm /tmp/r
notify-send -t 3000 'builder:' "$a"
else
id=`zenity --entry --text="Task number" --entry-text="$id" || echo $id`
echo $id > /tmp/task_id
fi
Результат работы отображается через libnotify:

В ubuntu для отображения уведомлений используется notify-osd, он всем хорош, но не поддерживает задание кастомных таймаутов (а по умолчанию – 10 секунд – это ужасно много), и не умеет отображать несколько уведомлений одновременно. Поэтому пришлось заменить его на старый вариант – notification-daemon, который поддерживает и то и другое:
apt-get remove notiy-osd apt-get install notification-daemon
Осталось сказать, что запускать скрипты по нажатию на кнопку gnome умеет сам, и настраивается это в меню System->Preferences->Keyboard Shortcuts.
На этом все, буду рад, если кому-то мой опыт пригодится :)






