EnglishРусский Map
Editor-as-UI pattern

Текстовый редактор как интерфейс (Dave Gauer)

title
Текстовый редактор как интерфейс (Dave Gauer)
type
summary
summary
Использование $EDITOR как UI закрывает разрыв между флагами CLI и TUI; прецеденты - crontab -e, git commit, visudo и vipw
tags
cli, unix, shell, design-pattern
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. Скрипт:

  1. Сканирует целевой каталог по маске, чтобы перечислить доступные подкаталоги.
  2. Считывает настройки прошлого запуска из фиксированного пути (download.txt) - они сохраняются между вызовами, это не mktemp.
  3. Записывает файл из четырёх строк: комментарий со списком доступных подкаталогов, затем на трёх следующих строках - выбранный подкаталог, базовое имя файла и URL.
  4. Вызывает vim для редактирования этого файла.
  5. Считывает файл обратно, валидирует и запускает 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 - блог Дэйва Гауэра в формате "карточек"