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/zk/pickers/minipick.lua

76 lines
2.1 KiB
Lua

local M = {}
local H = {}
local minipick = require("mini.pick")
M.note_picker_list_api_selection = { "title", "path", "absPath" }
M.show_note_picker = function(notes, opts, cb)
notes = vim.tbl_map(function(note)
local title = note.title or note.path
return { text = title, path = note.absPath, value = note }
end, notes)
H.item_picker(notes, opts, cb)
end
M.show_tag_picker = function(tags, opts, cb)
local width = H.max_note_count(tags)
tags = vim.tbl_map(function(tag)
local padded_count = H.pad(tag.note_count, width)
return {
text = string.format(" %s │ %s", padded_count, tag.name),
value = tag,
}
end, tags)
H.item_picker(tags, opts, cb)
end
H.item_picker = function(items, opts, cb)
opts = opts or {}
local minipick_opts = vim.tbl_deep_extend("force", {
window = {
prompt_prefix = opts.title .. "> ",
},
source = {
items = items,
name = opts.title,
choose = function(selected_item) -- item guaranteed to be non-nil
local target_window = minipick.get_picker_state().windows.target
vim.api.nvim_win_call(target_window, function()
cb(opts.multi_select and { selected_item.value } or selected_item.value)
end)
return nil
end,
choose_marked = function(selected_items) -- could be empty table
if opts.multi_select and not vim.tbl_isempty(selected_items) then
local target_window = minipick.get_picker_state().windows.target
vim.api.nvim_win_call(target_window, function()
cb(vim.tbl_map(function(item)
return item.value
end, selected_items))
end)
end
return nil
end,
},
}, opts.minipick or {})
minipick.start(minipick_opts)
end
H.max_note_count = function(tags)
local max_count = 0
for _, t in ipairs(tags) do
max_count = math.max(max_count, t.note_count)
end
return vim.fn.strchars(tostring(max_count))
end
H.pad = function(text, width)
local text_width = vim.fn.strchars(text)
return string.rep(" ", width - text_width) .. text
end
return M