Взаимодействие с Yakuake посредством D-BUS

Медленно, но верно облагораживая свое рабочее окружение, подбираю софт под собственные нужды. И все больше программ перекочевывают в консоль - они удобны, быстры, интерфейс не перегружен всякими свистелками... Да что я тут рассказываю.

В итоге сейчас имею некий набор консольных программ, которые активно использую. Запускаю я их, как Вы могли догадаться, в Yakuake. И вот решил немного упростить себе жизнь, автоматизировав некоторые рутинные операции: создание нового таба, задание табу понятного имени, ну и, собственно, запуск в созданном табе нужного приложения.

Задача: кликом по ярлыку/сочетанием клавиш/[подставить своё]:
а) запускать в новой вкладке Yakuake нужное приложение
б) если вкладка приложения уже есть, но оно было по какой-то причине закрыто, запускать его в ней.
в) если/когда приложение уже запущено - делать вкладку с ним активной.
с) открывать окно Yakuake, если оно скрыто.

Итак, поехали!

Первым делом создаем в домашней директории каталог .bin (название может быть любым, какое больше нравится). Именно там будут лежать пользовательские скрипты. Каталог скрытый - чтоб не мешался.

Далее добавляем в переменную PATH путь к нашему каталогу, чтоб можно было обращаться к скриптам напрямую, без необходимости указывать полный путь. Для этого в файл ~/.bashrc (или другой, специфичный для используемой оболочки) нужно встравить строку:

export PATH="${PATH}:/home/UserName/.bin", где UserName - имя пользователя.

Ну а теперь можно помещать в эту папку любые скрипты собственного написания :). ...так, на будущее.

Сам скрипт yakurun на bash:

#!/bin/bash

#Имя таба и название бинарника
NAME="${1}"
EXEC="${2}"

if [[ "x${NAME}" == "x" || "x${EXEC}" == "x" ]]; then
    echo "Usage: yakurun  "
    exit
fi

#Получаем список открытых сессий (фактически - табов)
SESSIONS=`qdbus org.kde.yakuake /yakuake/sessions sessionIdList`
#Заменяем запятые на пробелы
SESSIONS="${SESSIONS//,/ }" 

#Считаем, что еще не открыто таба с указанным в переменной NAME именем.
TAB_EXISTS=0
#Перебираем все открытые табы в поисках таба с именем NAME
for SESSION in ${SESSIONS}; do
    SNAME=`qdbus org.kde.yakuake /yakuake/tabs tabTitle ${SESSION}`
    if [ "x${SNAME}" == "x${NAME}" ]; then
        #Таб найден
        TAB_EXISTS=1
        #Получаем идентификатор сессии для найденного таба
        TERMINAL=`qdbus org.kde.yakuake /yakuake/sessions terminalIdsForSessionId ${SESSION}`
        #Проверяем, есть ли запущенные текущим пользователем процессы с именем EXEC
        APP=`ps u | grep "${EXEC}" | grep -v "grep" | awk '{ print $11; }'`
         
        if [ "x${APP}" == "x" ]; then
            #echo ${APP}
            #Если ничего не найдено, запускаем в этом табе приложение EXEC
            qdbus org.kde.yakuake /yakuake/sessions runCommandInTerminal ${TERMINAL} "${EXEC}"
        fi
        #Делаем таб активным
        qdbus org.kde.yakuake /yakuake/sessions raiseSession ${SESSION} 
        break
    fi
done

#Если еще не было открыто таба с именем NAME
if [ ${TAB_EXISTS} = 0 ]; then
    #Открываем новый таб
    qdbus org.kde.yakuake /yakuake/sessions addSession
    
    SESSION=`qdbus org.kde.yakuake /yakuake/sessions activeSessionId`
    TERMINAL=`qdbus org.kde.yakuake /yakuake/sessions terminalIdsForSessionId ${SESSION}`
    
    #Переименовываем его
    qdbus org.kde.yakuake /yakuake/tabs setTabTitle ${SESSION} "${NAME}"
    #Запускаем в нем приложение EXEC
    qdbus org.kde.yakuake /yakuake/sessions runCommandInTerminal ${TERMINAL} "${EXEC}"
fi

#Проверяем, открыто ли окно Yakuake
ACTIVE=`qdbus org.kde.yakuake /yakuake/MainWindow_1 com.trolltech.Qt.QWidget.isActiveWindow`
if [ ${ACTIVE} == 'false' ]; then
    #Если нет - делаем его видимым
    qdbus org.kde.yakuake /yakuake/window toggleWindowState
