Snacks.nvimのpickerでソートして開く方法――SpecDDファイルがすぐ開ける

仕様書駆動開発(Spec Driven Development)中、「さっき作った仕様書ファイルを開きたい」というケースがよくあります。これに対応するキーマップを設定したので解説します。

筆者はFuzzy Finderプラグインとしてsnacks.nvimのpickerを使っているため、pickerでの設定例です。

※snacks.nvimのpickerの紹介・解説は別の記事爆速Fuzzy FinderプラグインSnacks.pickerの使い方をご覧ください。

## やりたいこと

普段は「Git管理下のファイル一覧」をpickerで開いています。これとは別に、「AI用に作ったディレクトリの配下のファイルを最新順で開くpickerのキーマップ」を設定します。

### 筆者のAI用ディレクトリ構成

参考までに、筆者のAI用ディレクトリ.myworkの構成も書いておきます。

AI用ディレクトリの中身
.mywork
|-- changes # 作業中のやつ
| `-- 2025-01-30-xxxx-xxxxxxxx-checker
| |-- design.md
| |-- requirements.md
| `-- tasks.md
|-- specs # 作成済み
| `-- 2026-01-28-rfc9457-error-response
| |-- design.md
| |-- requirements.md
| `-- tasks.md
|-- tmp # 一時的なやつ
| `-- redmine.md
`-- work-logs # 調査記録とか
|-- 2025-10-14-deploy-502-error-investigation.md
`-- 2026-01-21-xxxxxxxxxxxxxxxxxxxxx-bug.md

.myworkディレクトリは全ワークツリー共通にしてます。
SpecDDで今開発中のやつはchangesに置いてます。こうすると 並行している作業数が分かりやすい ですし、ファイル数が限られるので ファイルも探しやすい です。

## 設定

transformして更新日をアイテムに突っ込み、sortに指定してます。

picker.pick({
source = "files",
args = { ".", ".mywork" },
transform = function(item)
item.mtime = vim.fn.getftime(item.file)
end,
sort = { fields = { "mtime:desc", "file" } },
matcher = { sort_empty = true },
})

ソートされた状態でピッカーが開いてほしかったので、sort_empty = trueも指定しました。

### lazy.nvimでの設定

lazy.nvimではkeysに書いてキーマップを設定しつつ、遅延読み込み指定してます。

keys = {
-- ...他のキーマップ
{
"<space>fs",
function()
picker.pick({
source = "files",
args = { ".", ".mywork" },
transform = function(item)
item.mtime = vim.fn.getftime(item.file)
end,
sort = { fields = { "mtime:desc", "file" } },
matcher = { sort_empty = true },
})
end,
desc = "Picker files: .mywork(更新順)",
},
},

以上、仕様書駆動開発でよく使っているキーマップの紹介でした。