summaryrefslogtreecommitdiff
path: root/lua/telescope/previewers/buffer_previewer.lua
diff options
context:
space:
mode:
authorfdschmidt93 <39233597+fdschmidt93@users.noreply.github.com>2021-09-01 18:17:18 +0200
committerGitHub <noreply@github.com>2021-09-01 18:17:18 +0200
commit5d37c3ea08f40d8c9d3a9ebcc72bd641d366c110 (patch)
treee66df8fe1312c38ad28ff64e0f0218b415bf18af /lua/telescope/previewers/buffer_previewer.lua
parent67bc1dcdd6eea1915b7c397b7c02451bbdc277a0 (diff)
feat: allow caching and resuming picker (#1051)
* expose `cache_picker` in telescope.setup to configure caching, see `:h telescope.defaults.cache_picker` * add builtin.resume and builtin.pickers picker
Diffstat (limited to 'lua/telescope/previewers/buffer_previewer.lua')
-rw-r--r--lua/telescope/previewers/buffer_previewer.lua79
1 files changed, 79 insertions, 0 deletions
diff --git a/lua/telescope/previewers/buffer_previewer.lua b/lua/telescope/previewers/buffer_previewer.lua
index f6c4a78..59630b8 100644
--- a/lua/telescope/previewers/buffer_previewer.lua
+++ b/lua/telescope/previewers/buffer_previewer.lua
@@ -247,6 +247,8 @@ previewers.new_buffer_previewer = function(opts)
buf_delete(bufnr)
end
end
+ -- enable resuming picker with existing previewer to avoid lookup of deleted bufs
+ bufname_table = {}
end
function opts.preview_fn(self, entry, status)
@@ -853,6 +855,83 @@ previewers.highlights = defaulter(function(_)
}
end, {})
+previewers.pickers = defaulter(function(_)
+ local ns_telescope_multiselection = vim.api.nvim_create_namespace "telescope_mulitselection"
+ local get_row = function(picker, preview_height, index)
+ if picker.sorting_strategy == "ascending" then
+ return index - 1
+ else
+ return preview_height - index
+ end
+ end
+ return previewers.new_buffer_previewer {
+
+ dyn_title = function(_, entry)
+ if entry.value.default_text and entry.value.default_text ~= "" then
+ return string.format("%s ─ %s", entry.value.prompt_title, entry.value.default_text)
+ end
+ return entry.value.prompt_title
+ end,
+
+ get_buffer_by_name = function(_, entry)
+ return tostring(entry.value.prompt_bufnr)
+ end,
+
+ teardown = function(self)
+ if self.state and self.state.last_set_bufnr and vim.api.nvim_buf_is_valid(self.state.last_set_bufnr) then
+ vim.api.nvim_buf_clear_namespace(self.state.last_set_bufnr, ns_telescope_multiselection, 0, -1)
+ end
+ end,
+
+ define_preview = function(self, entry, status)
+ putils.with_preview_window(status, nil, function()
+ local ns_telescope_entry = vim.api.nvim_create_namespace "telescope_entry"
+ local preview_height = vim.api.nvim_win_get_height(status.preview_win)
+
+ if self.state.bufname then
+ return
+ end
+
+ local picker = entry.value
+ -- prefill buffer to be able to set lines individually
+ local placeholder = utils.repeated_table(preview_height, "")
+ vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, placeholder)
+
+ for index = 1, math.min(preview_height, picker.manager:num_results()) do
+ local row = get_row(picker, preview_height, index)
+ local e = picker.manager:get_entry(index)
+ local display, display_highlight = e:display()
+
+ vim.api.nvim_buf_set_lines(self.state.bufnr, row, row + 1, false, { display })
+
+ if display_highlight ~= nil then
+ for _, hl_block in ipairs(display_highlight) do
+ vim.api.nvim_buf_add_highlight(
+ self.state.bufnr,
+ ns_telescope_entry,
+ hl_block[2],
+ row,
+ hl_block[1][1],
+ hl_block[1][2]
+ )
+ end
+ end
+ if picker._multi:is_selected(e) then
+ vim.api.nvim_buf_add_highlight(
+ self.state.bufnr,
+ ns_telescope_multiselection,
+ "TelescopeMultiSelection",
+ row,
+ 0,
+ -1
+ )
+ end
+ end
+ end)
+ end,
+ }
+end, {})
+
previewers.display_content = defaulter(function(_)
return previewers.new_buffer_previewer {
define_preview = function(self, entry, status)