diff options
author | Mathias Fußenegger <mfussenegger@users.noreply.github.com> | 2021-09-27 21:57:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-27 21:57:28 +0200 |
commit | 63fde086d9e7936b21c51e145253ec69820b2112 (patch) | |
tree | fe42e09315181b66e32b5787508f6bd81e719c67 /runtime/lua/vim/ui.lua | |
parent | 6736ee8be5ae9a3b004bd9033d7efffad74a03be (diff) | |
download | rneovim-63fde086d9e7936b21c51e145253ec69820b2112.tar.gz rneovim-63fde086d9e7936b21c51e145253ec69820b2112.tar.bz2 rneovim-63fde086d9e7936b21c51e145253ec69820b2112.zip |
feat(ui): add vim.ui.select and use in code actions (#15771)
Continuation of https://github.com/neovim/neovim/pull/15202
A plugin like telescope could override it with a fancy implementation
and then users would get the telescope-ui within each plugin that
utilizes the vim.ui.select function.
There are some plugins which override the `textDocument/codeAction`
handler solely to provide a different UI. With custom client commands and
soon codeAction resolve support, it becomes more difficult to implement
the handler right - so having a dedicated way to override the picking
function will be useful.
Diffstat (limited to 'runtime/lua/vim/ui.lua')
-rw-r--r-- | runtime/lua/vim/ui.lua | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/runtime/lua/vim/ui.lua b/runtime/lua/vim/ui.lua new file mode 100644 index 0000000000..aebb63d56f --- /dev/null +++ b/runtime/lua/vim/ui.lua @@ -0,0 +1,36 @@ +local M = {} + +--- Prompts the user to pick a single item from a collection of entries +--- +---@param items table Arbitrary items +---@param opts table Additional options +--- - prompt (string|nil) +--- Text of the prompt. Defaults to `Select one of:` +--- - format_item (function item -> text) +--- Function to format an +--- individual item from `items`. Defaults to `tostring`. +---@param on_choice function ((item|nil, idx|nil) -> ()) +--- Called once the user made a choice. +--- `idx` is the 1-based index of `item` within `item`. +--- `nil` if the user aborted the dialog. +function M.select(items, opts, on_choice) + vim.validate { + items = { items, 'table', false }, + on_choice = { on_choice, 'function', false }, + } + opts = opts or {} + local choices = {opts.prompt or 'Select one of:'} + local format_entry = opts.format_entry or tostring + for i, item in pairs(items) do + table.insert(choices, string.format('%d: %s', i, format_entry(item))) + end + local choice = vim.fn.inputlist(choices) + if choice < 1 or choice > #items then + on_choice(nil, nil) + else + on_choice(items[choice], choice) + end +end + + +return M |