-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinit.lua
More file actions
89 lines (68 loc) · 2.46 KB
/
Copy pathinit.lua
File metadata and controls
89 lines (68 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
local M = {}
---@param opts? vim.ui.input.Opts
---@param on_confirm fun(input?: string)
local function input(opts, on_confirm)
opts = opts or {}
local config = require "input.config"
local utils = require "input.utils"
local win_config = config.win_config
local prompt = opts.prompt or config.default_prompt
local default = opts.default or ""
local prompt_lines = vim.split(prompt, "\n", { plain = true, trimempty = true })
local width = utils.calculate_width(win_config.relative, win_config.width, config.width_options)
width = math.max(width, utils.get_max_strwidth(prompt_lines) + 4, vim.api.nvim_strwidth(default) + 2)
win_config.title = utils.trim_and_pad_title(prompt)
win_config.width = utils.calculate_width(win_config.relative, width, config.width_options)
-- Create buffer.
local bufnr = vim.api.nvim_create_buf(false, true)
-- Set buffer options.
for option, value in pairs(config.buf_options) do
vim.bo[bufnr][option] = value
end
-- Create floating window.
local winid = vim.api.nvim_open_win(bufnr, true, win_config)
-- Set window options.
for option, value in pairs(config.win_options) do
vim.wo[winid][option] = value
end
local function close()
vim.cmd.stopinsert()
vim.api.nvim_win_close(winid, true)
end
local function confirm(content)
on_confirm(content)
close()
end
local function cancel()
confirm(nil)
end
vim.fn.prompt_setprompt(bufnr, "")
vim.fn.prompt_setcallback(bufnr, confirm)
vim.fn.prompt_setinterrupt(bufnr, cancel)
vim.api.nvim_win_call(winid, function()
vim.api.nvim_put({ default }, "", true, false)
vim.cmd.startinsert()
end)
vim.api.nvim_win_set_cursor(winid, { 1, #default })
vim.keymap.set("n", "<esc>", cancel, { buffer = bufnr })
vim.keymap.set("n", "q", cancel, { buffer = bufnr })
vim.keymap.set("n", "<cr>", function()
local content = vim.fn.prompt_getinput(bufnr)
confirm(content)
end, { buffer = bufnr })
local augroup = vim.api.nvim_create_augroup("input", { clear = true })
vim.api.nvim_create_autocmd("BufLeave", {
group = augroup,
desc = "Cancel vim.ui.input",
buffer = bufnr,
nested = true,
once = true,
callback = cancel,
})
end
function M.setup(opts)
local config = require "input.config"
config.extend(opts)
vim.ui.input = input
end
return M