fi

Теперь, в качестве примера, настроим сочетания клавиш для запуска/открытия weechat (Meta + c) и MOC (Meta + m) в Yakuake:

Создаем, если еще не существует, файл ~/.xbindkeysrc следующего содержания:

#Запуск/открытие weechat в yakuake
"/home/UserName/.bin/yakurun WeeChat weechat-curses"
    Mod2+Mod4 + c

#Запуск/открытие MOC в yakuake
"/home/UserName/.bin/yakurun MOCP mocp"
    Mod2+Mod4 + m

Не забудьте заменить UserName на имя пользователя.

Теперь остается добавить xbindkeys в автозапуск и перезайти в систему. Или же просто (пере)запустить xbindkeys.

UPD 2011-04-13
Немного подправил скритп.
- теперь он лучше определяет, запущено ли вызываемое приложение

Все работает, идея супер!

Все завелось с пол пинка ) немножко xbindkeys по выпендривался а так все работает. Очень удобно.
Автору +1

Очень дельно, спасибо за

Очень дельно, спасибо за идею. Не подскажете набор консольных программ ?
При запущенных иксах использую часто только htop и finch, реже mc. Ещё vim но его без аргументов запускать неудобно.
Понятно когда Х сервер не запущен. В mc настроил чтоб запускалось что надо и чем надо. И ещё вопрос: я просто написал скрипты которые лежат в ~/bin настроил PATH и из якуаки при помощи них запускаю всё что мне нужно и с теми настройками которые мне нужны. Зачем ярлыки ? Пережиток? :) Да и каталог ~/bin ни как не мешает, зачем его прятать ? Зашёл в него и мышкой кликнул на скрипте если мышка нравится. И откроется програмулька в том эмуляторе терминала который нужен, судя по якуаке откроется в konsole.

evadim забанен за хамское поведение и нецензурную речь

Гы

Кстати ещё один путь самурая: "для тех кто любит иконки" запускаешь kmenuedit и делаешь себе запуск чего хочешь с пометкой "запускать в консоли" не ? Потом правой кнопочкой > поместить на рабочий стол.
Но хотя если вы поставили якуаку без кед то действительно надо наделать в домашнем каталоге кучу каталогов типа ~/.* и в них извращаться по желанию.

evadim забанен за хамское поведение и нецензурную речь

Oochee3m написал(а):Очень

Oochee3m написал(а):
Очень дельно, спасибо за идею. Не подскажете набор консольных программ ?
При запущенных иксах использую часто только htop и finch, реже mc. Ещё vim но его без аргументов запускать неудобно.
Понятно когда Х сервер не запущен. В mc настроил чтоб запускалось что надо и чем надо. И ещё вопрос: я просто написал скрипты которые лежат в ~/bin настроил PATH и из якуаки при помощи них запускаю всё что мне нужно и с теми настройками которые мне нужны. Зачем ярлыки ? Пережиток? :) Да и каталог ~/bin ни как не мешает, зачем его прятать ? Зашёл в него и мышкой кликнул на скрипте если мышка нравится. И откроется програмулька в том эмуляторе терминала который нужен, судя по якуаке откроется в konsole.

Иконки - как вариант. От которого я в итоге отказался. xbindkeys мне хватило :)
А каталог bin мне в домашней директории совершенно не нужен. Но и класть его куда-то вне ее не хочется.
Все консольное я запускаю в консоли. Наиболее часто используемые проги либо в автозапуске, либо по хоткеям.

Из консольных основном запущены weechat, rtorrent, время от времени moc, часто пользуюсь vim, но как вы правильно заметили, без аргументов неудобно. mc время от времени. htop очень редко - чаще top (TODO: надо и его повесить на хоткей). Сейчас настроены хоткеи только для rtorrent, weechat, moc, mc.

Oochee3m написал(а):
Кстати ещё один путь самурая: "для тех кто любит иконки" запускаешь kmenuedit и делаешь себе запуск чего хочешь с пометкой "запускать в консоли" не ? Потом правой кнопочкой > поместить на рабочий стол.
Но хотя если вы поставили якуаку без кед то действительно надо наделать в домашнем каталоге кучу каталогов типа ~/.* и в них извращаться по желанию.

А вот kmenuedit меня не впечатлил - после него не могу руками добавить ярлык (путем правки desktop-файла).
И "запускать в терминале" у меня тоже не прокатило почему-то. Да и не для того все было задумано, что продолжать кнопочки тыкать:).

Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".