[[Neovimプラグイン]]の中で選択肢から候補を絞り込んで選択させるとき、[[telescope.nvim]]の仕組みを使うと楽に実装でき、ユーザビリティも上がる。 以下が参考になる。 <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"> telescope.nvim/developers.md at master · nvim-telescope/telescope.nvim </div> <div class="link-card-v2-content"> Find, Filter, Preview, Pick. All lua, all the time. - nvim-telescope/telescope.nvim </div> <img class="link-card-v2-image" src="https://opengraph.githubassets.com/99485bbbeedd85bc866da6d32e29b67e45c2c812e56d8aea50bb26f3c565348c/nvim-telescope/telescope.nvim" /> <a href="https://github.com/nvim-telescope/telescope.nvim/blob/master/developers.md"></a> </div> [[🦉ghostwriter.nvim]]で実装したコードは以下。 ```lua require("telescope.pickers") .new({}, { prompt_title = "Choose channel name", finder = require("telescope.finders").new_table({ --- 候補となるリスト(table) results = config.options.channel, --- エントリの定義を細かく指定できる --- @param entry {name:string, id:string} entry_maker = function(entry) return { value = entry, -- selection.valueとして選択後に使う display = entry.name, -- 表示文字列 ordinal = entry.name, -- ソートに使う } end, }), sorter = require("telescope.config").values.generic_sorter({}), attach_mappings = function(prompt_bufnr) local actions = require("telescope.actions") actions.select_default:replace(function() actions.close(prompt_bufnr) --- 選択した候補を取得 --- @type {value: {name:string, id:string}} local selection = require("telescope.actions.state").get_selected_entry() --- バッファに挿入 vim.api.nvim_put({ selection.value.id }, "", false, true) end) return true end, }) :find() ``` ## Previewers プレビュー表示をカスタマイズしたい場合。`previewer` を指定する。`finder` 以外はほぼ無関係なので除外したコード。 ```lua require("telescope.pickers") .new({}, { finder = require("telescope.finders").new_table({ results = res.messages, --- @param entry {text:string, ts:string} entry_maker = function(entry) return { value = entry, display = os.date("%Y-%m-%d %X", tonumber(entry.ts)) .. ": " .. entry.text, ordinal = entry.text, } end, }), previewer = require("telescope.previewers").new_buffer_previewer({ define_preview = function(self, entry, status) local lines = vim.split(entry.value.text, "\n") vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, lines) -- wrapをtrueにしないと改行して表示してくれない vim.wo[self.state.winid].wrap = true end, }), }) ```