Как стать автором
Обновить

Замена терминала Tilda обычным gnome-terminal

Уровень сложностиПростой

Привет, вот уже много лет я большую часть времени провожу в линуксе, а значит, работа в терминале для меня в каком-то роде необходимость. Раньше я пользовался стандартным терминалом, который шел в комплекте с Linux Mint, а затем и с Pop!_Os, пока мой коллега не показал мне Tilda. Это была любовь с первого взгляда: терминал в быстром доступе по нажатию одной клавиши, не создает миллион окошек каждый раз и, в целом, достаточно приятный и удобный.

Но времена меняются. Примерно год назад я купил себе ультра-широкий 49" монитор, на котором Tilda запускается во всю ширину экрана, что крайне неудобно, т.к. приходится крутить головой (я использую oh-my-zsh с темой powerlevel10k, из-за чего полезная информация отображается как у левого края консоли, так и у правого). Скажу честно, особо разбираться с настройками Tilda я не стал, хотя и попробовал руками задать ширину окна. Не помогло, а руки чесались написать свой велосипед.

Тогда-то я и подумал, что можно отказаться от использования стороннего терминала и просто назначить запуск стандартного на горячую клавишу (F1 в моем случае). Окей, сделано, но вот незадача: при каждом нажатии F1 открывается новое окно, из-за чего начинается беспорядок. Решаю написать скрипт, который будет:

  1. Открывать новый терминал, если ни одного окна еще нет

  2. Сворачивать терминал, если он уже запущен и активен

  3. Переводить фокус на терминал, если он запущен, но не свернут (например, я работал в терминале, отвлекся на браузер и хочу вернуться в терминал, тогда опять жму F1)

  4. Разворачивать открытый терминал, если он запущен и свернут

Задачи поставлены, переходим к решению. Запуск терминала в Gnome происходит bash-командой gnome-terminal & для сворачивания/разворачивания использую xdotool.

В целом, код получился достаточно простым, каких-то комментариев давать к нему не вижу смысла:

#!/usr/bin/env bash

PID=$(ps axu | grep terminal | grep server | grep -v grep | awk '{ print $2 }')
if [ "$PID" = "" ]
then
    gnome-terminal &
    exit
else
    WINDOW=$(xdotool search --onlyvisible --pid $PID | tail -1)
    if [ "$WINDOW" != "" ]
    then
        if xprop -id $WINDOW | grep "window state: Normal"; then
            if xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) _NET_WM_PID | grep $PID; then
                xdotool windowminimize $WINDOW
            else 
                xdotool windowactivate $WINDOW && xdotool windowfocus $WINDOW
            fi
        else
            xdotool windowactivate $WINDOW
        fi
    else
        echo "Terminal not found"
    fi
fi

Сразу хочу отметить, что я не эксперт в bash и скорее всего написал что-то криво или плохо, но скрипт работает. Пользуюсь им уже пару недель и, в целом, нареканий к его работе у меня нет.

Но к чему этот пост? Возможно, кто-то сможет подсказать мне альтернативный способ решения моих задач (вдруг есть что-то готовое, а не мой велосипед). Ну и в целом, интересно чье-то мнение со стороны.

Если кто-то очень уж хочет что-то поправить или дать совет по коду (мало ли) - ссылка на гитхаб.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.