Развернуть концепцию деятельности KDE для оболочки

Иногда я использую KDE, и одна из вещей, которые мне больше всего нравятся в KDE 4, – это концепция деятельности. На работе это очень полезно, потому что я часто работаю над несколькими различными проектами в течение одного дня. Переход на другую активность позволяет мне изменять виджетов, так что я могу получить доступ к папкам, связанным с текущим проектом, например.

Я решил использовать эту концепцию в оболочке, поэтому я закодировал небольшую функцию bash под названием «switch», которая устанавливает псевдонимы, полезные для текущего проекта, например, alias cdwww=~/public_html/current_project/www и т. Д.

Мой вопрос : есть ли способ, с помощью которого я могу синхронизировать действия KDE с действиями оболочки, которые вызывают «switch myproj» на каждом открытом терминале при переключении на активность «myproj» через KDE и наоборот (бонусный вопрос)?

Другой вопрос : как я могу создать свои созданные псевдонимы во всех консолях? Есть ли способ обнаружить каждый открытый терминал в консоли или в гном-терминале и выполнить в нем мою функцию?

EDIT: вот функция switch, расположенная в конце моего .bashrc файла, не стесняйтесь комментировать:

 function switch() { if [ ! -d ~/.switch ] then mkdir ~/.switch fi if [ ! -f ~/.switch/proj.save ] then touch ~/.switch/proj.save fi echo "$1" > ~/.switch/proj.save case $1 in meddispar ) echo "Switching to meddispar..." echo "setting cdproj alias" alias cdproj="cd ~/public_html/onp/" echo "setting cdwww alias" alias cdwww="cd ~/public_html/onp/www/" echo "setting cc alias" alias cc="cdwww && php bin/php/ezcache.php --clear-all --purge && cd -" ;; darjeeling ) echo "Switching to darjeeling..." echo "setting cdproj alias" alias cdproj="cd ~/public_html/darjeeling/" echo "setting cdwww alias" alias cdwww="cd ~/public_html/darjeeling/www/" echo "setting cc alias" alias cc="rm -rf ~/public_html/darjeeling/www/var/cache/*" ;; * ) echo "'$1'? WTF?" rm ~/.switch/proj.save ;; esac } if [ -f ~/.switch/proj.save ] then switch `cat ~/.switch/proj.save` fi 

Как ответил Жиль, вот что я получил:

 greg@tiny :) ~ > qdbus |ack ctivity org.kde.ActivityController-1949 org.kde.ActivityManager greg@tiny :) ~ > qdbus org.kde.ActivityManager / /ActivityManager /MainApplication /StatusNotifierWatcher /connections /kbuildsycoca /kded /kxkb /modules /modules/StatusNotifierWatcher /modules/activitymanager /modules/device_automounter /modules/dnssdwatcher /modules/favicons /modules/freespacenotifier /modules/keyboard /modules/khotkeys /modules/kpackagekitd /modules/kremotecontroldaemon /modules/ktimezoned /modules/kwrited /modules/nepomuksearchmodule /modules/networkmanagement /modules/networkstatus /modules/powerdevil /modules/randrmonitor /modules/remotedirnotify /modules/solidautoeject /modules/statusnotifierwatcher /org /org/freedesktop /org/freedesktop/PowerManagement /org/freedesktop/PowerManagement/Inhibit /org/kde /org/kde/networkmanagement /org/kde/networkmanagement/Activatable /org/kde/networkmanagement/Activatable/10 /org/kde/networkmanagement/Activatable/11 /org/kde/networkmanagement/Activatable/12 /org/kde/networkmanagement/Activatable/13 /org/kde/networkmanagement/Activatable/14 /org/kde/networkmanagement/Activatable/15 /org/kde/networkmanagement/Activatable/16 /org/kde/networkmanagement/Activatable/17 /org/kde/networkmanagement/Activatable/2 /org/kde/networkmanagement/Activatable/3 /org/kde/networkmanagement/Activatable/4 /org/kde/networkmanagement/Activatable/5 /org/kde/networkmanagement/Activatable/6 /org/kde/networkmanagement/Activatable/7 /org/kde/networkmanagement/Activatable/8 greg@tiny :) ~ > qdbus org.kde.ActivityManager /ActivityManager method QStringList org.kde.ActivityManager.ActivitiesForResource(QString uri) method QString org.kde.ActivityManager.ActivityIcon(QString id) method QString org.kde.ActivityManager.ActivityName(QString id) signal void org.kde.ActivityManager.ActivityNameChanged(QString id, QString name) method QString org.kde.ActivityManager.AddActivity(QString name) method QStringList org.kde.ActivityManager.AvailableActivities() method QString org.kde.ActivityManager.CurrentActivity() signal void org.kde.ActivityManager.CurrentActivityChanged(QString id) method bool org.kde.ActivityManager.IsBackstoreAvailable() method void org.kde.ActivityManager.RegisterActivityController(QString service) method void org.kde.ActivityManager.RegisterResourceWindow(uint wid, QString uri) method QStringList org.kde.ActivityManager.RegisteredActivityControllers() method void org.kde.ActivityManager.RemoveActivity(QString id) method void org.kde.ActivityManager.SetActivityIcon(QString id, QString name) method void org.kde.ActivityManager.SetActivityName(QString id, QString name) method bool org.kde.ActivityManager.SetCurrentActivity(QString id) method void org.kde.ActivityManager.UnregisterResourceWindow(uint wid, QString uri) method QString org.kde.ActivityManager._allInfo() method QString org.kde.ActivityManager._serviceIteration() method QDBusVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name) method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name) method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value) method QString org.freedesktop.DBus.Introspectable.Introspect() greg@tiny :) ~ > qdbus org.kde.ActivityController-1949 /ActivityController method void org.kde.ActivityController.ActivityAdded(QString id) method void org.kde.ActivityController.ActivityRemoved(QString id) method void org.kde.ActivityController.ResourceWindowRegistered(uint wid, QString uri) method void org.kde.ActivityController.ResourceWindowUnregistered(uint wid, QString uri) method QDBusVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name) method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name) method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value) method QString org.freedesktop.DBus.Introspectable.Introspect() 

