世界を動かす技術を、日本語で。

Zoxide: より良いCDコマンド

2025年9月23日原文(github.com)

概要

zoxide は、よく使うディレクトリへの高速移動を実現する スマートcdコマンドLinux, macOS, Windows など、主要なシェルに対応。 fzf との連携やデータインポートなど 柔軟な拡張性 を提供。 簡単なインストール方法 と幅広い サードパーティ統合設定やカスタマイズ も豊富で、様々なワークフローに対応。

zoxide概要

  • zoxide は、 zautojump に触発された次世代cdコマンド
  • 使用頻度の高いディレクトリを記憶し、 数キーでジャンプ 可能
  • すべての主要シェル( bash, zsh, fish, PowerShell など)に対応
  • fzf によるインタラクティブ選択や補完機能もサポート
  • シンプルなコマンド構文で、従来のcdコマンドと互換性

基本的な使い方

  • z foofoo を含む最も使用頻度の高いディレクトリに移動
  • z foo barfoobar を含むディレクトリにジャンプ
  • z foo /foo で始まるサブディレクトリに移動
  • z ~/foo:通常のcdコマンドのようにも利用可能
  • z foo/:相対パス移動対応
  • z ..:1階層上のディレクトリへ
  • z -:直前のディレクトリに戻る
  • zi foofzf を使ったインタラクティブ選択
  • z foo<SPACE><TAB>:補完候補の表示(bash 4.4+/fish/zsh, zoxide v0.8.0+)

インストール方法

  • Linux / WSL
    • 推奨:インストールスクリプト curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh
    • 主要ディストリビューションでのパッケージマネージャ対応
      • 例:apt install zoxide, dnf install zoxide, pacman -S zoxideなど
  • macOS
    • Homebrew: brew install zoxide
    • cargo: cargo install zoxide --locked
    • その他(asdf, conda, MacPorts, nixpkgs等)にも対応
  • Windows
    • 推奨:winget install ajeetdsouza.zoxide
    • 他:Chocolatey, Scoop, conda-forge, cargo等
  • BSD / Android
    • 各種パッケージマネージャ、またはインストールスクリプトで対応

シェルごとのセットアップ

  • Bash eval "$(zoxide init bash)"~/.bashrc の末尾に追加
  • Zsh eval "$(zoxide init zsh)"~/.zshrc の末尾に追加 ※補完機能はcompinit後に記述
  • Fish zoxide init fish | source~/.config/fish/config.fish に追加
  • PowerShell Invoke-Expression (& { (zoxide init powershell | Out-String) })$profile の末尾に追加
  • その他 Elvish, Nushell, Tcsh, Xonsh, POSIX Shellにも対応

fzfとの連携(オプション)

  • fzf はzoxideのインタラクティブ選択や補完に利用
  • fzfのインストール推奨(最低バージョンv0.51.0)

既存データのインポート(オプション)

  • autojump, fasd, z, z.lua, zsh-z, ZLocation 等からデータ移行可能
  • zoxide import --from=autojump "/path/to/autojump/db"等のコマンドで実行
  • 各OSやプラグインによるパス指定要確認

設定・カスタマイズ

  • zoxide init 時のフラグ
    • --cmd:コマンド名の変更(例:--cmd jjコマンドに)
    • --hook:ディレクトリスコア更新タイミング(none, prompt, pwd)
    • --no-cmd:z/ziコマンド定義を抑止
  • 環境変数
    • _ZO_DATA_DIR:データベース保存ディレクトリ
    • _ZO_ECHO:ジャンプ前にディレクトリ表示(1で有効)
    • _ZO_EXCLUDE_DIRS:除外ディレクトリ指定(:や;で区切る)
    • _ZO_FZF_OPTS:fzfのカスタムオプション
    • _ZO_MAXAGE:データベースのエントリ最大数(デフォルト10000)
    • _ZO_RESOLVE_SYMLINKS:シンボリックリンク解決(1で有効)

サードパーティ統合

  • メールクライアント :aerc
  • macOSランチャー :alfred-zoxide, raycast-zoxide
  • Windowsコマンド強化 :clink-zoxide
  • テキストエディタ :emacs(zoxide.el), vim/neovim(zoxide.vim, telescope-zoxide)
  • ファイラ :lf, nnn, ranger, joshuto, felix, yazi, xplr, rfm等
  • tmuxセッション管理 :sesh, tmux-session-wizard, tmux-sessionx
  • その他 :zsh-autocomplete, xxh, zabb, zesh, zellij等

