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