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プラグイン管理コマンドまとめ
| コマンド | 説明 |
|---|---|
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との連携は少しハマった。
外部スクリプトに切り出すアプローチは汎用的に使えるので覚えておくと良さそう。
Discussion