[[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,
}),
})
```