You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
zk-nvim/lua/telescope/zk/util.lua

109 lines
2.8 KiB
Lua

local pickers = require("telescope.pickers")
local finders = require("telescope.finders")
local conf = require("telescope.config").values
local actions = require("telescope.actions")
local action_state = require("telescope.actions.state")
local action_utils = require("telescope.actions.utils")
local putils = require("telescope.previewers.utils")
local entry_display = require("telescope.pickers.entry_display")
local previewers = require("telescope.previewers")
local M = {}
function M.wrap_note_options(opts)
return vim.tbl_deep_extend(
"force",
{ select = { "title", "absPath", "rawContent" }, sort = { "created" } },
opts or {}
)
end
function M.wrap_tag_options(opts)
return vim.tbl_deep_extend("force", { sort = { "note-count" } }, opts or {})
end
function M.create_note_entry_maker(_)
return function(note)
return {
value = note,
path = note.absPath,
display = note.title,
ordinal = note.title,
}
end
end
function M.create_tag_entry_maker(opts)
return function(tag)
local displayer = entry_display.create({
separator = " ",
items = {
{ width = opts.note_count_width or 4 },
{ remaining = true },
},
})
local make_display = function(e)
return displayer({
{ e.value.note_count, "TelescopeResultsNumber" },
e.value.name,
})
end
return {
value = tag,
display = make_display,
ordinal = tag.name,
}
end
end
function M.make_note_previewer()
return previewers.new_buffer_previewer({
define_preview = function(self, entry)
vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, vim.split(entry.value.rawContent, "\n"))
putils.highlighter(self.state.bufnr, "markdown")
end,
})
end
function M.show_note_picker(opts, notes)
opts = opts or {}
pickers.new(opts, {
finder = finders.new_table({
results = notes,
entry_maker = M.create_note_entry_maker(opts),
}),
sorter = conf.file_sorter(opts),
previewer = M.make_note_previewer(),
}):find()
end
function M.show_tag_picker(opts, tags, cb)
opts = opts or {}
pickers.new(opts, {
finder = finders.new_table({
results = tags,
entry_maker = M.create_tag_entry_maker(opts),
}),
sorter = conf.generic_sorter(opts),
attach_mappings = function(prompt_bufnr, _)
actions.select_default:replace(function()
local selection = {}
action_utils.map_selections(prompt_bufnr, function(entry, _)
table.insert(selection, entry.value.name)
end)
if vim.tbl_isempty(selection) then
selection = { action_state.get_selected_entry().value.name }
end
actions.close(prompt_bufnr)
cb(selection)
end)
return true
end,
}):find()
end
return M