Текстовый редактор как интерфейс (Dave Gauer)
- title
- Текстовый редактор как интерфейс (Dave Gauer)
- type
- summary
- summary
- Использование $EDITOR как UI закрывает разрыв между флагами CLI и TUI; прецеденты - crontab -e, git commit, visudo и vipw
- parent
- editor-as-ui
- tags
- cli, unix, shell, design-pattern
- sources
- text-editor-as-ui
- created
- 2026-04-30
- updated
- 2026-04-30
- lang
- ru
- translation_of
- text-editor-as-ui
- source_updated
- 2026-04-30
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Дэйв Гауэр (ratfactor) в посте формата карточки описывает паттерн, которым пользуется всё чаще: когда CLI-инструменту нужно больше нескольких флагов, но полноценный TUI избыточен, пользователю отдаётся временный файл и вызывается $EDITOR. Всё дело в самом разрыве. Разбор аргументов почти ничего не стоит. Настоящий TUI требует "годы" усилий. Большинство личных инструментов живёт как раз посередине, и у Unix с ранних времён есть тихое готовое решение.
Прецеденты хорошо знакомы: crontab -e для таблицы cron, git commit для сообщения коммита, visudo для /etc/sudoers, vipw для /etc/passwd. Все четыре открывают временный файл, дают пользователю его отредактировать, а затем проверяют и применяют изменения. vipw - самый наглядный пример, потому что проверка целостности - его единственная цель: страница man прямо указывает, что утилита "will not allow a password file with a 'mangled' entry to be installed".
Версия в три строки
Минимальная демонстрация - shell-скрипт, запускающий rev для всего, что вы введёте:
FILE=$(mktemp)
$EDITOR $FILE
rev < $FILE
Три строки - и пользователь получает всю выразительную мощь своего редактора: поиск, подсветку синтаксиса, мультикурсоры, вставку из буфера обмена и всё, что у него уже настроено. Мысль Гауэра: цена этой мощи для пользователя - одна строка скрипта. Написание TUI-виджета для ввода текста со схожими возможностями заняло бы год и потребовало собственной документации.
Пример с yt-dlp
Более содержательный пример - обёртка на Ruby вокруг yt-dlp, скачивающая видео в выбранный подкаталог внутри /media/video. Скрипт:
- Сканирует целевой каталог по маске, чтобы перечислить доступные подкаталоги.
- Считывает настройки прошлого запуска из фиксированного пути (
download.txt) - они сохраняются между вызовами, это неmktemp. - Записывает файл из четырёх строк: комментарий со списком доступных подкаталогов, затем на трёх следующих строках - выбранный подкаталог, базовое имя файла и URL.
- Вызывает
vimдля редактирования этого файла. - Считывает файл обратно, валидирует и запускает
yt-dlp, добавляя к имени выходного файла суффикс с меткой времени.
# cs_lectures film howto sketchbooks watercolor
howto
fix_toilet
https://example.com/how-to/fix-a-toilet.html
Здесь стоит выделить два архитектурных решения. Доступные подкаталоги выводятся в виде комментария в начале, поэтому их не нужно держать в памяти - экран редактора сам становится документацией. А файл настроек используется повторно, а не генерируется заново, так что при следующем запуске URL и подкаталог из прошлого раза уже подставлены по умолчанию.
Суффикс с меткой времени в имени файла (fix_toilet_1777324491.mp4) избавляет от необходимости вычислять "следующий порядковый номер" - сортировка по mtime или имени файла даёт тот же порядок без лишних усилий.
Когда паттерн подходит
Гауэр завершает практическим правилом: если набор параметров разрастается больше чем на три-четыре строки, стоит перейти на структурированный формат внутри того же файла - .ini, .conf, .toml. Суть в том, чтобы формат оставался тривиальным для разбора без сторонних библиотек. Весь приём теряет привлекательность, как только требуется парсер сложнее each_with_index.
В качестве естественных кандидатов он называет find, ffmpeg и rsync - инструменты, CLI которых настолько перегружен, что даже регулярные пользователи держат файл с заметками и рабочими примерами вызовов. Обёртка в духе "редактор как UI" превращает такой файл с заметками в полноценный интерфейс.
Почему это работает
Некоторые особенности паттерна легко упустить из виду:
- Нулевая документация. Пользователь уже знает свой редактор. Не нужно объяснять навигацию, отмену действий (undo) или автодополнение.
- Композируемость. Временный файл - это просто текст, поэтому он отлично работает с системами контроля версий, diff'ами и пайпами shell, если нужно проверить, что именно запускалось.
- Сохранение состояния по умолчанию. Постоянный файл настроек (в отличие от
mktemp) позволяет выполнить второй запуск буквально в одно нажатие клавиши после первого. - Непривилегированность. Никакого curses, терминальных режимов или обработки сигналов. Скрипт можно прервать, возобновить или направить в пайп, а всю сложность работы с терминалом берёт на себя редактор.
Широкую известность паттерн получил благодаря git commit, который к тому же наглядно показывает шаг валидации: пустое сообщение отменяет коммит. Собственные скрипты Гауэра делают то же самое с помощью явных проверок существования файлов и каталогов после того, как редактор завершает работу.
Связанные страницы
- editor-as-ui - более широкая концептуальная страница
- clean-code-coding-agents - та же философия минимального контекста в эпоху LLM
- ratfactor - блог Дэйва Гауэра в формате "карточек"