時々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はコマンドラインから制御できますqdbus
。qdbus COMPONENT PATH METHOD ARGUMENT1...
一般的な構文は、一般的に、COMPONENT
またはなどがコンポーネントによって公開されたクラスを表し、METHODはそのクラスの特定のジョブ名であり、メソッドによってはより多くのパラメータがあります。org.freedesktop.Foo
org.kde.Bar
PATH
以下は、アクティビティの一覧表示、現在のアクティビティのインポート、および現在のアクティビティ設定のための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ツリーをナビゲートする別の方法は、qdbusviewer
Qt開発ツールを使用することです。次のPython qt-dbusインターフェイスもあります。pyqt。
シェルが反応するようにする
シェルが外部イベントに反応するように合理的にできる最善の方法は、プロンプトを表示する前に何かを確認することです。 Bashは$PROMPT_COMMAND
プロンプトを表示する前に実行され、zshは機能を実行しprecmd
ます。したがって、現在のKDEアクティビティを検索し、最後に見た後に変更された場合は、特定の操作を実行できます。
答え2
新しく作成されたエイリアスがすべてのコンソールで機能するようにする方法
使用時魚の皮バッシュの代わりに。一般に、より生産的であるだけでなく、(少なくとも私にとっては)次のように定義されるグローバル(汎用)変数の概念も知っています。
set -U VARIABLE_NAME VALUES
変数はすべてのコンソールですぐに使用でき、再起動後に値が復元されます。