Показаны сообщения с ярлыком gentoo. Показать все сообщения
Показаны сообщения с ярлыком gentoo. Показать все сообщения

среда, 16 февраля 2011 г.

Yakuake

Медленно, но верно облагораживая свое рабочее окружение, подбираю софт под собственные нужды. И все больше программ перекочевывают в консоль - они удобны, быстры, интерфейс не перегружен всякими свистелками... Да что я тут рассказываю.
В итоге сейчас имею некий набор консольных программ, которые активно использую. Запускаю я их, как Вы могли догадаться, в 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 <tabname> <appname>"
    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 | awk '{ print $11; }' | grep "${EXEC}"`

        if [ "x${APP}" != "x${EXEC}" ]; then
            #Если ничего не найдено, запускаем в этом табе приложение 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.