注意事項・補足

  • Debian系ディストリ はパッケージ更新が遅い場合があるため、スクリプトインストール推奨
  • 環境変数の設定方法 はシェルごとに異なるため、公式Wikiを参照
  • 詳細なマッチングアルゴリズム や使い方は公式ドキュメント参照

zoxide の導入により、日々のディレクトリ移動が圧倒的に効率化 多彩なシェル・ツール連携 で、あらゆるワークフローにフィット シンプルな設定と強力なカスタマイズ性 で、初心者から上級者までおすすめ

Hackerたちの意見

ほんとにいいよね。fzfとzoxideは、僕の中で一番変革をもたらしたCLIツールだよ。ターミナルがすごく快適に感じる。

実は、zoxideをラップするgit worktree対応の関数「w」を作ったんだ。これを使うと、メインのworktreeに切り替えてzを実行して、元のworktreeに戻れるんだ。これで、zoxideが別のworktreeに切り替わるのがイライラしなくなるし、新しいworktreeはすぐにzoxideのスコアを引き継ぐよ。他のworktreeはzoxideのデータベースから消去して、gitリポジトリ内ではzの代わりにwを使う感じ。最近はgitからjjに切り替えたから、しばらく使ってないけどね。

zoxideをしばらく試してみたけど、なんかふわふわした感じが嫌で、使い道のほとんどはZSHの履歴検索で90%解決できることに気づいたんだ。要するに、常に変動するショートカットのセットを持つことになるから、結果がちゃんと得られたか確認しないといけなくて、間違って別の場所に行ってしまうこともある。タブ補完や履歴の方がずっと予測可能だから、そっちの方が楽だな。違うワークフローや環境の人には良いかもしれないけどね。

うん、最近試してるけど、使い続けたいかはまだ決めかねてる。今一番イライラしてるのは、2つのディレクトリ「thing」と「thing-api」があって、「thing」で作業することが多いんだけど、「z thing」を実行すると最初に「thing-api」に行っちゃうんだ。それで、もう一度「z thing」を実行しないといけなくて、普通のcdコマンドでタブ補完や履歴検索した方が楽だなって思う。

俺は普段、プロジェクトA、プロジェクトB、プロジェクトCみたいな数個のフォルダでしか作業しないから、そこの優先度を教えたら、名前の一部を打つだけでちゃんと動いてくれるんだよね。

fzfの補完を使って、source /dev/nullと ショートカットを使ってるよ。例えば、cd ~/ とか、cd -で前のディレクトリに戻る時に使ってる。

そうだね、「z d」でダウンロードフォルダにいつでも行けるのは、ふわっとしたマッチよりもずっと強力だし、残念ながらプロジェクトは予測可能な入力メカニズムを追加したくなかったみたいだけど、将来的には変わるかもね…。

Zshの履歴を使って特定のフォルダに移動するのってどうやってるの?例えば、いつもホームディレクトリ(~)からcdを始めるってこと?相対ディレクトリにcdする方が通常はキー入力が少ないから聞いてるんだけど(関連するディレクトリで作業してる前提ね)。でもそうすると、履歴のcdエントリーは特定の開始パスを想定しちゃうから、履歴から呼び出すのが普遍的に役立たないってことになるよね?それと、>「問題は、結果がちゃんと得られたかを常に確認しなきゃいけないし、間違った場所に行ってないかも気にしなきゃいけないこと。」って言ってたけど、なんで現在のパスをプロンプトに追加しないの?それがないと、どのディレクトリにいるのか全然分からなくて、どうやって作業するのか想像もつかないよ。

最近zoxideについて発見した便利なことは、basedirフラグがあることだね。理論的には、今いるディレクトリやgitのルートに基づいてクエリをスキャンできるんだ。例えば、alias zg=‘zoxide —basedir $(git rev-parse --show-toplevel)’みたいな感じ。https://github.com/ajeetdsouza/zoxide/pull/1027

わあ!それは本当に便利だね!

僕にとって、このシンプルなツールは最高のコマンドラインチェンジャーだよ!フォルダーツリーを移動するためにたくさんのコマンドを使う代わりに、行きたいところにジャンプできる。あと、使ってるいいツールは、シェル用のFish(https://fishshell.com/)、プロンプト用のStarship(https://starship.rs/)、ファイルプレビュー用のbat「翼のある猫」(https://github.com/sharkdp/bat)だね。

eza(https://github.com/eza-community/eza)も好きで、これは現代的なlsだよ。でも、Fishが一番のゲームチェンジャーかな。

Hacker Newsで議論の続きを見る