FLINTERS BLOG
📝

yaziで遊ぼう。

に公開

こんにちは! FLINTERSのあべです。
この記事はFLINTERS社員によるアドベントカレンダーの7日目の記事です。

今回はターミナルファイルマネージャーのyazi(ヤジと読むぽい?)で遊んでみたので、設定まわりをメモします。

特にzellijとの連携でハマったのでその解決策も含めて書いておきます。

やりたかったこと

1. 最低限の便利設定をしておく

  • 誤削除防止
  • ファイルやディレクトリパスコピー

2. ディレクトリやファイルを別paneで開けるようにする

  • ディレクトリ上で Enter → zellijで下スプリットして新しいpaneを開く
  • ファイル上で Enter → vimで開く
  • s キー → zellijで右スプリットして新しいpaneを開く

3. プラグイン追加を試す

  • ファイル一覧にgitステータスを表示する

1. 最低限の便利設定

デフォルトのキーバインディングはこちらを参照。

今回は、 ~/.config/yazi/keymap.toml に以下を追加:

# 選択したファイル/ディレクトリをゴミ箱に移動
#(デフォルトはdだけでゴミ箱行きなので、誤削除防止に2回にする)
[[mgr.prepend_keymap]]
on   = [ "d", "d" ]
run  = "remove"
desc = "ゴミ箱に移動"

# ファイル/ディレクトリのパスをクリップボードにコピー
# (デフォルトはc->c,でファイル、c->dでディレクトリになっており、コマンド別れるのが嫌だったので)
[[mgr.prepend_keymap]]
on   = [ "y", "p" ]
run  = "shell 'printf \"%s\" $0 | pbcopy' --orphan"
desc = "パスをクリップボードにコピー"

~/.config/yazi/yazi.toml に以下を追加:

[manager]
# ディレクトリを先に、ファイルを後に表示
sort_dir_first = true
# 自然順ソート(file1, file2, file10 の順になる)
sort_by = "natural"

2. ディレクトリやファイルを別paneで開けるようにする

zellij(ゼリージュ?読めん。)というのを使って実現しました。同じくRust製で、paneやtabでターミナルを分割・管理できるやつっぽい。

ハマったポイント1: zellij action new-pane --cwd が効かない

最初は以下のように設定していたのですが、、:

[[mgr.prepend_keymap]]
on   = [ "s" ]
run  = "shell 'zellij action new-pane -d right --cwd \"$0\"' --orphan"

しかし、毎回ホームディレクトリで開いてしまうトラブルに遭いました。。

ターミナルで直接試しても同じ:

zellij action new-pane -d down --cwd /Users/my_name/dev
# → ホームディレクトリで開く...

どうやら zellij action new-pane--cwd オプションが効かないことがあるらしい。

zellij run でコマンドを直接実行し、その中で cd してからシェルを起動する方法で解決:

zellij run -c -d down -- zsh -c "cd /Users/my_name/dev && exec zsh"

-c は終了時にpaneを閉じるオプション。

ハマったポイント2: エスケープ

yaziの shell コマンド内で条件分岐しようとするとクォートのエスケープが辛かったので、
シンプルに外部スクリプトに切り出すことで逃げ。

設定

~/.config/yazi/scripts/open-smart.sh を作成:

#!/bin/zsh
# $1 = direction (down/right)
# $2 = path

if [ -d "$2" ]; then
    zellij run -c -d "$1" -- zsh -c "cd '$2' && exec zsh"
else
    zellij run -c -d "$1" -- vim "$2"
fi

作成後に実行権限を付与:

chmod +x ~/.config/yazi/scripts/open-smart.sh

~/.config/yazi/keymap.toml に以下を追加:

[[mgr.prepend_keymap]]
on   = [ "s" ]
run  = '''shell '~/.config/yazi/scripts/open-smart.sh right $0' --orphan'''
desc = "Zellij: 右スプリット"

[[mgr.prepend_keymap]]
on   = [ "<Enter>" ]
run  = '''shell '~/.config/yazi/scripts/open-smart.sh down $0' --orphan'''
desc = "Dirなら下分割、Fileならvim"

3. プラグイン追加を試す(gitステータス表示)

ファイル一覧にgitステータスを表示するプラグインを導入。

※ 変更があるファイルにだけマークが表示される。クリーンな状態では何も表示されないぽい。

インストール

ya pkg add yazi-rs/plugins:git

yaziプラグイン管理コマンドまとめ

https://yazi-rs.github.io/docs/cli

コマンド 説明
ya pkg add owner/repo プラグインをインストール
ya pkg add owner/repo:name monorepoからサブディレクトリをインストール
ya pkg delete owner/repo プラグインを削除
ya pkg list インストール済み一覧
ya pkg install package.tomlからインストール
ya pkg upgrade 全プラグインをアップデート

設定

~/.config/yazi/yazi.toml に以下を追加:

# gitプラグイン用
[[plugin.prepend_fetchers]]
id   = "git"
name = "*"
run  = "git"

[[plugin.prepend_fetchers]]
id   = "git"
name = "*/"
run  = "git"

~/.config/yazi/init.lua を作成:

-- gitプラグインを有効化
require("git"):setup()

最終的なディレクトリ構成

~/.config/yazi/
├── init.lua
├── keymap.toml
├── package.toml
├── scripts/
│   └── open-smart.sh
└── yazi.toml

感想

yaziはRust製で速いし、設定もLuaとTOMLでわかりやすい。ただzellijとの連携は少しハマった。

外部スクリプトに切り出すアプローチは汎用的に使えるので覚えておくと良さそう。

FLINTERS BLOG
FLINTERS BLOG

Discussion