diff --git a/runtime/doc/lua.txt b/runtime/doc/lua.txt index e23603abd3..22911a8aa7 100644 --- a/runtime/doc/lua.txt +++ b/runtime/doc/lua.txt @@ -5109,7 +5109,8 @@ vim.ui.input({opts}, {on_confirm}) *vim.ui.input()* work until `on_confirm`. Example: >lua - vim.ui.input({ prompt = 'Enter value for shiftwidth: ' }, function(input) + local opts = { prompt = 'Enter value for shiftwidth: ', scope = 'buffer' } + vim.ui.input(opts, function(input) vim.o.shiftwidth = tonumber(input) end) < @@ -5124,6 +5125,14 @@ vim.ui.input({opts}, {on_confirm}) *vim.ui.input()* • {highlight}? (`function`) Function that will be used for highlighting user inputs. • {prompt}? (`string`) Text of the prompt + • {scope}? + (`'cursor'|'line'|'buffer'|'window'|'tabpage'|'editor'|'project'`) + Input scope, as in "This input is for something at + cursor/line/etc scope". Can be used by `vim.ui.input` + implementations to tweak behavior and presentation. + For example, the input may adjust the floating window + position: near the cursor if `cursor`, in window + corner if `buffer` or `window`, etc. • {on_confirm} (`fun(input?: string)`) Called once the user confirms or abort the input. `input` is what the user typed (it might be an empty string if nothing was entered), or diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt index 758de13f67..5efb602464 100644 --- a/runtime/doc/news.txt +++ b/runtime/doc/news.txt @@ -313,6 +313,7 @@ LUA • Added `__eq` metamethod to |vim.VersionRange|. 2 distinct but representing the same range instances now compare equal. • |vim.pos| can now convert between positions and buffer offsets. +• |vim.ui.input()| now allows setting input scope. OPTIONS diff --git a/runtime/lua/nvim/spellfile.lua b/runtime/lua/nvim/spellfile.lua index 1ae219d8fc..8bf094ec34 100644 --- a/runtime/lua/nvim/spellfile.lua +++ b/runtime/lua/nvim/spellfile.lua @@ -281,7 +281,7 @@ function M.get(lang) info.lang, info.encoding ) - vim.ui.input({ prompt = prompt }, function(input) + vim.ui.input({ prompt = prompt, scope = 'editor' }, function(input) -- properly clear the message window vim.api.nvim_echo({ { ' ' } }, false, { kind = 'empty' }) if not input or input:lower() ~= 'y' then diff --git a/runtime/lua/vim/lsp/buf.lua b/runtime/lua/vim/lsp/buf.lua index 1ff086a7c5..87b2584ee5 100644 --- a/runtime/lua/vim/lsp/buf.lua +++ b/runtime/lua/vim/lsp/buf.lua @@ -815,6 +815,7 @@ function M.rename(new_name, opts) local prompt_opts = { prompt = 'New Name: ', + scope = 'cursor', } if result.placeholder then prompt_opts.default = result.placeholder @@ -845,6 +846,7 @@ function M.rename(new_name, opts) local prompt_opts = { prompt = 'New Name: ', default = cword, + scope = 'cursor', } vim.ui.input(prompt_opts, function(input) if not input or #input == 0 then diff --git a/runtime/lua/vim/ui.lua b/runtime/lua/vim/ui.lua index e4f18b9b3a..94db2ab9b6 100644 --- a/runtime/lua/vim/ui.lua +++ b/runtime/lua/vim/ui.lua @@ -96,6 +96,12 @@ end ---Function that will be used for highlighting ---user inputs. ---@field highlight? function +--- +---Input scope, as in "This input is for something at cursor/line/etc scope". +---Can be used by `vim.ui.input` implementations to tweak behavior and presentation. +---For example, the input may adjust the floating window position: near the cursor if +---`cursor`, in window corner if `buffer` or `window`, etc. +---@field scope? 'cursor'|'line'|'buffer'|'window'|'tabpage'|'editor'|'project' --- Prompts the user for input, allowing arbitrary (potentially asynchronous) work until --- `on_confirm`. @@ -103,7 +109,8 @@ end --- Example: --- --- ```lua ---- vim.ui.input({ prompt = 'Enter value for shiftwidth: ' }, function(input) +--- local opts = { prompt = 'Enter value for shiftwidth: ', scope = 'buffer' } +--- vim.ui.input(opts, function(input) --- vim.o.shiftwidth = tonumber(input) --- end) --- ```