가끔 KDE를 사용하는데, KDE 4에서 제가 가장 좋아하는 점 중 하나는 활동 개념입니다. 직장에서는 하루에 여러 프로젝트를 수행하는 경우가 많기 때문에 매우 유용합니다. 예를 들어, 다른 활동으로 전환하면 현재 프로젝트와 관련된 폴더에 액세스할 수 있도록 위젯을 변경할 수 있습니다.
나는 이 개념을 셸에서 사용하기로 결정했기 때문에 현재 프로젝트에 유용한 별칭(예: 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
변수는 모든 콘솔에서 즉시 사용할 수 있으며 재부팅 후 값이 복원됩니다.