mirror of https://github.com/mickael-menu/zk-nvim
feat: add support for `mini.pick` as a picker (#163)
* Add support for `mini.pick` as a picker * Remove old comments * fix: note title in mini.pick * Refactor and add support for multi-select --------- Co-authored-by: Karim Abou Zeid <7303830+kabouzeid@users.noreply.github.com>pull/166/head
parent
fb0962b75a
commit
e2b6d62b18
@ -0,0 +1,75 @@
|
||||
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
|
Loading…
Reference in New Issue