EnglishРусский Map

whetuu

title
whetuu
type
toolbox
summary
Строка состояния и поиск по истории для шелла без конфига на Zig: один бинарник, отрисовка за ~2 мс
aliases
whetū
tags
zig, cli, shell, terminal, watchlist
language
Zig
license
MIT
created
2026-07-29
updated
2026-07-29
lang
ru
translation_of
whetuu
source_updated
2026-07-29
translated
2026-09-01
translator
lllm/antigravity/gemini-3.7-flash-medium

whetuu (на сайте пишется whetū) - это строка состояния и инструмент выбора из истории для fish, bash и zsh, написанный на zig и поставляемый в виде единого бинарника. У него нет конфигурационного файла вовсе - это не "разумные настройки по умолчанию при наличии файла конфигурации", в программе просто отсутствует формат конфигурации. Установка сводится к бинарнику в PATH и одной строке в конфиге шелла, а хук шелла управляет всем остальным, поэтому две важные команды (render и history add) вызываются автоматически и вручную их вводить не приходится.

Что показывает строка состояния

Сегменты отображаются слева направо и только тогда, когда они актуальны. user@host выводится жирным зелёным по SSH и жирным красным, если вы root, что служит предупреждением, а не просто меткой. Директория сокращает $HOME до ~ и оставляет привязку плюс столько конечных каталогов, сколько помещается по ширине терминала. Git добавляет три сегмента: ветку (или (detached)) пурпурным цветом, текущую операцию жёлтым - (rebasing 2/7), (merging), (cherry-picking) - и группу в скобках с информацией о конфликтах, stash'ах, индексированных, изменённых, неотслеживаемых файлах, а также опережении и отставании от апстрима. Языковой сегмент показывает логотип и версию тулчейна в фирменном цвете для 39 языков и инструментов, определяемых по манифесту проекта, расширению исходного файла или маркеру инфраструктуры. Таймер появляется, если предыдущая команда выполнялась две секунды или дольше. Символ приглашения - звёздочка, фиолетовая по умолчанию или в фирменном цвете языка, которая становится красной после завершившейся с ошибкой команды.

Символы маркера ветки, логотипов языков и звёздочки берутся из Nerd Font, поэтому в терминале без Nerd Font отображаются пустые квадраты.

Поиск по истории

Стрелка вверх открывает окно выбора вместо перехода на одну команду назад. Команды записываются после завершения и только тогда, когда они завершились без ошибок и являются текстом, поэтому опечатки и вставленное в терминал изображение никогда не попадут в хранилище. Каждая команда сохраняется вместе с директорией, в которой она выполнялась, а окно выбора открывается с областью видимости текущей директории, переключаясь на всю историю, если для этой директории записей нет.

Единственная команда, которая отображается, но никогда не сохраняется, - та, которая только что завершилась с ошибкой. Она находится в самом верху списка и выделена красным, пока вы не запустите что-то другое, поэтому рабочий процесс после упавшей команды прост: стрелка вверх, выбрать её, исправить.

Строки подсвечиваются синтаксически: имя команды, флаги, пути, переменные, строки в кавычках и операторы берут цвета из темы вашего терминала - тот же подход, что и у delta, применяющего подсветку к выводу git'а, а не изобретающего собственную палитру. Слишком широкая для окна строка обрезается в середине с помощью , а не с конца, благодаря чему цепочка команд с одинаковым длинным префиксом остаётся различимой.

Клавиши управления лаконичны: ввод текста для фильтрации (должно совпадать каждое слово без учёта регистра), / для перемещения, Home/End для перехода к самым новым и старым записям, Ctrl+G для переключения между историей текущей директории и всей историей, Tab для копирования выбранной строки в поле поиска для редактирования, Enter для запуска, Esc для отмены с сохранением введённого в командной строке.

Почему он быстрый

Строка состояния запускается перед каждым приглашением командной строки, поэтому её цена уплачивается постоянно. whetuu отрисовывается примерно за 2 мс. Самый медленный модуль выполняется как задача через std.Io, пока остальные работают параллельно, поэтому отрисовка стоит примерно столько же, сколько её самая медленная проверка, а не сумма всех проверок. Опубликованный замер получен с помощью hyperfine --warmup 40 --runs 400 на Intel Core i9-13900H 13-го поколения, ReleaseFast, с привязкой к производительным ядрам на свободной машине; в монорепозитории автора вся строка состояния обходится примерно во столько же, сколько сам по себе git status.

Остальную работу делают три детали:

Вне репозитория ни один подпроцесс не запускается. whetuu поднимается вверх от текущей директории в поисках .git, что сводится к нескольким вызовам stat, и запускает git только после того, как найдёт его. Директория без репозитория и проекта обходится в миллисекунду.

