Gum является частью более крупного проекта Charm, который представляет собой набор библиотек, написанных на языке Go, для создания приложений командной строки. Gum является "инструментом для гламурных сценариев оболочки" - как указано на официальной страничке проекта. С применением Gum, скрипты обретают привлекательность и интерактивность, становятся более понятными и простыми для восприятия.
Установка и настройка
Процесс установки достаточно прост: для популярных дистрибутивов - через менеджер пакетов; для остальных случаев можно воспользоваться готовыми сборками и бинарниками - https://github.com/charmbracelet/gum/releases; или просто установить последнюю версию Gum с помощью Golang в домашний каталог:
go install github.com/charmbracelet/gum@latest
В Calculate, для которого нет готовой сборки, я воспользовался последним методом. В таком случае, рекомендую добавить путь к исполняемому файлу в системные пути, чтобы gum автоматически запускался при его вызове, как показано на скриншоте ниже:
Команды утилиты Gum
- choose: интерактивный выбор из списка
- confirm: запрос на подтверждение действия
- file: выбор файла из директории
- filter: фильтрация списка по заданным параметрам
- format: форматирование вывода по определенному сценарию
- input: запрос на ввод данных
- join: объединение текста
- log: вывод информационных сообщений
- pager: включение прокрутки с номерами строк в длинный вывод
- spin: включение спиннера на время выполнения команды
- style: применение различных стилей (цвет, рамка, шрифт)
- table: выбор строки из таблицы данных
- write: ввод многострочной текстовой информации
По каждой команде Gum доступна справка, например:
gum choose -h
Подробное описание команд Gum с демонстрацией их возможностей доступно на официальной страничке проекта, там же выложены тестовые скрипты с примерами использования утилиты в них.
Практическое применение
В следующей части статьи покажу на примере собственных скриптов практическое применение в них утилиты Gum.
Пример 1: создание скрипта, автоматизирующего выбор тем для различных меню rofi, используемых пользователем. В моем wm qtile используется rofi в качестве диспетчера меню. Помимо главного меню приложений, используются меню для вызова различных опций запуска mpv player, утилиты скриншотов (анимированных в том числе), скриптов пользователя, меню управления питанием. Для каждого из них настроен свой файл конфигурации rofi, в зависимости от требуемого функционала.
Темы оформления вынес в отдельные файлы, в которых прописаны настройки цветов, шрифтов, иконок и рамок. Чтобы при смене темы не заниматься правкой каждого из файлов конфигурации различных меню rofi, поставил себе задачу автоматизировать этот процесс с помощью скрипта, добавив ему красок и интерактивности. Файлы тем размещены в отдельном каталоге ~/.config/rofi/themes. Скрипт читает их, выводя имена в виде списка, и ожидает выбор пользователя. Потом запрашивает подтверждение на применение выбранной темы, которая при положительном ответе записывается в отдельный файл, ссылка на который размещена в файле конфигурации меню rofi. Как говорится: "лучше один раз увидеть, чем сто раз услышать". Ниже представлена демонстрация работы скрипта:
После выбора и установки тем (в нашем примере это 2 различных темы: MyLight и MyBlack), меню rofi будут выглядеть так:
Пример 2: создание скрипта для "склейки" скриншотов. Данный функционал мной востребован крайне редко, поэтому не держу в системе GUI редакторов изображений, мне более чем достаточно функционала image magick. Ниже - демонстрация работы скрипта, в ходе которого пользователь выбирает файлы изображений, которые нужно склеить, выбирает формат склейки и подтверждает действие. Итоговый файл записывается в тот же каталог, где находятся исходные файлы с уникальным именем, содержащим дату и время его создания.
Пример 3: файл изображений формата *.png часто имеет большой размер, а для размещения на веб-ресурсах требуется более скромный. Скрипт, представленный на демонстрации ниже, выдает запрос пользователю на выбор директории и png-файла, после выбора которых пользователю остается лишь подтвердить действие по конвертации изображения в формат с бОльшим сжатием *.jpg:
Итоговый вариант обработки скриншотов этими скриптами (склейка + конвертация) выглядит так:
Пример 4: преобразование вывода списка шрифтов, установленных в системе, в приятный для глаз формат, используя команду стилей gum:
Пример 5: интерактивный распаковщик архивов из командной строки. На скриншоте ниже представлен скрипт, с помощью которого можно легко и быстро распаковать практически любые архивы прямо из командной строки. Файлы из архива распаковываются в поддиректорию с именем архива внутри папки сжатого файла.
В качестве заключения
Очень надеюсь, что мне удалось продемонстрировать некоторые из возможностей Gum, которые позволяют придать красок и интерактивности скриптам оболочки. Лично для себя нахожу данный проект интересным, слежу за его развитием и с удовольствием использую в своих скриптах.
Комментарии
12:10
Мне лично интерактивные скрипты ни к чему, но тот, кто часто что-то разворачивает, будь то конфигурации сервера или rice в Hyprland, то прям must have.
Про GUM этот первый раз слышу, но штуковина полезная. И скрипты, и мороженое в стаканчике, и дорогие сумки. Всё в одном.
12:22
но ниже увидел как раз вид ГГГГ-ММ-ДД.
2. Ещё год назад не особо (совсем не) понимал всю мощь и гибкость работы в терминале, предпочитал исключительно графический интерфейс.
Не скажу, что сейчас пользуюсь только терминалом, но всё же поболее.
Про GUM впервые слышу. Познавательно.
3. Как и в предыдущей статье отмечу GIF.
Наглядно.
13:20
Раньше, при прохождении всяких курсов и при возне в wifislax писал скрипты, а сейчас только смотрю их, задор уже не тот.
17:14
14:43
12:42
18:13
19:07
19:56
22:33
04:27
13:10
19:47