среда, 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.

9 комментариев:

  1. Интересно, надо будет попробовать на досуге. Спасибо

    ОтветитьУдалить
  2. Никогда про Yakuake не слышал, надо погуглить, посмотреть

    ОтветитьУдалить
  3. Надо попробовать юзнуть скрипт, спасибо!

    ОтветитьУдалить
  4. Попробую, до этого такие скрипты еще не юзал.

    ОтветитьУдалить
  5. Любопытно очень любопытно

    ОтветитьУдалить
  6. из-за моноширинного шрифта все переехало. Скрипт ВНЕЗАПНО годный

    ОтветитьУдалить