Оба подпроцесса ограничены по времени и выполняются параллельно: git получает 250 мс, опрос тулчейна - 200 мс, так что в худшем случае задержка равна большему из двух значений. Зависший на 30 секунд git всё равно вернёт приглашение через 257 мс, просто без git-сегмента.

Вызов git передаёт --no-optional-locks, поэтому git читает индекс без его обновления и никогда не захватывает index.lock, из-за чего запущенный в другом терминале git commit в противном случае завершился бы ошибкой.

Окно выбора остаётся быстрым даже на больших хранилищах, поскольку по стрелке вверх считываются только последние несколько мегабайт, а не весь файл. Оно открывается примерно за 20 мс как на хранилище в 70 МБ, так и на 400 КБ, и ничего удалять для поддержания этой скорости не требуется.

Модель безопасности

Раздел безопасности необычно детализирован для инструмента командной строки, что вполне оправданно, учитывая, что программа видит каждую выполняемую команду, а инструмент выбора сохраняет их.

В бинарнике нет сокетов, HTTP-клиента, синхронизации, телеметрии и проверки обновлений. Записываются ровно два файла: хранилище истории, создаваемое с правами 600 и сбрасываемое в 600 при каждой записи (так что файл, оставленный читаемым старой версией, исправляется сам), и кэш строк версий тулчейнов по пути ~/.cache/whetuu/versions. Оба файла располагаются в директориях XDG, а не рядом с бинарником, поэтому удаление программы никогда не удалит историю, а команда whetuu paths выводит оба пути (отмечая те, которых ещё нет).

Шелл никогда не порождается. Оба подпроцесса, git и опрос тулчейна, получают фиксированный список аргументов, а не командную строку, поэтому ничего из введённого вами не интерпретируется как команда; такие состояния, как идущий rebase, считываются напрямую из .git вообще без подпроцессов. Любой управляющий байт в команде, имени ветки или директории заменяется на ? до того, как попадёт в терминал, поэтому свежесклонированный репозиторий не сможет перерисовать ваш экран через приглашение командной строки. Отсутствие файла конфигурации означает отсутствие парсера конфигов, формата тем и какого-либо выполнения пользовательского кода при запуске.

Единственная оговорка, которую автор делает сам: языковой модуль выбирает опрашиваемый тулчейн по файлам в текущей директории, поэтому переход в непроверенный репозиторий может заставить whetuu запустить что-то вроде node --version. При этом запускается то, что находит PATH, и никогда - бинарник из репозитория.

Команды, начинающиеся с пробела, никогда не записываются, что служит спасательным кругом для всего, что содержит токены.

Установка и платформы

$ curl --proto '=https' --tlsv1.2 -fsSL https://yamafaktory.github.io/whetuu/install.sh | sh

Установщик определяет платформу, проверяет загрузку, помещает бинарник в ~/.local/bin и добавляет строку инициализации в конфиг шелла из $SHELL - только для этого шелла, без дублирования, а строку для PATH добавляет только в том случае, если ~/.local/bin ещё нет в PATH. Переменная WHETUU_NO_MODIFY=1 заставляет его напечатать строки вместо их записи, а whetuu init <shell> выводит эти строки вместе с файлом, в который они должны быть помещены. Ручной путь - tar-архив вместе с SHA256SUMS:

$ sha256sum -c SHA256SUMS --ignore-missing && tar -xzf whetuu-*.tar.gz && mv whetuu ~/.local/bin/

Релизы поддерживают macOS и Linux на архитектурах x86-64 и ARM64; сборки под Linux статически скомпилированы с musl без зависимостей времени выполнения. Удаление выполняется командой rm ~/.local/bin/whetuu && rm -rf ~/.local/share/whetuu ~/.cache/whetuu плюс удаление блока # whetuu из конфига шелла. Сборки для Windows не предоставляются.

Статус и watchlist

MIT, 35 звёзд, один участник. Репозиторий был создан 2026-07-05, а последний тег на момент ingest'а - v0.1.10 (2026-07-27), так что это трёхнедельный проект версии pre-1.0 от одного автора.

На этом основании проект добавлен в watchlist. Инженерная часть проработана аккуратно в тех местах, которые обычно упускают из виду: нюанс с --no-optional-locks, ограниченные по времени проверки, обезвреживание управляющих байтов. Отказ от конфигурационного файла заметно выделяет его на фоне настраиваемых строк приглашения, с которыми он конкурирует, однако именно эта позиция делает переход на него ставкой на вкус автора. Стоит вернуться к проекту, чтобы проверить появление второго контрибьютора, релиз 1.0, выживет ли подход без конфигурации под напором запросов на новые возможности, и поддерживается ли в актуальном состоянии список из 39 тулчейнов.