KDEアクティビティの概念をシェルに拡張

KDEアクティビティの概念をシェルに拡張

時々KDEを使用していますが、KDE ​​4で私の好きなことの1つはアクティビティの概念です。職場では、一日に複数のプロジェクトを行うことが多いため、非常に便利です。たとえば、別のアクティビティに切り替えると、現在のプロジェクトに関連付けられているフォルダにアクセスできるようにウィジェットを変更できます。

私はこの概念をシェルで使用することにしたので、現在のプロジェクトに役立つエイリアス(例:alias cdwww=~/public_html/current_project/wwwなど)を設定する "switch"という小さなbash関数を作成しました。

私の質問は:KDEを介して「myproj」アクティビティに切り替えるとき、開いているすべての端末で「switch myproj」を呼び出してKDEアクティビティをシェルアクティビティと同期させる方法はありますか?その逆に(ボーナス質問)?

別の問題:新しく作成されたエイリアスがすべてのコンソールで機能するようにするにはどうすればよいですか? konsoleまたはgnome-terminalで開いているすべての端末を検出し、その中で私の機能を実行する方法はありますか?

編集:これは私の.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

Gilesの答えに基づいて得られた結果は次のとおりです。

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()

編集:Pythonを使用してスクリプトを完全に書き直し、プロジェクト全体がここで機能します。https://github.com/greg0ire/switch

答え1

dbusによるKDEアクティビティの制御

KDEはコマンドラインから制御できますqdbusqdbus COMPONENT PATH METHOD ARGUMENT1...一般的な構文は、一般的に、COMPONENTまたはなどがコンポーネントによって公開されたクラスを表し、METHODはそのクラスの特定のジョブ名であり、メソッドによってはより多くのパラメータがあります。org.freedesktop.Fooorg.kde.BarPATH

以下は、アクティビティの一覧表示、現在のアクティビティのインポート、および現在のアクティビティ設定のための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ドキュメントは非常に悪いです。各クラスには最小限の記録があります。活動デスクトップコロナ)。ただし、実験を行う必要がある場合や、ソースコード(APIドキュメントページにリンクされている)を読んで何が利用可能かを判断する必要があります。

最大2つの引数を入力すると、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ツリーをナビゲートする別の方法は、qdbusviewerQt開発ツールを使用することです。次のPython qt-dbusインターフェイスもあります。pyqt

シェルが反応するようにする

シェルが外部イベントに反応するように合理的にできる最善の方法は、プロンプトを表示する前に何かを確認することです。 Bashは$PROMPT_COMMANDプロンプトを表示する前に実行され、zshは機能を実行しprecmdます。したがって、現在のKDEアクティビティを検索し、最後に見た後に変更された場合は、特定の操作を実行できます。

答え2

新しく作成されたエイリアスがすべてのコンソールで機能するようにする方法

使用時魚の皮バッシュの代わりに。一般に、より生産的であるだけでなく、(少なくとも私にとっては)次のように定義されるグローバル(汎用)変数の概念も知っています。

set -U VARIABLE_NAME VALUES

変数はすべてのコンソールですぐに使用でき、再起動後に値が復元されます。

関連情報