fix(vim.ui.input): return empty string when inputs nothing (#20883)

fix(vim.ui.input): return empty string when inputs nothing

The previous behavior of `vim.ui.input()` when typing <CR> with
no text input (with an intention of having the empty string as input)
was to execute `on_confirm(nil)`, conflicting with its documentation.

Inputting an empty string should now correctly execute `on_confirm('')`.
This should be clearly distinguished from cancelling or aborting the
input UI, in which case `on_confirm(nil)` is executed as before.
This commit is contained in:
Jongwook Choi
2022-11-07 19:15:15 -05:00
committed by GitHub
parent 8147d3df28
commit 59ff4691f6
3 changed files with 59 additions and 5 deletions

View File

@@ -73,7 +73,8 @@ end
--- user inputs.
---@param on_confirm function ((input|nil) -> ())
--- Called once the user confirms or abort the input.
--- `input` is what the user typed.
--- `input` is what the user typed (it might be
--- an empty string if nothing was entered), or
--- `nil` if the user aborted the dialog.
---
--- Example:
@@ -88,11 +89,17 @@ function M.input(opts, on_confirm)
})
opts = (opts and not vim.tbl_isempty(opts)) and opts or vim.empty_dict()
-- Note that vim.fn.input({}) returns an empty string when cancelled.
-- vim.ui.input() should distinguish aborting from entering an empty string.
local _canceled = vim.NIL
opts = vim.tbl_extend('keep', opts, { cancelreturn = _canceled })
local input = vim.fn.input(opts)
if #input > 0 then
on_confirm(input)
else
if input == _canceled then
on_confirm(nil)
else
on_confirm(input)
end
end