Замена терминала Tilda обычным gnome-terminal
Привет, вот уже много лет я большую часть времени провожу в линуксе, а значит, работа в терминале для меня в каком-то роде необходимость. Раньше я пользовался стандартным терминалом, который шел в комплекте с Linux Mint, а затем и с Pop!_Os, пока мой коллега не показал мне Tilda. Это была любовь с первого взгляда: терминал в быстром доступе по нажатию одной клавиши, не создает миллион окошек каждый раз и, в целом, достаточно приятный и удобный.
Но времена меняются. Примерно год назад я купил себе ультра-широкий 49" монитор, на котором Tilda запускается во всю ширину экрана, что крайне неудобно, т.к. приходится крутить головой (я использую oh-my-zsh с темой powerlevel10k, из-за чего полезная информация отображается как у левого края консоли, так и у правого). Скажу честно, особо разбираться с настройками Tilda я не стал, хотя и попробовал руками задать ширину окна. Не помогло, а руки чесались написать свой велосипед.
Тогда-то я и подумал, что можно отказаться от использования стороннего терминала и просто назначить запуск стандартного на горячую клавишу (F1 в моем случае). Окей, сделано, но вот незадача: при каждом нажатии F1 открывается новое окно, из-за чего начинается беспорядок. Решаю написать скрипт, который будет:
Открывать новый терминал, если ни одного окна еще нет
Сворачивать терминал, если он уже запущен и активен
Переводить фокус на терминал, если он запущен, но не свернут (например, я работал в терминале, отвлекся на браузер и хочу вернуться в терминал, тогда опять жму F1)
Разворачивать открытый терминал, если он запущен и свернут
Задачи поставлены, переходим к решению. Запуск терминала в 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 и скорее всего написал что-то криво или плохо, но скрипт работает. Пользуюсь им уже пару недель и, в целом, нареканий к его работе у меня нет.
Но к чему этот пост? Возможно, кто-то сможет подсказать мне альтернативный способ решения моих задач (вдруг есть что-то готовое, а не мой велосипед). Ну и в целом, интересно чье-то мнение со стороны.
Если кто-то очень уж хочет что-то поправить или дать совет по коду (мало ли) - ссылка на гитхаб.