Search
Write a publication
Pull to refresh

Замена терминала 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 и скорее всего написал что-то криво или плохо, но скрипт работает. Пользуюсь им уже пару недель и, в целом, нареканий к его работе у меня нет.

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

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.