fix(select)(builtin): display the prompt
This commit is contained in:
parent
6487acdf93
commit
fe8f0ffe2f
|
@ -45,7 +45,7 @@ On versions prior to 0.6, this plugin will act as a polyfill for `vim.ui`
|
||||||
|
|
||||||
`vim.select` (built-in)
|
`vim.select` (built-in)
|
||||||
|
|
||||||
![Screenshot from 2021-12-02 19-50-50](https://user-images.githubusercontent.com/506791/144542327-c7420501-c75d-40de-9fc8-70204ed16589.png)
|
![Screenshot from 2021-12-04 17-14-32](https://user-images.githubusercontent.com/506791/144729527-ede0d7ba-a6e6-41e0-be5a-1a5f16d35b05.png)
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
dressing.nvim supports all the usual plugin managers
|
dressing.nvim supports all the usual plugin managers
|
||||||
|
|
|
@ -27,13 +27,14 @@ M.select = function(config, items, opts, on_choice)
|
||||||
end
|
end
|
||||||
vim.api.nvim_buf_set_lines(bufnr, 0, -1, true, lines)
|
vim.api.nvim_buf_set_lines(bufnr, 0, -1, true, lines)
|
||||||
vim.api.nvim_buf_set_option(bufnr, "modifiable", false)
|
vim.api.nvim_buf_set_option(bufnr, "modifiable", false)
|
||||||
|
local width = util.calculate_width(max_width, config)
|
||||||
local winopt = {
|
local winopt = {
|
||||||
relative = config.relative,
|
relative = config.relative,
|
||||||
anchor = config.anchor,
|
anchor = config.anchor,
|
||||||
row = config.row,
|
row = config.row,
|
||||||
col = config.col,
|
col = config.col,
|
||||||
border = config.border,
|
border = config.border,
|
||||||
width = util.calculate_width(max_width, config),
|
width = width,
|
||||||
height = util.calculate_height(#lines, config),
|
height = util.calculate_height(#lines, config),
|
||||||
zindex = 150,
|
zindex = 150,
|
||||||
style = "minimal",
|
style = "minimal",
|
||||||
|
@ -43,6 +44,29 @@ M.select = function(config, items, opts, on_choice)
|
||||||
vim.api.nvim_win_set_option(winnr, "cursorline", true)
|
vim.api.nvim_win_set_option(winnr, "cursorline", true)
|
||||||
pcall(vim.api.nvim_win_set_option, winnr, "cursorlineopt", "both")
|
pcall(vim.api.nvim_win_set_option, winnr, "cursorlineopt", "both")
|
||||||
|
|
||||||
|
-- Create the title window once the main window is placed.
|
||||||
|
-- Have to defer here or the title will be in the wrong location
|
||||||
|
vim.defer_fn(function()
|
||||||
|
local titlebuf = vim.api.nvim_create_buf(false, true)
|
||||||
|
vim.api.nvim_buf_set_lines(titlebuf, 0, -1, true, { " " .. opts.prompt })
|
||||||
|
vim.api.nvim_buf_set_option(titlebuf, "bufhidden", "wipe")
|
||||||
|
local prompt_width = math.min(width, 2 + vim.api.nvim_strwidth(opts.prompt))
|
||||||
|
local titlewin = vim.api.nvim_open_win(titlebuf, false, {
|
||||||
|
relative = "win",
|
||||||
|
win = winnr,
|
||||||
|
width = prompt_width,
|
||||||
|
height = 1,
|
||||||
|
row = -1,
|
||||||
|
col = (width - prompt_width) / 2,
|
||||||
|
focusable = false,
|
||||||
|
zindex = 151,
|
||||||
|
style = "minimal",
|
||||||
|
noautocmd = true,
|
||||||
|
})
|
||||||
|
vim.api.nvim_buf_set_var(bufnr, "dressing_title_window", titlewin)
|
||||||
|
vim.api.nvim_win_set_option(titlewin, "winblend", config.winblend)
|
||||||
|
end, 5)
|
||||||
|
|
||||||
local function map(lhs, rhs)
|
local function map(lhs, rhs)
|
||||||
vim.api.nvim_buf_set_keymap(bufnr, "n", lhs, rhs, { silent = true, noremap = true })
|
vim.api.nvim_buf_set_keymap(bufnr, "n", lhs, rhs, { silent = true, noremap = true })
|
||||||
end
|
end
|
||||||
|
@ -51,24 +75,32 @@ M.select = function(config, items, opts, on_choice)
|
||||||
map("<C-c>", [[<cmd>lua require('dressing.select.builtin').cancel()<CR>]])
|
map("<C-c>", [[<cmd>lua require('dressing.select.builtin').cancel()<CR>]])
|
||||||
map("<Esc>", [[<cmd>lua require('dressing.select.builtin').cancel()<CR>]])
|
map("<Esc>", [[<cmd>lua require('dressing.select.builtin').cancel()<CR>]])
|
||||||
vim.cmd([[
|
vim.cmd([[
|
||||||
autocmd BufLeave <buffer> ++nested ++once lua require('dressing.select.builtin').cancel()
|
autocmd BufLeave <buffer> ++nested ++once lua require('dressing.select.builtin').cancel()
|
||||||
]])
|
]])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function close_window()
|
||||||
|
local callback = _callback
|
||||||
|
local items = _items
|
||||||
|
clear_callback()
|
||||||
|
local ok, titlewin = pcall(vim.api.nvim_buf_get_var, 0, "dressing_title_window")
|
||||||
|
if ok and vim.api.nvim_win_is_valid(titlewin) then
|
||||||
|
vim.api.nvim_win_close(titlewin, true)
|
||||||
|
end
|
||||||
|
vim.api.nvim_win_close(0, true)
|
||||||
|
return callback, items
|
||||||
|
end
|
||||||
|
|
||||||
M.choose = function()
|
M.choose = function()
|
||||||
local cursor = vim.api.nvim_win_get_cursor(0)
|
local cursor = vim.api.nvim_win_get_cursor(0)
|
||||||
local idx = cursor[1]
|
local idx = cursor[1]
|
||||||
local item = _items[idx]
|
local callback, items = close_window()
|
||||||
local callback = _callback
|
local item = items[idx]
|
||||||
clear_callback()
|
|
||||||
vim.api.nvim_win_close(0, true)
|
|
||||||
callback(item, idx)
|
callback(item, idx)
|
||||||
end
|
end
|
||||||
|
|
||||||
M.cancel = function()
|
M.cancel = function()
|
||||||
local callback = _callback
|
local callback = close_window()
|
||||||
clear_callback()
|
|
||||||
vim.api.nvim_win_close(0, true)
|
|
||||||
callback(nil, nil)
|
callback(nil, nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue