[[telescope.nvim]]から[[snacks.picker]]に[[ファジーファインダー|fuzzy finder]]を変更する。あわせて、[[telescope.nvim]]だと機能していたが動かなかったものも修正した。
## 参考
[[obsidian.nvim]]のコミュニティforkを参考にする。具体的には以下のPR。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
implementing snack picker by guspix · Pull Request #4 · obsidian-nvim/obsidian.nvim
</div>
<div class="link-card-v2-content">
implementing snack pickeradded documentationrefactor(pickers): improve snacks picker implementation and callback ...
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/9617c9d613651feeb9e5d92cd642e851db06b5696fd16e0dbeabac62720e48d3/obsidian-nvim/obsidian.nvim/pull/4" />
<a href="https://github.com/obsidian-nvim/obsidian.nvim/pull/4"></a>
</div>
## 対応
基本は先のPR内容を取り込むだけ。ただしドキュメントは更新していない。それ以外にもいくつか微修正を加えている。
### プレビューをオンにする
backlink検索時にプレビューがオフになっていたので、`preview = false` を `true` に変更した。ただし、 `true` にしただけではプレビュー対象がカレントファイルになってしまう。以下のような変更が必要。
```lua
layout = {
-- [変更] false -> true
preview = true,
},
format = "text",
-- [追加]
preview = function(ctx)
ctx.preview:set_lines(vim.fn.readfile(ctx.item.filename))
ctx.preview:loc()
ctx.preview:highlight { ft = "markdown" }
end,
```
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
feat: Add preview functionality to SnacksPicker for backlink search · tadashi-aikawa/obsidian.nvim@5514f62
</div>
<div class="link-card-v2-content">
Obsidian 🤝 Neovim. Contribute to tadashi-aikawa/obsidian.nvim development by creating an account on GitHub.
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/7f76c6613109b6ba81e319c05443a3ad3afa1c6efd97cc5915f0c6a82cac12b6/tadashi-aikawa/obsidian.nvim/commit/5514f62f26ff0beeb910c1483c07436e326959d7" />
<a href="https://github.com/tadashi-aikawa/obsidian.nvim/commit/5514f62f26ff0beeb910c1483c07436e326959d7"></a>
</div>
### 新規ノートの作成ができない
`picker.lua` のL313は表示されるが、L316が[[snacks.picker]]だと表示されない。つまり、登録はされようとしているが、実行がされていないということだ。
```lua
--- Get query mappings to use for `find_notes()` or `grep_notes()`.
---@return obsidian.PickerMappingTable
Picker._note_query_mappings = function(self)
---@type obsidian.PickerMappingTable
local mappings = {}
if self.client.opts.picker.note_mappings and key_is_set(self.client.opts.picker.note_mappings.new) then
print("🪵 L313 self.client.opts.picker.note_mappings.new " .. self.client.opts.picker.note_mappings.new)
mappings[self.client.opts.picker.note_mappings.new] = {
desc = "new",
callback = function(query)
print("🪵 L316 query " .. query)
self.client:command("ObsidianNew", { args = query })
end,
}
end
return mappings
end
```
`find_notes` では `query_mappings` と `selection_mappings` は問題なさそう。今回は `query_mappings` に該当のキーバインド `<F11>` が登録されている。
```lua
--- Find notes by filename.
---
---@param opts { prompt_title: string|?, callback: fun(path: string)|?, no_default_mappings: boolean|? }|? Options.
---
--- Options:
--- `prompt_title`: Title for the prompt window.
--- `callback`: Callback to run with the selected note path.
--- `no_default_mappings`: Don't apply picker's default mappings.
Picker.find_notes = function(self, opts)
self.calling_bufnr = vim.api.nvim_get_current_buf()
opts = opts or {}
local query_mappings
local selection_mappings
if not opts.no_default_mappings then
query_mappings = self:_note_query_mappings()
selection_mappings = self:_note_selection_mappings()
end
print("🦉 " .. "query_mappings")
print_table(query_mappings)
print("🦉 " .. "selection_mappings")
print_table(selection_mappings)
return self:find_files {
prompt_title = opts.prompt_title or "Notes",
dir = self.client.dir,
callback = opts.callback,
no_default_mappings = opts.no_default_mappings,
query_mappings = query_mappings,
selection_mappings = selection_mappings,
}
end
```
```
🦉 query_mappings
<F11>:
callback: function: 0x7f7b8d90f598
desc: new
🦉 selection_mappings
<M-CR>:
callback: function: 0x7f7b8d90f708
desc: insert link
```
`_telescope.lua` の `find_files` 実装では `opts.query_mappings` が渡されている。
```lua
---@param opts obsidian.PickerFindOpts|? Options.
TelescopePicker.find_files = function(self, opts)
opts = opts or {}
local prompt_title = self:_build_prompt {
prompt_title = opts.prompt_title,
-- ここと
query_mappings = opts.query_mappings,
selection_mappings = opts.selection_mappings,
}
telescope.find_files {
prompt_title = prompt_title,
cwd = opts.dir and tostring(opts.dir) or tostring(self.client.dir),
find_command = self:_build_find_cmd(),
attach_mappings = function(_, map)
attach_picker_mappings(map, {
entry_key = "path",
callback = opts.callback,
-- ここと
query_mappings = opts.query_mappings,
selection_mappings = opts.selection_mappings,
})
return true
end,
}
end
```
`_snacks.lua` の `find_files` では `opts.selection_mappings` しか使われていない。 **`opts.query_mappings` は使われていない**。
以下のコミットで対応。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
feat: add snacks picker support · tadashi-aikawa/obsidian.nvim@97e6fd5
</div>
<div class="link-card-v2-content">
Add snacks.pick as a new picker option:- Create new file lua/obsidian/pickers/_snacks.lua- Add "snacks" ...
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/67f8bf2aa807b3ad51c70b4b4091e1148cc5932663a49df0d385863df9fd3255/tadashi-aikawa/obsidian.nvim/commit/97e6fd5db4a7cfccc34accd76d31be58b8022ef3" />
<a href="https://github.com/tadashi-aikawa/obsidian.nvim/commit/97e6fd5db4a7cfccc34accd76d31be58b8022ef3"></a>
</div>
## 表示されるノート順を最近開いた順にしたい
> [[📜2025-04-12 obsidian.nvimでsnacks.pickerを使ったときにObsidianQuickSwitchで表示される候補を最近開いたファイル順にする]]