[[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 &quot;snacks&quot ... </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で表示される候補を最近開いたファイル順にする]]