Часы теряются не в наборе
Обрыв SSH-сессии — полезная мысленная модель, потому что сразу видно, что именно умирает. Не окно: запущенная сборка, хвост лога, полстроки команды, которую вы не успели отправить, набранные вручную пути. Восстановление — не одно действие, а десяток мелких: переподключиться, вспомнить каталог, снова поднять просмотр лога, отыскать вчерашнюю команду. По отдельности каждая мелочь стоит секунды. В сумме это самая дорогая часть работы в терминале.
Потери двух сортов. Первый — нажатия: длинные команды, повторяемые пути, опечатки. Второй — память и состояние: «как называлась та команда», «где лежал конфиг», «что было открыто». Первый сорт виден, поэтому его и оптимизируют первым. Второй не виден, но именно он съедает часы: узкое место не в скорости набора, а в том, что вы заново вспоминаете то, что система уже знала.
Проверить это на себе можно без чужих цифр. Один рабочий день отмечайте четыре события: стрелка вверх, которую жмёте несколько раз подряд, докапываясь до нужной команды; команда, которую вы уже набирали сегодня; сессия, открытая заново; каталог, который пришлось искать глазами. Смысл не в подсчёте секунд — каждое событие стоит минут восстановления контекста вокруг него. Дальше простая арифметика: частота событий, умноженная на ваши рабочие дни; значения подставьте свои, чужие здесь не помогут. Если за день список пуст — закройте материал, он вам не нужен. Это честный ответ, а не дежурная оговорка.
Тупик: первое, что пробуют, — ускорить набор
Почти каждый начинает с одного и того же, и мы не исключение: меняют эмулятор на модный и быстрый, ставят тему, шрифт со значками, промпт со стрелочками, заводят десяток алиасов — а то и чужую сборку «всё включено» целиком. Логика понятна: это видно каждый день, делается за вечер, и интуиция шепчет, что «быстрый терминал» — это тот, который быстрее рисует буквы.
Не работает, и вот почему. Все эти меры бьют по первому сорту потерь — по нажатиям. А нажатия — дешёвая часть работы: набрать даже длинную команду быстрее, чем её вспомнить или найти, где она была. Рендеринг текста давно не узкое место: терминал рисует строки быстрее, чем вы их читаете, ускорять нечего. Настоящие часы сидят во втором сорте, в восстановлении состояния, — и косметика не касается ни одного из этих процессов. Она оптимизирует то, что и так работает быстро, и не трогает то, что работает медленно. Отсюда типичный итог: вечер потрачен, выглядит красиво, а события из аудита — стрелка вверх, повторный набор, мёртвая сессия — случаются так же часто, как раньше.
С алиасами ловушка глубже. Пока список короткий, память справляется. Дальше он растёт быстрее, чем запоминается: вы добавляете сокращение, дважды им пользуетесь, забываете — и снова набираете команду целиком. Кладбище алиасов не экономит ничего, но требует памяти — то есть добавляет работу того самого типа, с которым борется. Работают только сокращения, которые вы набираете каждый день; остальное — балласт, который к тому же молча теряется при переезде на машину без вашего конфига.
С чужой сборкой беда та же, только дороже. Вы получаете не настройку, а чужую мышечную память: сочетания клавиш, которые срабатывают неожиданно, поведение, которое вы не выбирали, модули, о существовании которых не догадываетесь. Когда это ломается, чинить нечем — конфиг писали не вы. И на чужой машине вы беспомощны вдвойне: там нет ни вашей настройки, ни привычной чужой.
Оговорка ради честности: косметика не вредна. Если промпт со стрелочками радует глаз — оставьте: приятным инструментом пользуются чаще. Просто не путайте счета: косметика платит по счету настроения, а не по счету часов.
Шаг 1. История, которую можно искать
Если делать из этого материала одну вещь — вот эту.
Скелет — шелл с общей историей. В zsh это несколько строк в .zshrc:
HISTSIZE=50000
SAVEHIST=50000
setopt SHARE_HISTORY
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_REDUCE_BLANKS
setopt HIST_IGNORE_SPACE
Что делает каждая строка. SHARE_HISTORY — история общая для всех открытых окон: команду, набранную в одном, находите из другого, и после перезапуска шелла ничего не пропадает. HIST_IGNORE_ALL_DUPS — история не зарастает повторами одной команды, поиск не тонет в мусоре. HIST_REDUCE_BLANKS — лишние пробелы не плодят близнецов. HIST_IGNORE_SPACE — команда, начатая с пробела, в историю не пишется: так удобно запускать команды с токенами, не отключая историю целиком. Размер буфера — стартовое значение; критерий подбора один: вы никогда не должны долистывать историю до конца.
Дальше — fzf, и это главный рычаг. Без него Ctrl+R в zsh предлагает одну запись за раз, и угадать заранее, какую, нельзя. С fzf Ctrl+R превращается в живой поиск по подстроке: набираете обрывок того, что помните — имя образа, кусок флага, — и видите все совпадения сразу, полным текстом. Механизм экономии простой: вы перестаёте держать команды в голове, в заметках и в чатах. Терминал помнит лучше вас — надо было только дать ему нормальный доступ к собственной памяти. Ставится пакетным менеджером вашей системы; в документации fzf найдёте строку подключения сочетаний для вашего шелла — её и скопируйте в конфиг.
Третий кусок — zoxide, прыжки по посещённым каталогам: короткая команда переносит туда, где вы уже были, по фрагменту пути. Условие применимости честное: если ваш день — один репозиторий, пропустите, прыгать некуда. Если проектов и серверов много, это самый быстрый по отдаче кусок: путь, который раньше набирался целиком, заменяется фрагментом.
И мнение, которое можно оспаривать: не ставьте ради всего этого фреймворк-обёртку. Строки истории, поиск и прыжки собираются руками за вечер и понятны насквозь. Захочется большего — соберёте сами, и это будет ваш конфиг, а не чужой. Если устройство оболочки вам не интересно и результат нужен к утру — фреймворк честнее, чем страдание; но тогда хотя бы прочитайте, что он включает.
Шаг 2. Сессии, которые не умирают
tmux закрывает второй сорт потерь. Устройство: tmux — сервер, ваши окна — клиенты. Сессии живут отдельным процессом на той машине, где запущены, и их не трогают ни обрыв связи, ни случайно закрытое окно, ни перезапуск эмулятора. Прикрепление возвращает всё как было: те же каталоги, те же запущенные процессы, тот же хвост лога.
Приём, ради которого всё затевается, — именованные сессии под задачи. Одна — «деплой»: слева сборка, справа лог сервера. Другая — под проект: тесты, шелл для гит-команд. Сессия — это сохранённый контекст задачи: вернуться к работе значит прикрепиться, а не восстанавливать окружение по памяти. Вот где часы — не в скорости набора, а в том, что переключение между задачами перестаёт стоить восстановления. И не проектируйте идеальную схему сессий заранее: начните с одной под текущую задачу, именование появится само, когда почувствуете, что переключаетесь.
Условия применимости. По SSH — обязательно: обрыв соединения перестаёт быть событием, после которого всё поднимается заново. Локально — если запускаете долгие задачи: сборку, тесты, миграции — и не хотите привязывать их к окну. Если весь день проходит в IDE, а терминал — вспомогательное окно на две команды, tmux можно отложить без потерь.
Цена входа — раскладка: префикс и сочетания поначалу раздражают, это придётся пережить. Минимальный набор — новая сессия, переключение, отсоединение, деление окна; остальному учит ситуация, а не список горячих клавиш.
Шаг 3. Конфиг как код
Последний слой — воспроизводимость. Дотфайлы в git-репозитории плюс скрипт, который расставляет симлинки на нужные места; или GNU stow, если хочется готовой обвязки. Смысл: новая машина настраивается не «вспомнить всё заново», а «запустить один скрипт и подождать».
Выгод две, и вторая важнее. Первая — переезд: вторая машина, переустановка, новый сервер перестают быть проектом на день. Вторая — история изменений вашего же конфига: неудачную правку видно и можно откатить, как в коде. Конфиг вне версионного контроля рано или поздно теряется вместе с машиной — и весь накопленный настрой возвращается в статус «вспоминать заново».
Расчёт здесь тот же честный, что и в споре о self-hosted вместо подписок: разовая цена против постоянной. Платите часами на поддержку конфига — экономите часами на восстановлении. Посчитайте обе величины для себя: как часто садитесь за чистую машину и сколько стоит восстановление без репозитория. Если садитесь раз в несколько лет — отложите и этот шаг, он не окупится.
Позиция редакции
Мы считаем: терминал стоит настраивать как память и состояние, а не как внешний вид. Минимальный набор, дающий экономию уровня часов, — общая история, поиск по ней через fzf, живучие сессии через tmux, конфиг в git. Косметика — по желанию, алиасы — только те, что вы набираете каждый день. Начать стоит с истории и поиска: это один вечер, остальное добавится само, по мере того как начнёт бесить.
Условие, при котором мы неправы: вы работаете на одной машине, в одном долгоживущем проекте, без SSH и переустановок, и набор команд у вас стабилен из года в год. Тогда часам теряться неоткуда — восстанавливать нечего, вспоминать нечего, переезжать некуда. Честный выбор в этой ситуации — терминал из коробки и пара алиасов. Проверка та же, что в первом разделе: пустой список потерь за день означает, что вы и живёте в этом условии.