mcfly заменяет стандартный поиск по истории команд, который открывается по Ctrl-R, на полноэкранный интерфейс с ранжированием. Он запоминает не только текст команды, но и каталог, код возврата, время и длительность выполнения, а порядок подсказок со временем подстраивает небольшая нейросеть, обученная локально. База хранится в SQLite на вашей машине и никуда не синхронизируется.
Как это работает
Оболочка передаёт mcfly каждую выполненную команду через hook. Запись попадает в базу вместе с контекстом: текущий каталог, статус завершения, время запуска. При нажатии Ctrl-R mcfly выбирает кандидатов, сортирует их с учётом контекста и показывает список. Стрелки двигают выделение, Enter сразу выполняет команду, Tab переносит её в строку редактирования, Delete удаляет запись из истории, Esc закрывает интерфейс.
В отличие от облачных решений, здесь нет сервера и синхронизации между машинами. Зато нет и сетевых зависимостей: поиск работает офлайн, а данные не покидают компьютер. Плата за это — необходимость отдельной настройки на каждом хосте.
Установка
Сначала проверьте пакет в репозитории: в Debian и Ubuntu он может называться просто mcfly. Если пакета нет или версия устарела, соберите утилиту из исходников через cargo — так вы получите свежий бинарник без сторонних скриптов установки.
apt policy mcfly
cargo install mcfly
mcfly --version
command -v mcfly
После сборки бинарник оказывается в ~/.cargo/bin. Убедитесь, что каталог есть в PATH, иначе hook не запустится и Ctrl-R останется прежним.
Подключение к оболочке
Для bash добавьте строку в ~/.bashrc, для zsh — в ~/.zshrc. Строка должна идти после остальных настроек истории и после возможных конкурентов вроде fzf или Atuin: все они претендуют на Ctrl-R, и победит тот, кто привязал клавишу последним.
# ~/.bashrc
export MCFLY_HISTORY_LIMIT=50000
export MCFLY_RESULTS=25
export MCFLY_FUZZY=1
export MCFLY_KEY_SCHEME=vim
eval "$(mcfly init bash)"
Для zsh используется eval «$(mcfly init zsh)». Для fish проверьте наличие подкоманды mcfly init fish: если оболочка не поддерживается, останется её встроенный поиск. После правки перезапустите оболочку через exec bash -l или откройте новый терминал.
Проверить привязку можно командой bind -P | grep ‘\C-r’ в bash и bindkey ‘^R’ в zsh. Если там остаётся старая функция, hook не встал или перекрыт другим инструментом.
Первый запуск
Нажмите Ctrl-R и введите фрагмент команды. Первые результаты могут показаться случайными: нейросеть обучается на ваших выборах, поэтому через несколько дней подсказки становятся точнее. Не оценивайте инструмент по первому запуску. Старую историю mcfly импортирует из файла, указанного в HISTFILE, при первом запуске.
База лежит в ~/.local/share/mcfly/history.db. Проверить размер и схему можно без догадок:
ls -lh ~/.local/share/mcfly/history.db
sqlite3 ~/.local/share/mcfly/history.db '.tables'
sqlite3 ~/.local/share/mcfly/history.db 'select count(*) from commands;'
Если таблица называется иначе, .tables покажет фактическое имя. Размер базы растёт медленно, но при десятках тысяч записей стоит ограничить историю.
Настройка под себя
Переменные окружения читаются при старте оболочки. MCFLY_HISTORY_LIMIT задаёт, сколько последних записей хранить; MCFLY_RESULTS — размер списка на экране; MCFLY_FUZZY включает нечёткий поиск; MCFLY_KEY_SCHEME переключает раскладку управления на vim или emacs; MCFLY_INTERFACE_VIEW перемещает список вверх или вниз; MCFLY_DISABLE_MENU убирает нижнюю строку подсказок.
export MCFLY_INTERFACE_VIEW=TOP
export MCFLY_DISABLE_MENU=1
export MCFLY_KEY_SCHEME=emacs
eval "$(mcfly init bash)"
Не увеличивайте лимит бездумно: каждый запуск читает базу, и на слабой машине огромная история заметно тормозит поиск. Практичный диапазон — от 20 до 50 тысяч команд.
Переменная MCFLY_HISTORY_LIMIT влияет только на глубину поиска, а не на файл истории оболочки. Если нужно сохранить длинную историю, но ускорить отклик, начните с 30 тысяч записей и сравните время открытия списка.
Контекст и повторяемые команды
Главное отличие от простого grep по истории — учёт каталога. Команда make в каталоге проекта и make в домашней папке получат разные оценки, поэтому в списке первыми окажутся те, что вы запускали именно здесь. Команды с ненулевым кодом возврата ранжируются ниже: mcfly учитывает, завершилась ли попытка успешно.
Это удобно для docker compose, git, pytest и других команд, которые повторяются в одном проекте. Но контекст не заменяет aliases и скрипты: если команда длинная и опасная, лучше оформить её отдельным файлом с проверками.
Секреты в истории
Любая команда с токеном, паролем или ключом доступа может попасть в базу. Надёжный минимум — не печатать секреты в командной строке, а передавать их через файл с правами 600 или переменную окружения. Для разовых случаев помогает HISTCONTROL=ignorespace: команда с ведущим пробелом не попадает в историю оболочки, но hook mcfly нужно проверить отдельно.
export HISTCONTROL=ignorespace
export HISTIGNORE='*token*:*password*'
ls -l ~/.local/share/mcfly/history.db
chmod 600 ~/.local/share/mcfly/history.db
Уже сохранённую запись удалите через Delete в интерфейсе. Если секрет всё же попал в базу, смените его, а не ограничивайтесь удалением строки: копии могли остаться в резервных снимках.
Диагностика
- Ctrl-R открывает старый поиск — проверьте порядок строк в rc-файле и привязку клавиши.
- mcfly: command not found — добавьте ~/.cargo/bin в PATH.
- Поиск медленный — уменьшите MCFLY_HISTORY_LIMIT и проверьте размер базы.
- Подсказки не учитывают каталог — убедитесь, что hook активен в текущей оболочке.
- История пуста — проверьте HISTFILE и права на базу.
bind -P | grep '\C-r'
echo "$PATH" | tr ':' '\n' | grep cargo
du -h ~/.local/share/mcfly/history.db
mcfly search git
Если база повреждена, её можно пересоздать: закройте терминалы, сохраните копию файла и удалите его, затем запустите новую оболочку. История оболочки при этом останется в HISTFILE, но контекст и обучение начнутся заново.
Чем отличается от Atuin
Atuin тоже ищет по истории, но делает ставку на синхронизацию между машинами и шифрование, а mcfly — на локальное ранжирование с учётом каталога и простую установку без сервера. Если у вас один компьютер, mcfly обычно легче; если несколько — смотрите на модели синхронизации и доверие к серверу.
Итог
mcfly полезен там, где история давно превратилась в свалку, а Ctrl-R выдаёт последние десять команд вместо нужной. Он не требует облака, хранит данные локально и учитывает контекст, но требует дисциплины в обращении с секретами и аккуратной привязки к оболочке. Начните с лимита в 20–30 тысяч записей и проверьте, что старая привязка Ctrl-R действительно заменена.