zoxide + fzf: как перестать печатать пути в терминале
Установил zoxide. Не работает.
Полчаса искал причину — оказалось, сам сломал одной строкой.
Починил, добавил fzf. Теперь z hsl вместо cd ~/Documents/GitHub/hsl-dashboard.
Что такое zoxide
Умный cd. Запоминает куда ты ходишь и потом прыгает туда по ключевому слову.
Написан на Rust, работает быстрее autojump в 10 раз. Стартует за 5ms против 50ms у autojump. На практике разница незаметна, но приятно.
Алгоритм называется frecency — комбинация частоты и свежести. Директория куда ходил вчера весит больше, чем та куда заглядывал месяц назад. Со временем старые пути опускаются вниз рейтинга.
Установка
brew install zoxide
Потом добавить в ~/.zshrc:
eval "$(zoxide init zsh)"
Перезапустить терминал. Всё.
Как я сломал zoxide одной строкой
У меня в конфиге было:
eval "$(zoxide init zsh)"
alias z='cd'
Видишь проблему? Alias перезаписывает функцию z, которую создаёт zoxide. Вместо умного прыгуна получаем обычный cd.
Хуже того — ломается hook. zoxide записывает пути в базу через функцию __zoxide_hook, которая вызывается при каждой смене директории. Alias убивает эту связь.
--cmd cd при инициализации, а не alias.
Удалил строку с alias. Заработало.
Как пользоваться
Сначала база пустая. Ходишь по директориям через cd — zoxide запоминает каждый переход.
cd ~/Documents/GitHub/my-project
cd ~/Downloads
cd /etc/nginx
Дня за два-три база заполнится. Дальше прыгаешь:
z my-project # → ~/Documents/GitHub/my-project
z down # → ~/Downloads
z nginx # → /etc/nginx
Можно комбинировать слова: z git my найдёт что-то типа ~/Documents/GitHub/my-project.
Добавляем fzf для интерактивного выбора
Tab-completion для zoxide требует fzf. Без него z foo<TAB> работает только для локальных директорий.
brew install fzf
После этого открываются два режима:
| Ввод | Что делает |
|---|---|
z foo<TAB> |
Completion локальных директорий |
z foo <TAB> |
Интерактивный выбор из базы zoxide |
zi foo |
То же самое — fzf-выбор |
Обрати внимание на пробел. z foo<TAB> и z foo <TAB> — разные вещи. С пробелом открывается fzf со списком всех путей из базы.
zi. Это alias для интерактивного режима. zi git сразу откроет fzf с фильтром.
Полезные команды
| Команда | Что делает |
|---|---|
zoxide query -ls |
Показать всю базу с весами |
zoxide add /path |
Добавить путь вручную |
zoxide remove /path |
Удалить путь из базы |
Альтернативы
Есть autojump, оригинальный z, fasd. Я выбрал zoxide.
Rust. Быстрее autojump в 10 раз — 5ms на старт против 50ms. На практике не замечаешь, но на слабых машинах разница есть.
fzf-интеграция из коробки. 32K звёзд на GitHub, активная разработка.
autojump работает, но медленнее. Оригинальный z — shell-скрипт, fuzzy search нет. fasd заархивирован в 2022.
Итого
Две команды:
brew install zoxide fzf
echo 'eval "$(zoxide init zsh)"' >> ~/.zshrc
У меня в базе 120 путей за месяц. Чаще всего: z hsl, z whisper, z claude. Секунды на каждом переходе — за день набегает.
Источники
- zoxide на GitHub
- Официальный блог zoxide
- zoxide vs autojump — сравнение производительности
- zoxide: tips and tricks — Bozhidar Batsov
- fzf на GitHub
Подписаться на обновления — @sereja_tech