EDIT: я полностью переписал свой сценарий с помощью python, и теперь весь проект доступен здесь: https://github.com/greg0ire/switch

Управление действиями KDE через dbus

KDE можно управлять из командной строки с помощью qdbus . Общий синтаксис – это qdbus COMPONENT PATH METHOD ARGUMENT1... где COMPONENT обычно что-то вроде org.freedesktop.Foo или org.kde.Bar , PATH обозначает класс, открытый компонентом, METHOD – это имя конкретного действия в этом классе , и в зависимости от метода могут быть дополнительные аргументы.

Вот команды для KDE ≥4.7 для перечисления действий, для получения текущей активности и для установки текущей активности.

 qdbus org.kde.kactivitymanagerd /ActivityManager org.kde.ActivityManager.ListActivities qdbus org.kde.kactivitymanagerd /ActivityManager org.kde.ActivityManager.CurrentActivity qdbus org.kde.kactivitymanagerd /ActivityManager org.kde.ActivityManager.SetCurrentActivity "activity identifier " 

Выяснение того, что может сделать dbus

Документация KDE dbus очень плохая. Каждый класс минимально документирован, например Activity , DesktopCorona ). Но вам, вероятно, придется экспериментировать и, возможно, читать источник (есть ссылки на страницах документации API), чтобы узнать, что доступно.

Если вы qdbus с двумя аргументами, он перечислит возможности для следующего аргумента. В следующем фрагменте оболочки перечислены все доступные методы Qt-dbus:

 for x in $(qdbus | sed '/^:/d'); do for y in $(qdbus $x); do qdbus $x $y | sed "s~^~$x $y ~" done done 2>/dev/null >qdbus.list 

Другим способом изучения дерева dbus является qdbusviewer в инструментах разработки Qt. В составе PyQt есть также интерфейс qt-dbus Python.

Получение оболочки для реакции

Чтобы заставить оболочку реагировать на внешние события, лучшее, что вы можете разумно сделать, – это проверить что-то перед отображением подсказки. Bash запускает $PROMPT_COMMAND перед отображением подсказки, а zsh выполняет функцию precmd . Таким образом, вы можете посмотреть текущую активность KDE и сделать что-то, если оно изменилось с вашего последнего взгляда.

как сделать мои вновь созданные псевдонимы работать во всех консолях

Это особенно удобно при использовании оболочки рыбы вместо bash. Помимо повышения производительности вообще (по крайней мере для меня), она знает концепцию глобальной (универсальной) переменной, которая определяется

 set -U VARIABLE_NAME VALUES 

Эта переменная сразу же доступна во всех консолях, и после перезагрузки значение будет восстановлено.