-
-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(ui): add vim.ui.input and use in lsp rename #15959
Conversation
565c57a
to
6785ce3
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, but would like a few other people to take a look please
Test failing related to To run the test locally:
More info: |
@muniter I thiiiink I fixed it now |
I'm in favor of separating overriding the logic (handlers) and the UX (vim.ui.X) as a general paradigm, but tagging Justin as he has some good commentary on vim.ui.select, and this is an API level decision. |
This is the only motivation for this that I can see. Because otherwise, the PR adds more code but gains nothing. Is the idea that on_confirm would potentially be asynchronous? We should not rush to add I cannot emphasize this enough: If you add an API, explain the following
|
vim.lsp._stubs.input_text = text | ||
vim.fn.input = function(opts, on_confirm) | ||
vim.lsp._stubs.input_prompt = opts.prompt | ||
vim.lsp._stubs.input_text = opts.default |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
so vim.fn.input
can already be overridden.
Then what is the point of vim.ui.input
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is vim.fn.{func}
being overridable a documented behavior? The documentation of vim.fn
says:
vim.fn.{func}({...}) *vim.fn*
Invokes |vim-function| or |user-function| {func} with arguments {...}.
if vim.fn.{func}
is overridden, it no longer invokes the Vim function, which goes against the documentation.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But that is not fundamentally different than vim.ui.*
. It's all just Lua functions.
If our story for having pluggable/extensible UI widgets is to override Lua functions... then we don't need vim.ui.*
just for that.
If vim.ui.*
is to exist it needs to solve real problems. Not tiny or vague problems.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the idea that on_confirm would potentially be asynchronous?
No I don't think so. I used it in lsp rename, and I don't know how an async request for that would potentially be. I would maybe have the same concerns as there is for formatting asynchronous on save. What if the user manage to save before the response from renaming comes back? I am no expert here, so this is just my initial concern.
- What precedents did you draw from? How does your solution compare to them?
So I based my solution to this on @mfussenegger and vim.ui.select
. I think this fits with the style of vim.ui.select
of being a wrapper around both ui-functions.
- Does your new API allow future expansion? How? Or why not?
I don't really know what should be further expanded with vim.ui.input
? To me, it looks like it supports everything input
supports, while also being easily overridable.
- Is the new API similar to existing APIs? Do we need to deprecate the old ones?
- Did you cross-reference related concepts in your API docs?
Not to my knowledge. It is more of a wrapper around input()
, but with the expansion on taking a callback. I also searched the API docs and couldn't find anything similar.
so
vim.fn.input
can already be overridden.Then what is the point of
vim.ui.input
?
So the point of vim.ui.input
is that it's not possible to override input to create a popup and return the input from the user from that popup (at least I don't know how this would work, so I could maybe be wrong). So therefore, vim.ui.input
takes a callback which can be called when the user has confirmed the input in the popup.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@justinmk in my opinion what vim.ui.*
does instead of vim.fn.*
is it signals plugins authors to use use that common interface instead of baking their own . For example vim.fn.*
is recognised as an interface to vimL function . vimL input()
prompts user for input . If I'm writting a plugin I don't expect vim.fn.input
to be different then input function in vimL at all even if it's overridable from lua . So if I just want to avoid viml ( many currently do though I'm not yet sure why :P) or just want to provide a facier input then what inpit function does I'm going to implement a ui myself instead of using vim.fn.input . That means any override vim.fn.input won't be applicable to that plugin . With vim.ui.input
exsisting however I'll stick to vim.ui.input and let users decide what kind of ui they want . This allows separate plugins to rise that customize the ui over vim.ui like how nvim-notify provides ui over vim.notify
So basically having official vim.ui.*
functions unifies the ui by encouraging plugins not to create ui elements themselves.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@justinmk in my opinion what
vim.ui.*
does instead ofvim.fn.*
is it signals plugins authors to use use that common interface instead of baking their own
That can be done in 1 line:
vim.ui.input = vim.fn.input
but this PR adds 100 lines of code, yet amounts to mostly just an alias.
Is the idea that on_confirm would potentially be asynchronous?
No I don't think so. I used it in lsp rename, and I don't know how an async request for that would potentially be.
Then why is the interface a callback instead of just returning a value?
- What precedents did you draw from? How does your solution compare to them?
So I based my solution to this on @mfussenegger and
vim.ui.select
. I think this fits with the style ofvim.ui.select
of being a wrapper around both ui-functions.
That's not a precedent, that is just a function in the same module. Precedents are from other platforms (vscode, .NET, HTML, whatever), as well as old/legacy Vim concepts.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Then why is the interface a callback instead of just returning a value?
It's not returning a value because I won't be able to override it how I would like then.
I would like to be able to override to create a popup like this for input.
Then I would create a buffer mapping on <CR>
to execute the callback function with the text inputted in the popup. If vim.ui.input
returns a value, I don't know if it would be possible to capture the text from the popup and return that.
---@param on_confirm function ((input) -> ()) | ||
--- Called once the user enters the input. | ||
--- `input` is what the user typed. | ||
function M.input(opts, on_confirm) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will there be a way of doing something as input value changes? e.g. highlight some text on a buffer as input value changes, or filter a list based on the input value as it changes and display it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think I quite understand. Could you provide an example of what you want to do?
Btw, I see that I wrote Called once the user enters the input
, and see now that it can be misleading. Will change this to Called once the user confirms the input
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you provide an example of what you want to do?
Take this for an example, say you want to build this UI using vim.ui.input
Here whenever the input value changes, the UI is updated. on_confirm
won't help here. You'll need on_change
or something.
So my question was, do you think this is something that vim.ui.input
should support?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this isn't possible when using the vim.fn.input()
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah as @zeertzjq is saying, this is not possible with vim.fn.input
. I would be open to hear others opinion, but I don't know if I think this is something vim.ui.input
should do. Personally I am leaning towards no for now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is not possible with vim.fn.input
I know. But since the idea of vim.ui.*
is that others can override these for fancier implementation, is input(opts, on_confirm)
the best signature? If somebody wants to implement on_change
they'll either have to put on_change
inside opts
or add another parameter after on_confirm
.
Did you think about keeping on_confirm
inside opts
?
Also, a minor nit-pick - if you decide to put on_confirm
inside opts
, I think on_submit
would be a better name.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I do see your point, and input could also be the name of something that could filter out while typing. This however, is supposed to be a ui wrapper around vimscripts input
, and therefore I don't think it makes sense to include it here. I do however want to hear others opinion on this as well, especially since this is my first PR to neovim.
For the including of on_confirm
I also don't think it makes sense to include it in opts
, since the opts is supposed to be the same as in input
. It would also go agains the signature from vim.ui.select
. I am however open to changing the name to on_submit
if people are in favor of that
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here whenever the input value changes, the UI is updated. on_confirm won't help here. You'll need on_change or something.
So my question was, do you think this is something that vim.ui.input should support?
You do not need on_change
. That is completely up to whoever implements vim.ui.input
. Telescope would not need to have some extra hooks. It must just fulfill the responsibility of calling the callback when the prompt is entered.
I'll respond to a few of @justinmk comments.
It's not actually that local x = vim.fn.input('please type something: ')
-- it'd be cool if I could run code showing a preview, doing other things, etc, but the lua state is here.
print(x) As opposed to: vim.ui.input('please type something', function(result) print(x) end)
-- vim.ui.input could be something that displays new text when typing into a buffer, showing hints, etc. They are not equivalent in their usage for plugin authors. This would allow someone to use telescope to provide hints / previews / etc. while typing. In response to the other question:
The idea when I talked w/ @seblj about this was to stick closely to the ideas of
I think so. It also allows for GUIs to implement a "prompt" style input dialog, which could even be a separate OS window, etc.
Similar to
I'm not sure what you mean by this one. As a side note, I think prompting the user for some text is a core enough workflow that it is worth (at least considering) to be added to |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@tjdevries Thanks that makes sense.
I think this could be just a mode of vim.ui.select()
. vscode has both "input" and "quickpick" (menu/select). I don't see any API differences that require multiple functions. But maybe the behavior is too different.
I don't think I understand what you mean by that. I think the two functions are too different to be the same. I also don't know about the naming of the function then. I would maybe think |
And it may make overriding harder. |
Wanted to comment instead of approving
Should we also add (tbh I don't like the idea of |
I can see this being useful so I'll add this. If not anyone is disagreeing and thinking we shouldn't do it? |
I added kind |
I'd say let's hold off on Otherwise I think it looks good (I like |
Okay, I'll remove it then! EDIT: I just reset one commit back to remove the |
BREAKING CHANGES * 32-bit windows builds are no longer provided. * **build deps**: use libuv 1.42.0 upstream for WIN32 (#15889) (f6c0a37), closes #15889 * removes Windows 7 support * removes support for mouse and alternate buffers in TUI for Windows 8 and 8.1 * **lsp/diagnostic:** highlight groups and signs for LSP diagnostics renamed (e.g. `LspDiagnosticsDefaultWarning` to `DiagnosticWarn`) (a5bbb93) * **diagnostic:** make DiagnosticChanged a first class autocmd (#16098) (150a592), closes #16098 * `au User LspDiagnosticsChanged` autocommands are not supported. Use the new first-class DiagnosticChanged event instead. * **lua**: `register_keystroke_callback` => `on_key` (#15460) (69fe427) * **note**: this breaking change was included in 0.5.1 FEATURES * **:source, nvim_exec:** defer script item creation until s:var access (da9b0ab) * **:source, nvim_exec:** support script-local variables (d4ed51e), closes #13143 #11507 * **lua:** add trimempty optional parameter to vim.split (5fa26e2) * **lua:** add vim.str_utf_{start,end} (#16129) (2230b57) * **lua:** add vim.str_utf_pos function (d752cbc) * **lsp:** aggregate code actions from all clients (#15121) (c36df20) * **api:** add lua C bindings for xdiff (#14536) (3d3c0c6) * **api:** evaluate statusline string #16020 (9086938) * **api:** named marks set, get, delete #15346 (49fdc62) * **api:** nvim_get_chan_info: include "argv" for jobs #15537 (0603eba), closes #15440 * **api:** win_viewport also sends line_count #15613 (086631c) * **api:** support :terminal input callback in lua (9e41e82) * **ci:** add backport PR action (#14766) (6cc456d) * **decorations:** allow more than one stacked highlight in a virt_text (1495d36) * **decorations:** support virtual lines (392c658) (8d7816c) * **diagnostic:** move vim.lsp.diagnostic to vim.diagostic and support other sources (a5bbb93) * **diagnostic:** add 'prefix' option to open_float (#16321) (3c74ba4) * **diagnostic:** add option to include diagnostic source (d43151e) * **diagnostic:** allow 'prefix' option to return highlight (cc48837) * **diagnostic:** allow customized diagnostic messages (#15742) (d999c96) * **diagnostic:** match(), tolist(), fromlist() #15704 (e61ea77) * **diagnostic:** update jumplist on goto_next/prev (#15942) (b55944e) * **diagnostic:** use `scope = 'line'` by default for `open_float()` (#16456) (217f9f8), closes #16453 * **diagnostic:** support severity_sort (32c0631) * **checkhealth:** provide function for command line completion (8b43b07) * **f_chansend:** support Blob data argument (7e9ea08) * **job:** add parameter to close stdin (eb7f24b) * **keywordprg:** use :terminal for external commands #15398 (a90513c), closes #2995 #2761 * **lsp:** add 'focus' option to open_floating_preview (#16465) (fff8827) * **lsp:** add a registry for client side code action commands (6c03601) * **lsp:** add client command support to codelens (#15820) (19a77cd) * **lsp:** add codeAction/resolve support (#15818) (ec4731d) * **lsp:** add exit_timeout flag (#16070) (80456cf) * **lsp:** add formatexpr (#16186) (52fa1d2) * **lsp:** add lsp healthcheck (e268026) * **lsp:** add per-client commands (#16101) (519d8de) * **lsp:** add tagfunc (#16103) (f940e7a) * **lsp:** add warning message for large log size (e6777a7) * **lsp:** allow configuring zindex for floating windows (#15086) (c487a73) * **lsp:** allow diagnostics to be disabled for a buffer (#15134) (1aeb945) * **lsp:** allow root_dir to be nil (#15430) (ff0833c) * **lsp:** highlight active parameter in signature help (#15018) (af26371) * **lsp:** improve vim.lsp.util.apply_text_edits (#15561) (41cfba6) * **lsp:** include original request params in handler ctx (187579f) * **lsp:** jump to diagnostics by position (#14795) (ea39ff5) * **lsp:** Make line diagnostics display prettier (e43dbfd) * **lsp:** make list handlers configurable (#15199) (3e00d4f) * **lsp:** support textDocument/prepareRename (#15514) (c1f573f) * **lsp:** use uv_spawn to check if server executable (#16430) (1a60580) * **lsp:** use vim.ui.select() in codelenses (#16004) (e7ea54a) * **lsp:** utilize textEdit.range for startbyte in omnifunc (#15957) (e9d6f7c) * **lua:** add lua-cjson as vendored dependency (8decc9f) * **lua:** add vim.mpack for msgpack support in lua (eaf661d) * **lua:** allow passing handles to vim.b/w/t (6c5e7bd) * **lua:** convert binary string with NULs to Blob (de9df82) * **lua:** document support of packages with v:lua syntax (9dd371b) * **lua:** enable stack traces in error output (#16228) (03b805a) * **lua:** expose lua-cjson as vim.json (30fed27) * **lua:** make vim.mpack support vim.NIL and vim.empty_dict() (0f59666) * **match:** allow hl group to be defined after :match command (fca52f5) * **msgpack:** convert Blobs to BIN strings (af6f454) * **health:** support lua healthchecks (9249dcd), closes #15632 * **shada:** restore Blob globals properly (ef729fb) * **terminal:** TermClose: set exit code in v:event.status #15406 (50b30de), closes #4713 * **treesitter:** add next, prev sibling method (1400841) * **treesitter:** allow to set highlight priority for queries (242608e) * **ui:** add `opt.kind` to `vim.ui.select` (#15838) (7ae86c1) * **ui:** add vim.ui.input and use in lsp rename (#15959) (16d4af6) * **ui:** add vim.ui.select and use in code actions (#15771) (63fde08) * **vim script:** support calling v:lua as a method (b2994e3) CHANGES * **defaults:** auto-create backup dir (4600193) * **defaults:** inccommand=nosplit #15395 (7215d35) * **defaults:** set undo points in <C-U> and <C-W> (#15400) (2cb8db3) * **defaults:** limit syntax cost on CmdwinEnter #15401 (622a36b), closes #6289 #6399 * **defaults:** map CTRL-L to search highlights, update diffs #15385 (0aa8128) * **defaults:** map Y to y$ #13268 (5a111c1), closes #416 #6289 * **defaults:** remove 'options' from viewoptions #15397 (3954537), closes #6289 * **defaults:** set hidden (f6c72b7) * **defaults:** set nojoinspaces (d417e67) * **defaults:** switchbuf=uselast #15394 (4ba7495) * **runtime:** add packages as `"/pack/*/start/*"` patterns to &rtp (9df7e02) * **startup:** load builtin plugins with --clean #15893 (c7a63f3), closes #15605 * **terminal:** set cursorlineopt=number in terminal mode (#15493) (c61a386) * **window:** skip non-focusable floats for :windo (#15378) (e8631cb) PERFORMANCE IMPROVEMENTS * **api:** avoid spurious allocations when converting small objects (705e8f1) * **highlight:** use a hashtable for highlight group names (bb4b4d7) * **lua:** optimize vim.deep_equal #15236 (4b452d4) * **lua:** don't use regexes inside lua require'mod' (ea2023f), closes #15147 #15497 * **lsp:** improve json deserialization performance (#15854) (912a6e5) * **map:** reduce double pointer indirection to single pointer indirection (9e651a9) * **treesitter:** avoid string lookup of highlight name in hot loop (2460f0a) FIXES * **:source, nvim_exec:** handle Vimscript line continuations #14809 (6188926), closes #14807 * **:source:** copy curbuf lines to memory before sourcing #15111 (afdc9e6) * allow str_utfindex second argument to be an explicit nil (#16448) (512ec46) * **api:** fix crash after set_option_value_for() #15390 (8b0e6cc), closes #14097 #13577 * **api:** fix nvim_buf_set_extmark (2338345) * **autocmd:** fix conditions in block_autocmds, unblock_autocmds #15372 (29712ae), closes #6279 * **buffer_updates:** cleanup test behavior (54b2c68) * **buffer_updates:** handle :delete of the very last line in buffer (8335e26) * **buffer_updates:** handle :sort of already sorted buffer (ef687d3) * **buffer_updates:** make `lockmarks` not affect extmarks and buffer updates. fixes #12861 (7d171b1) * **bufupdates:** send correct updates for visual paste (1423146) * **build:** add an env var to re-enable the colors (5087347) * **build:** call find_package(Threads) before using its variables (f446ab3) * **build:** export symbols on Windows (aa644b7) * **build:** fix build failure in MinGW (0503e17) * **build:** make vendored libmpack and libmpack-lua build properly (2a08aef) * **channel:** throw error if sending to internal channel w/o terminal (3b89fee) * **checkhealth:** duplicate checks if module name has "-" #15935 (a36c6e5) * **checkhealth:** mitigate issues with duplicate healthchecks #15919 (acd5e83), closes #15259 * **ci:** disable broken test on openbsd on all CI due to resource constraints (a3e2636) * **ci:** re-run GHA for ready_for_review events (#15377) (c6ef956) * **decorations:** crash when :bdelete (extmark_free_all) after clear_namespace (cd353aa), closes #15212 * **defaults:** "syntax sync maxlines=1" on CmdwinEnter #15552 (5f8518b), closes #15401 * **defaults:** do not map Y in visual-mode #15387 (54726e8), closes #13268 * **diagnostic:** allow floats to be focusable (#16093) (427bac6) * **diagnostic:** change default severity_sort order (938ed45) * **diagnostic:** clamp line numbers in setqflist and setloclist (5b0d8f8) * **diagnostic:** correctly handle folder level diagnostics (f87779a) * **diagnostic:** deepcopy diagnostics before clamping line numbers (2abc799) * **diagnostic:** do not focus floats in goto functions (#16433) (b5b025f) * **diagnostic:** don't clamp line numbers in setqflist (0341c68) * **diagnostic:** don't return nil when callers expect a table (#15765) (057606e) * **diagnostic:** don't use nil col if missing from qflist (#16357) (5e46f64) * **diagnostic:** error on invalid severity value (#15965) (d5dd0aa) * **diagnostic:** fix navigation with diagnostics placed past end of line (34bb5fa) * **diagnostic:** fix option resolution in open_float (#16229) (fd34784) * **diagnostic:** fix wrong data type in setqflist() (3fd1450) * **diagnostic:** get line count per buffer when clamping (c59f200) * **diagnostic:** handle an unknown or missing client (#16242) (1fdbd29) * **diagnostic:** handle diagnostics placed past the end of line (#16095) (a2994c8) * **diagnostic:** make set() go through cache when calling show() (d93f47d) * **diagnostic:** only update decorations for loaded buffers (#15715) (924e8e4) * **diagnostic:** preserve fields from LSP diagnostics via user_data (#15735) (17b7968) * **diagnostic:** remove useless highlight links (#15683) (c13242c), closes #15585 * disable clipboard when test registers (dd63d93) * **docgen:** add tagfunc.lua (0746f00) * **doc:** various fixes #15604 (4eb1ebb) * **eval:** add the vimscript-1 feature to has() (18b32fc) * **eval:** checking for a non-empty string is too strict (#15987) (1dbbaf8) * **eval:** fix has('wsl') #16153 (16d06fa), closes #12642 #16143 * **eval:** fixup for empty modifier in fnamemodify (#16368) (a7ad509), closes #16367 * **extmark:** fix missing virt_lines when using id param of set_extmark (995dbd2) * **extmarks:** splice extmarks on nv_Undo #15920 (e069361) * **fileio:** replace characters over INT_MAX with U+FFFD (#16354) (a2e5c2f), closes #11877 * **float:** fix potential heap corruption in win_redr_border (de670f3) * **float:** redraw if w_border_adj changed (7ff1bc1) * **heath/provider.vim:** using list as string #16007 (5365f24), closes #15988 * **highlight:** remove syncolor.vim, always include syntax colors (9afa0d2), closes #15176 #12573 #15205 * **inccommand:** ignore trailing commands only for *previewed* command #15638 (1f8c91b), closes #8796 #7494 * include ci/ in exported tarball (d6f03aa), closes #15856 * **input:** never reinterpret unmapped ALT- chrods in Terminal mode (#16222) (5ce35ab) * **input:** resolve isolated (non-ALT/META) mappings #13109 (c4857b6), closes #13042 #13086 #15869 * **jobwait:** always drain process event queues #15402 (3c081d0), closes #15349 * **lsp_spec:** tests depended on previous session (069d1de) * **lsp:** accept file URIs without a hostname (a2c2a08) * **lsp:** add done flag to messages returned in util.get_progress_messages() (#15985) (45fa70a) * **lsp:** add placeholder cancel function (#16189) (4da0351) * **lsp:** add textDocument/prepareRename to capability map (#15961) (fcc11d5), closes #15899 * **lsp:** adjust legacy show diagnostic functions to use correct scope (#16106) (dc6c9fe) * **lsp:** allow diagnostic.clear to accept nil bufnr (#15137) (4ed2d4f) * **lsp:** avoid duplicates in client attached buffers (#16099) (c5525f2) * **lsp:** avoid serializing boolean as key (#15810) (96614f8) * **lsp:** change rpc start notify level to warn (#16467) (04c7b55) * **lsp:** change signature of buf_highlight_references (#16345) (eb3d591) * **lsp:** correctly parse LSP snippets #15579 (516775e), closes #15522 * **lsp:** default to UTF-16 in make_position_params (2e3a474) * **lsp:** do not index nil client in progress (#16262) (8f31b21) * **lsp:** do not invoke handlers for unsupported methods (#15926) (d288daa) * **lsp:** don't update active_clients on exit_timeout (#16192) (98f5782) * **lsp:** enable additional capabilities (#15470) (5d63354) * **lsp:** ensure buffers are re-attached on rename (#16266) (ee3a58d) * **lsp:** Ensure users get feedback on references/symbols errors or empty results (256570a) * **lsp:** expose ContentModified error code to callbacks (#15262) (3f09732) * **lsp:** fix cursor row after textEdits (#16038) (bd2f61c) * **lsp:** gracefully handle nil workspaceFolders (#16284) (0ecc58c) * **lsp:** guard textDocument/codeAction command logic #15769 (433bda4) * **lsp:** improve symbols_to_items performance (#16197) (5ad15c9) * **lsp:** Include client name in handler error messages (#15227) (24f2b9e) * **lsp:** pass bufnr for async formatting (#15084) (c31bc6e) * **lsp:** persist diagnostic config for clients (bcc9ba5) * **lsp:** prevent double <text> for cached plaintext markup (910967e) * **lsp:** restore diagnostics extmarks on buffer changes (#15011) (77b33e4) * **lsp:** rewrite incremental sync (#16252) (2ecf0a4) * **lsp:** send buffer contents joined on fileformat-specific linebreak (#16334) (134a638) * **lsp:** send textDocument/didChange for each buffer (#16431) (3451121) * **lsp:** support duplicate params in signature help (#15032) (9132b76) * **lsp:** update lsp-handler signature in call_hierarchy (#15738) (8164adc) * **lsp:** update workspace/applyEdit handler signature (#15573) (3f526fe) * **lua:** fix vim.deepcopy for metatables & cycled tables (#16435) (eb876a0) * **lua:** preserve argument lists which are not lists (6896d22) * **man.vim:** ensure buftype=nofile after :tag or :stag #15675 (29bc648), closes #15650 * **man.vim:** filetype=man is too eager #15488 (2548a9e), closes #15487 #15487 * **mouse:** fix mouse drag positions on multigrid #12667 (0dcfd0e), closes #15091 * **mouse:** correct dragged position in composed layout (810da1a) * **multigrid:** mouse events crash neovim (28ac6c0) * **nvim_open_win:** crash if autocmds delete buffer/window #15549 (0c06da1), closes #15548 * **options:** using :set fillchars should clear local value (7528bce) * prevent K_EVENT from stopping Select mode CTRL-O #15688 (5f144ef) * **provider:** compare versions as number, not string (python 3.10 support) #15937 (e16adbf), closes #14586 * **screen:** make display_tick monotonic up to 2^64. fixes #16152 (9e88c9c) * **screen:** missing search highlights when redrawing from timer #15380 (db695cc), closes #13074 #14064 * **shared:** do not treat empty tables as list in deep extend (#15094) (526fc60) * **sign:** reset auto sign column with minimum in float win minimal style (c8f57f6) * **startup:** init.lua: set $MYVIMRC to absolute path #15748 (c76cddf) * **termdebug:** replace mapset with nvim_set_keymap (#15699) (4d7dcbe) * **termdebug:** replace term_getline with getbufline #15598 (11289ad) * **terminal:** close without ! if the job is stopped (55defa1), closes #4683 * **terminal:** free terminal if close_buffer() closes a closed terminal (#16264) (14def4d) * **test/dumplog:** tostring(rv) before formatting as string (ddaa0cc) * **tests:** use isolated XDG_DATA_HOME in startup tests (8e663e2) * **treesitter:** do not map hl_group when no mapping is set (f489d98) * **treesitter:** run predicates more often in iter_matches (458f2aa) * **tui:** extend smglr ignores to smglp and smgrp (#16239) (3ba800f) * **tui:** remove obsolete $NVIM detection #15791 (4414584), closes #12937 #11390 * **tutor:** formatting, layout #15098 (c52ec8f), closes #15088 * **ui:** use nowait for q mapping in floating window (#16427) (c132144) * **v:lua:** fix emsg when calling v:lua directly (da9005a) * **vim-patch.sh:** run nvim with -u NONE -n #16179 (97ae0ab) * **vim.opt:** vimL map string values not trimmed (#14982) (4906156) * **window:** win_close from other tabpage #15454 (90b2da1), closes #15313 * **windowing:** positioning of relative floats (9065730)
BREAKING CHANGES * 32-bit windows builds are no longer provided. * **build deps**: use libuv 1.42.0 upstream for WIN32 (neovim#15889) (f6c0a37), closes neovim#15889 * removes Windows 7 support * removes support for mouse and alternate buffers in TUI for Windows 8 and 8.1 * **lsp/diagnostic:** highlight groups and signs for LSP diagnostics renamed (e.g. `LspDiagnosticsDefaultWarning` to `DiagnosticWarn`) (a5bbb93) * **diagnostic:** make DiagnosticChanged a first class autocmd (neovim#16098) (150a592), closes neovim#16098 * `au User LspDiagnosticsChanged` autocommands are not supported. Use the new first-class DiagnosticChanged event instead. * **lua**: `register_keystroke_callback` => `on_key` (neovim#15460) (69fe427) * **note**: this breaking change was included in 0.5.1 FEATURES * **:source, nvim_exec:** defer script item creation until s:var access (da9b0ab) * **:source, nvim_exec:** support script-local variables (d4ed51e), closes neovim#13143 neovim#11507 * **lua:** add trimempty optional parameter to vim.split (5fa26e2) * **lua:** add vim.str_utf_{start,end} (neovim#16129) (2230b57) * **lua:** add vim.str_utf_pos function (d752cbc) * **lsp:** aggregate code actions from all clients (neovim#15121) (c36df20) * **api:** add lua C bindings for xdiff (neovim#14536) (3d3c0c6) * **api:** evaluate statusline string neovim#16020 (9086938) * **api:** named marks set, get, delete neovim#15346 (49fdc62) * **api:** nvim_get_chan_info: include "argv" for jobs neovim#15537 (0603eba), closes neovim#15440 * **api:** win_viewport also sends line_count neovim#15613 (086631c) * **api:** support :terminal input callback in lua (9e41e82) * **ci:** add backport PR action (neovim#14766) (6cc456d) * **decorations:** allow more than one stacked highlight in a virt_text (1495d36) * **decorations:** support virtual lines (392c658) (8d7816c) * **diagnostic:** move vim.lsp.diagnostic to vim.diagostic and support other sources (a5bbb93) * **diagnostic:** add 'prefix' option to open_float (neovim#16321) (3c74ba4) * **diagnostic:** add option to include diagnostic source (d43151e) * **diagnostic:** allow 'prefix' option to return highlight (cc48837) * **diagnostic:** allow customized diagnostic messages (neovim#15742) (d999c96) * **diagnostic:** match(), tolist(), fromlist() neovim#15704 (e61ea77) * **diagnostic:** update jumplist on goto_next/prev (neovim#15942) (b55944e) * **diagnostic:** use `scope = 'line'` by default for `open_float()` (neovim#16456) (217f9f8), closes neovim#16453 * **diagnostic:** support severity_sort (32c0631) * **checkhealth:** provide function for command line completion (8b43b07) * **f_chansend:** support Blob data argument (7e9ea08) * **job:** add parameter to close stdin (eb7f24b) * **keywordprg:** use :terminal for external commands neovim#15398 (a90513c), closes neovim#2995 neovim#2761 * **lsp:** add 'focus' option to open_floating_preview (neovim#16465) (fff8827) * **lsp:** add a registry for client side code action commands (6c03601) * **lsp:** add client command support to codelens (neovim#15820) (19a77cd) * **lsp:** add codeAction/resolve support (neovim#15818) (ec4731d) * **lsp:** add exit_timeout flag (neovim#16070) (80456cf) * **lsp:** add formatexpr (neovim#16186) (52fa1d2) * **lsp:** add lsp healthcheck (e268026) * **lsp:** add per-client commands (neovim#16101) (519d8de) * **lsp:** add tagfunc (neovim#16103) (f940e7a) * **lsp:** add warning message for large log size (e6777a7) * **lsp:** allow configuring zindex for floating windows (neovim#15086) (c487a73) * **lsp:** allow diagnostics to be disabled for a buffer (neovim#15134) (1aeb945) * **lsp:** allow root_dir to be nil (neovim#15430) (ff0833c) * **lsp:** highlight active parameter in signature help (neovim#15018) (af26371) * **lsp:** improve vim.lsp.util.apply_text_edits (neovim#15561) (41cfba6) * **lsp:** include original request params in handler ctx (187579f) * **lsp:** jump to diagnostics by position (neovim#14795) (ea39ff5) * **lsp:** Make line diagnostics display prettier (e43dbfd) * **lsp:** make list handlers configurable (neovim#15199) (3e00d4f) * **lsp:** support textDocument/prepareRename (neovim#15514) (c1f573f) * **lsp:** use uv_spawn to check if server executable (neovim#16430) (1a60580) * **lsp:** use vim.ui.select() in codelenses (neovim#16004) (e7ea54a) * **lsp:** utilize textEdit.range for startbyte in omnifunc (neovim#15957) (e9d6f7c) * **lua:** add lua-cjson as vendored dependency (8decc9f) * **lua:** add vim.mpack for msgpack support in lua (eaf661d) * **lua:** allow passing handles to vim.b/w/t (6c5e7bd) * **lua:** convert binary string with NULs to Blob (de9df82) * **lua:** document support of packages with v:lua syntax (9dd371b) * **lua:** enable stack traces in error output (neovim#16228) (03b805a) * **lua:** expose lua-cjson as vim.json (30fed27) * **lua:** make vim.mpack support vim.NIL and vim.empty_dict() (0f59666) * **match:** allow hl group to be defined after :match command (fca52f5) * **msgpack:** convert Blobs to BIN strings (af6f454) * **health:** support lua healthchecks (9249dcd), closes neovim#15632 * **shada:** restore Blob globals properly (ef729fb) * **terminal:** TermClose: set exit code in v:event.status neovim#15406 (50b30de), closes neovim#4713 * **treesitter:** add next, prev sibling method (1400841) * **treesitter:** allow to set highlight priority for queries (242608e) * **ui:** add `opt.kind` to `vim.ui.select` (neovim#15838) (7ae86c1) * **ui:** add vim.ui.input and use in lsp rename (neovim#15959) (16d4af6) * **ui:** add vim.ui.select and use in code actions (neovim#15771) (63fde08) * **vim script:** support calling v:lua as a method (b2994e3) CHANGES * **defaults:** auto-create backup dir (4600193) * **defaults:** inccommand=nosplit neovim#15395 (7215d35) * **defaults:** set undo points in <C-U> and <C-W> (neovim#15400) (2cb8db3) * **defaults:** limit syntax cost on CmdwinEnter neovim#15401 (622a36b), closes neovim#6289 neovim#6399 * **defaults:** map CTRL-L to search highlights, update diffs neovim#15385 (0aa8128) * **defaults:** map Y to y$ neovim#13268 (5a111c1), closes neovim#416 neovim#6289 * **defaults:** remove 'options' from viewoptions neovim#15397 (3954537), closes neovim#6289 * **defaults:** set hidden (f6c72b7) * **defaults:** set nojoinspaces (d417e67) * **defaults:** switchbuf=uselast neovim#15394 (4ba7495) * **runtime:** add packages as `"/pack/*/start/*"` patterns to &rtp (9df7e02) * **startup:** load builtin plugins with --clean neovim#15893 (c7a63f3), closes neovim#15605 * **terminal:** set cursorlineopt=number in terminal mode (neovim#15493) (c61a386) * **window:** skip non-focusable floats for :windo (neovim#15378) (e8631cb) PERFORMANCE IMPROVEMENTS * **api:** avoid spurious allocations when converting small objects (705e8f1) * **highlight:** use a hashtable for highlight group names (bb4b4d7) * **lua:** optimize vim.deep_equal neovim#15236 (4b452d4) * **lua:** don't use regexes inside lua require'mod' (ea2023f), closes neovim#15147 neovim#15497 * **lsp:** improve json deserialization performance (neovim#15854) (912a6e5) * **map:** reduce double pointer indirection to single pointer indirection (9e651a9) * **treesitter:** avoid string lookup of highlight name in hot loop (2460f0a) FIXES * **:source, nvim_exec:** handle Vimscript line continuations neovim#14809 (6188926), closes neovim#14807 * **:source:** copy curbuf lines to memory before sourcing neovim#15111 (afdc9e6) * allow str_utfindex second argument to be an explicit nil (neovim#16448) (512ec46) * **api:** fix crash after set_option_value_for() neovim#15390 (8b0e6cc), closes neovim#14097 neovim#13577 * **api:** fix nvim_buf_set_extmark (2338345) * **autocmd:** fix conditions in block_autocmds, unblock_autocmds neovim#15372 (29712ae), closes neovim#6279 * **buffer_updates:** cleanup test behavior (54b2c68) * **buffer_updates:** handle :delete of the very last line in buffer (8335e26) * **buffer_updates:** handle :sort of already sorted buffer (ef687d3) * **buffer_updates:** make `lockmarks` not affect extmarks and buffer updates. fixes neovim#12861 (7d171b1) * **bufupdates:** send correct updates for visual paste (1423146) * **build:** add an env var to re-enable the colors (5087347) * **build:** call find_package(Threads) before using its variables (f446ab3) * **build:** export symbols on Windows (aa644b7) * **build:** fix build failure in MinGW (0503e17) * **build:** make vendored libmpack and libmpack-lua build properly (2a08aef) * **channel:** throw error if sending to internal channel w/o terminal (3b89fee) * **checkhealth:** duplicate checks if module name has "-" neovim#15935 (a36c6e5) * **checkhealth:** mitigate issues with duplicate healthchecks neovim#15919 (acd5e83), closes neovim#15259 * **ci:** disable broken test on openbsd on all CI due to resource constraints (a3e2636) * **ci:** re-run GHA for ready_for_review events (neovim#15377) (c6ef956) * **decorations:** crash when :bdelete (extmark_free_all) after clear_namespace (cd353aa), closes neovim#15212 * **defaults:** "syntax sync maxlines=1" on CmdwinEnter neovim#15552 (5f8518b), closes neovim#15401 * **defaults:** do not map Y in visual-mode neovim#15387 (54726e8), closes neovim#13268 * **diagnostic:** allow floats to be focusable (neovim#16093) (427bac6) * **diagnostic:** change default severity_sort order (938ed45) * **diagnostic:** clamp line numbers in setqflist and setloclist (5b0d8f8) * **diagnostic:** correctly handle folder level diagnostics (f87779a) * **diagnostic:** deepcopy diagnostics before clamping line numbers (2abc799) * **diagnostic:** do not focus floats in goto functions (neovim#16433) (b5b025f) * **diagnostic:** don't clamp line numbers in setqflist (0341c68) * **diagnostic:** don't return nil when callers expect a table (neovim#15765) (057606e) * **diagnostic:** don't use nil col if missing from qflist (neovim#16357) (5e46f64) * **diagnostic:** error on invalid severity value (neovim#15965) (d5dd0aa) * **diagnostic:** fix navigation with diagnostics placed past end of line (34bb5fa) * **diagnostic:** fix option resolution in open_float (neovim#16229) (fd34784) * **diagnostic:** fix wrong data type in setqflist() (3fd1450) * **diagnostic:** get line count per buffer when clamping (c59f200) * **diagnostic:** handle an unknown or missing client (neovim#16242) (1fdbd29) * **diagnostic:** handle diagnostics placed past the end of line (neovim#16095) (a2994c8) * **diagnostic:** make set() go through cache when calling show() (d93f47d) * **diagnostic:** only update decorations for loaded buffers (neovim#15715) (924e8e4) * **diagnostic:** preserve fields from LSP diagnostics via user_data (neovim#15735) (17b7968) * **diagnostic:** remove useless highlight links (neovim#15683) (c13242c), closes neovim#15585 * disable clipboard when test registers (dd63d93) * **docgen:** add tagfunc.lua (0746f00) * **doc:** various fixes neovim#15604 (4eb1ebb) * **eval:** add the vimscript-1 feature to has() (18b32fc) * **eval:** checking for a non-empty string is too strict (neovim#15987) (1dbbaf8) * **eval:** fix has('wsl') neovim#16153 (16d06fa), closes neovim#12642 neovim#16143 * **eval:** fixup for empty modifier in fnamemodify (neovim#16368) (a7ad509), closes neovim#16367 * **extmark:** fix missing virt_lines when using id param of set_extmark (995dbd2) * **extmarks:** splice extmarks on nv_Undo neovim#15920 (e069361) * **fileio:** replace characters over INT_MAX with U+FFFD (neovim#16354) (a2e5c2f), closes neovim#11877 * **float:** fix potential heap corruption in win_redr_border (de670f3) * **float:** redraw if w_border_adj changed (7ff1bc1) * **heath/provider.vim:** using list as string neovim#16007 (5365f24), closes neovim#15988 * **highlight:** remove syncolor.vim, always include syntax colors (9afa0d2), closes neovim#15176 neovim#12573 neovim#15205 * **inccommand:** ignore trailing commands only for *previewed* command neovim#15638 (1f8c91b), closes neovim#8796 neovim#7494 * include ci/ in exported tarball (d6f03aa), closes neovim#15856 * **input:** never reinterpret unmapped ALT- chrods in Terminal mode (neovim#16222) (5ce35ab) * **input:** resolve isolated (non-ALT/META) mappings neovim#13109 (c4857b6), closes neovim#13042 neovim#13086 neovim#15869 * **jobwait:** always drain process event queues neovim#15402 (3c081d0), closes neovim#15349 * **lsp_spec:** tests depended on previous session (069d1de) * **lsp:** accept file URIs without a hostname (a2c2a08) * **lsp:** add done flag to messages returned in util.get_progress_messages() (neovim#15985) (45fa70a) * **lsp:** add placeholder cancel function (neovim#16189) (4da0351) * **lsp:** add textDocument/prepareRename to capability map (neovim#15961) (fcc11d5), closes neovim#15899 * **lsp:** adjust legacy show diagnostic functions to use correct scope (neovim#16106) (dc6c9fe) * **lsp:** allow diagnostic.clear to accept nil bufnr (neovim#15137) (4ed2d4f) * **lsp:** avoid duplicates in client attached buffers (neovim#16099) (c5525f2) * **lsp:** avoid serializing boolean as key (neovim#15810) (96614f8) * **lsp:** change rpc start notify level to warn (neovim#16467) (04c7b55) * **lsp:** change signature of buf_highlight_references (neovim#16345) (eb3d591) * **lsp:** correctly parse LSP snippets neovim#15579 (516775e), closes neovim#15522 * **lsp:** default to UTF-16 in make_position_params (2e3a474) * **lsp:** do not index nil client in progress (neovim#16262) (8f31b21) * **lsp:** do not invoke handlers for unsupported methods (neovim#15926) (d288daa) * **lsp:** don't update active_clients on exit_timeout (neovim#16192) (98f5782) * **lsp:** enable additional capabilities (neovim#15470) (5d63354) * **lsp:** ensure buffers are re-attached on rename (neovim#16266) (ee3a58d) * **lsp:** Ensure users get feedback on references/symbols errors or empty results (256570a) * **lsp:** expose ContentModified error code to callbacks (neovim#15262) (3f09732) * **lsp:** fix cursor row after textEdits (neovim#16038) (bd2f61c) * **lsp:** gracefully handle nil workspaceFolders (neovim#16284) (0ecc58c) * **lsp:** guard textDocument/codeAction command logic neovim#15769 (433bda4) * **lsp:** improve symbols_to_items performance (neovim#16197) (5ad15c9) * **lsp:** Include client name in handler error messages (neovim#15227) (24f2b9e) * **lsp:** pass bufnr for async formatting (neovim#15084) (c31bc6e) * **lsp:** persist diagnostic config for clients (bcc9ba5) * **lsp:** prevent double <text> for cached plaintext markup (910967e) * **lsp:** restore diagnostics extmarks on buffer changes (neovim#15011) (77b33e4) * **lsp:** rewrite incremental sync (neovim#16252) (2ecf0a4) * **lsp:** send buffer contents joined on fileformat-specific linebreak (neovim#16334) (134a638) * **lsp:** send textDocument/didChange for each buffer (neovim#16431) (3451121) * **lsp:** support duplicate params in signature help (neovim#15032) (9132b76) * **lsp:** update lsp-handler signature in call_hierarchy (neovim#15738) (8164adc) * **lsp:** update workspace/applyEdit handler signature (neovim#15573) (3f526fe) * **lua:** fix vim.deepcopy for metatables & cycled tables (neovim#16435) (eb876a0) * **lua:** preserve argument lists which are not lists (6896d22) * **man.vim:** ensure buftype=nofile after :tag or :stag neovim#15675 (29bc648), closes neovim#15650 * **man.vim:** filetype=man is too eager neovim#15488 (2548a9e), closes neovim#15487 neovim#15487 * **mouse:** fix mouse drag positions on multigrid neovim#12667 (0dcfd0e), closes neovim#15091 * **mouse:** correct dragged position in composed layout (810da1a) * **multigrid:** mouse events crash neovim (28ac6c0) * **nvim_open_win:** crash if autocmds delete buffer/window neovim#15549 (0c06da1), closes neovim#15548 * **options:** using :set fillchars should clear local value (7528bce) * prevent K_EVENT from stopping Select mode CTRL-O neovim#15688 (5f144ef) * **provider:** compare versions as number, not string (python 3.10 support) neovim#15937 (e16adbf), closes neovim#14586 * **screen:** make display_tick monotonic up to 2^64. fixes neovim#16152 (9e88c9c) * **screen:** missing search highlights when redrawing from timer neovim#15380 (db695cc), closes neovim#13074 neovim#14064 * **shared:** do not treat empty tables as list in deep extend (neovim#15094) (526fc60) * **sign:** reset auto sign column with minimum in float win minimal style (c8f57f6) * **startup:** init.lua: set $MYVIMRC to absolute path neovim#15748 (c76cddf) * **termdebug:** replace mapset with nvim_set_keymap (neovim#15699) (4d7dcbe) * **termdebug:** replace term_getline with getbufline neovim#15598 (11289ad) * **terminal:** close without ! if the job is stopped (55defa1), closes neovim#4683 * **terminal:** free terminal if close_buffer() closes a closed terminal (neovim#16264) (14def4d) * **test/dumplog:** tostring(rv) before formatting as string (ddaa0cc) * **tests:** use isolated XDG_DATA_HOME in startup tests (8e663e2) * **treesitter:** do not map hl_group when no mapping is set (f489d98) * **treesitter:** run predicates more often in iter_matches (458f2aa) * **tui:** extend smglr ignores to smglp and smgrp (neovim#16239) (3ba800f) * **tui:** remove obsolete $NVIM detection neovim#15791 (4414584), closes neovim#12937 neovim#11390 * **tutor:** formatting, layout neovim#15098 (c52ec8f), closes neovim#15088 * **ui:** use nowait for q mapping in floating window (neovim#16427) (c132144) * **v:lua:** fix emsg when calling v:lua directly (da9005a) * **vim-patch.sh:** run nvim with -u NONE -n neovim#16179 (97ae0ab) * **vim.opt:** vimL map string values not trimmed (neovim#14982) (4906156) * **window:** win_close from other tabpage neovim#15454 (90b2da1), closes neovim#15313 * **windowing:** positioning of relative floats (9065730)
* vim.ui.input is an overridable function that prompts for user input * take an opts table and the `on_confirm` callback, see `:help vim.ui.input` for more details * defaults to a wrapper around vim.fn.input(opts) * switches the built-in client's rename handler to use vim.ui.input by default
After vim.ui.select got merged, I got an idea that I wanted to do something similar to
input()
. This is because I want to customize how the input is used in for example renaming with lsp, without overriding the entire rename function. This proposes a solution to this with a functionvim.ui.input
, which I also changed to be used inside rename for lsp.