TL;DR
tasksのcommandにこれを使え!
"command": "$root = (git -C (Split-Path \"$ZED_FILE\") rev-parse --show-toplevel 2>$null); lazygit -p ($root ?? \"$ZED_WORKTREE_ROOT\")",
経緯
こんにちは。
sledgeというペイントソフトを作っているものです。
zed、触った瞬間その速さに惚れて移行を決意しました。
自分はモロにVSCode+GitGraphから移行なので、こういった記事を読んでLazyGitを導入しました。
設定も上記記事をコピペ。
[
{
"label": "LazyGit",
"command": "lazygit -p $ZED_WORKTREE_ROOT",
"shell": { "program": "pwsh" },
"hide": "on_success",
"reveal_target": "center",
"show_summary": false,
"show_command": false,
"allow_concurrent_runs": true,
"use_new_terminal": true
}
]
[
{
"context": "Workspace",
"bindings": {
"ctrl-shift-g": [
"task::Spawn",
{ "task_name": "LazyGit" }
]
}
}
]
直面した問題
しかしながら、自分のプロジェクトは以下のような構成になっています。
★=gitリポジトリ
★ sledge-pdm :PDMリポジトリ
┣ apps :関連アプリやサイト
┃ ┣ ★ sledge
┃ ┣ ★ sledge-website
┃ ┗ ...
┗ packages :共通パッケージなど
┣ ★ core
┣ ★ ui
┗ ...
sledge-pdmリポジトリの下にまたリポジトリがネストしている形になっています。
アプリ側からパッケージ側のコードを見たり修正したり、またその逆もあるので基本的にはsledge-pdmを開いておくわけですが、
例えばpackages/uiの中のファイルを開いたままLazyGitのショートカット(Ctrl+Shift+G)を押すと、
packages/uiを開いていてほしいところが、sledge-pdmを開いてしまいます。
これは設定で
"command": "lazygit -p $ZED_WORKTREE_ROOT"
と、$ZED_WORKTREE_ROOTを参照して開いているためで、公式Docsではこれは
- `ZED_WORKTREE_ROOT`: absolute path to the root of the current worktree. (e.g. `/Users/my-user/path/to/project`)
ワークツリーのrootを参照する、と書いてあります。sledge-pdmが開かれて当然ですね。
なんとかする
ZED_CURRENT_REPOSITORYみたいな変数があればよかったのですが当然そんなものはなく、Claude Codeにお願いしてみたところ、以下の設定を書いてくれました。
[
{
"label": "LazyGit",
"command": "$root = (git -C (Split-Path \"$ZED_FILE\") rev-parse --show-toplevel 2>$null); lazygit -p ($root ?? \"$ZED_WORKTREE_ROOT\")",
"shell": { "program": "pwsh" },
"hide": "on_success",
"reveal_target": "center",
"show_summary": false,
"show_command": false,
"allow_concurrent_runs": true,
"use_new_terminal": true,
},
]
保存して再度ショートカットでLazyGitを起動すると、開いている直近のリポジトリ(ui)でしっかり起動してくれました。
何が変わったのか
修正の肝はここでした。
$root = (git -C (Split-Path \"$ZED_FILE\") rev-parse --show-toplevel 2>$null); lazygit -p ($root ?? \"$ZED_WORKTREE_ROOT\")
git rev-parse --show-toplevelが入力したファイルが所属するリポジトリのパスを表示してくれるという今回の目的にドンピシャなコマンドだったようで、これをlazygitのパスに渡すことで解決できたみたいです。
おわり
zed+LazyGit思ったよりいいぞ、と思った直後に起きた問題だったので、無事解決できてよかったです。
sledge、よかったら触ってみてね



