zoxideでPowerShellのディレクトリ移動をいい感じにしてみる

CUIでのディレクトリ移動を便利にする[zコマンド](https://github.com/rupa/z)を`PowerShell`で利用できるようにした[ZLocation](https://github.com/vors/ZLocation)のインストールついて、以前、下記記事で紹介しました。

[PowerShellモジュールのPSFzfとZLocationをつかってみる](https://qiita.com/SAITO_Keita/items/f1832b34a9946fc8c716)

今回、[zコマンド](https://github.com/rupa/z)と同様の機能を提供するRust製のコマンド[zoxide](https://github.com/ajeetdsouza/zoxide)をみかけたので、こちらを利用して`PowerShell`のディレクトリ移動をいい感じにしてみます。

なお`zoxide`コマンドは`fzf`コマンドとの連携も提供しているため本記事では`fzf`のインストールも行います。

## ドキュメント

- [ajeetdsouza/zoxide](https://github.com/ajeetdsouza/zoxide)
- [junegunn/fzf](https://github.com/junegunn/fzf)


## 今回の環境

- Windows 10 21H2
- PowerShell 7.3.0-preview.5
- zoxide v0.8.2
- fzf 0.30.0

## zoxideのインストール（webinstall.dev）

#2023/03/11追記

本記事執筆時点ではWindowsへのインストール方法として公式ドキュメントにwebinstall.devを使ったインストール方法が記載されていましたが、今現在、readmeの内容はwingetに切り替わっていました。

`> The recommended way to install zoxide is via winget`とあるので これからインストールする場合は、wingetを利用すればよいかと思います。

#以上、追記おわり

[Add Winget installation in the README](https://github.com/ajeetdsouza/zoxide/commit/4ded81e277bc73e72f02ea135ae5154a91fa2699)

[zoxide installation](https://github.com/ajeetdsouza/zoxide#installation)に`Windows`へのインストール方法の記載があります。

コマンド（[webinstall.dev](https://webinstall.dev)）からインストール　もしくは scoopなどの各種パッケージ管理でのインストール方法が記載されています

ここではコマンド（`webinstall.dev`）でのインストールを実施してみます。

なお`webinstall.dev`でインストールすると`~/.local/bin`に`zoxide`がインストールされました。

```PowerShell:zoxideインストール（webinstall.dev）
# webinstallでzoideをインストール
# Windows PowerShellを呼んでいるが、本記事でのWindows PowerShellのバージョンはv5.1
curl.exe -A "MS" https://webinstall.dev/zoxide | powershell
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/68e0f935-985c-aa64-e181-25427214a5d1.png)

実行結果の`IMPORTANT -- READ ME`をみるとインストール処理の中でPATHの変更も実施しているようです。

カレントセッションにはPATHが反映されないので、カレントセッションのPATHを更新するかセッションを再起動しまて環境変数PATHを読み込み直します。
（今回は`Windows Terminal`上で動かしていたので、`Windows Terminal`を再起動しました）


## PowerShellの起動Profileにzoxideを追加する

[Step 2: Add zoxide to your shell](https://github.com/ajeetdsouza/zoxide#step-2-add-zoxide-to-your-shell)

今回インストールした`zoxide`は`v0.8.2`のため下記を起動プロファイルに追加しました。

```PowerShell:$profile
# For zoxide v0.8.0+
Invoke-Expression (& {
    $hook = if ($PSVersionTable.PSVersion.Major -lt 6) { 'prompt' } else { 'pwd' }
    (zoxide init --hook $hook powershell | Out-String)
})
```

上記コマンドが起動処理で何をやっているかといえば、function `__zoxide_z` と `__zoxide_zi` を定義して、それぞれのfunctionにalias `z` , `zi` を設定していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/ba2cf942-015a-54ac-6fc9-5acec5f5902a.png)

## fzfのインストール

起動処理で登録されるalias `zi`は`fzf`と連携するaliasとなるため`fzf`コマンドをインストールします。

[junegunn/fzf](https://github.com/junegunn/fzf)

ここではWindows用のバイナリをダウンロードしてPATHを通しておきます。

[fzf - Releases](https://github.com/junegunn/fzf/releases)

バイナリをダウンロードしてPATHを通してバージョン確認した図。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/1900c212-135a-f3f4-be70-883e52ebd94c.png)

なお`Note: zoxide only supports fzf v0.21.0 and above.` と記載があるのでインストールするバージョンは最新をいれておきます。

## z と zi を実行してみる。

今回は 事前に`c:\temp\foo\bar`というディレクトリを用意して`z`と`zi`で移動してみます。

```PowerShell

# 事前に用意したディレクトリc:\temp\fooに移動
cd c:\temp\foo

# 事前に用意したディレクトリc:\temp\foo\barに移動
cd c:\temp\foo\bar

# ~に移動
z

# zコマンドでc:\temp\foo\barがマッチ、移動する
z foo bar

# ziでfzfで移動先ディレクトリの選択が表示
zi

```

`z`コマンドでc:\temp\foo\barに移動し、`zi`コマンドでc:\temp\fooに移動してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/f9de886e-d254-5105-248a-efd8c0f557b6.png)

## 履歴を表示・編集する

`zoxide`では移動した事のあるディレクトリの情報を管理していますが、下記で履歴を表示・編集できます。

```PowerShell
# 一覧表示
zoxide query -ls

# 指定したPATHを削除
zoxide remove <<PATH>>

# 一覧表示してremoveしたPATHが消えている事を確認
zoxide query -ls

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/7a9014c6-c3f3-2628-2ed1-08f30e2c7835.png)

## 総評

`z`コマンドを`PowerShell`で利用できるようになる、`zoxide`コマンドを見かけたので今回使用してみました。