aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua
Commit message (Collapse)AuthorAge
...
* fix(lsp): make thematic break parsing conform to GFM spec (#35162)skewb1k2025-08-05
| | | | | - Support for '_' and '*' as delimiters - Allow spaces between delimiters - Use more efficient implementation
* revert(lsp): compare to `vim.NIL` in `lsp/buf.lua` (#35156)Maria José Solano2025-08-03
| | | | | revert(lsp): "compare to `vim.NIL` in `lsp/buf.lua` #35154" This reverts commit a5c598871bcc16f1bc6fb8d46eb826d83d7d0f24.
* fix(lsp): compare to `vim.NIL` in `lsp/buf.lua` #35154Maria José Solano2025-08-03
|
* docs(lsp): mention default enablement of document colors (#35153)Maria José Solano2025-08-03
|
* fix(lsp): check if buffer is valid when resolving code lenses (#35092)Maria José Solano2025-08-03
|
* fix(snippet): early return for final tabstop #35115TheBlob422025-08-03
| | | | | The cursor movement autocommand can not detect when the final tabstop $0 is directly adjacent to another tabstop, which prevents ending the snippet session. The fix is an early return when jumping.
* feat(lua): vim.list.bisect() #35108Yi Ming2025-08-03
|
* fix(lsp): decode 'null' in server responses as vim.NIL #34849skewb1k2025-08-03
| | | | | | | | | | | | | | | | Problem: Previously, 'null' value in LSP responses were decoded as 'nil'. This caused ambiguity for fields typed as '? | null' and led to loss of explicit 'null' values, particularly in 'data' parameters. Solution: Decode all JSON 'null' values as 'vim.NIL' and adjust handling where needed. This better aligns with the LSP specification, where 'null' and absent fields are distinct, and 'null' should not be used to represent missing values. This also enables proper validation of response messages to ensure that exactly one of 'result' or 'error' is present, as required by the JSON-RPC specification.
* fix(options): make 'cdhome' take effect on any platformbfredl2025-08-03
| | | | | | | | | | | | Platform specific options are cringe and should either be fixed or deleted. In this case, the platform difference can trivially be implemented using a conditional default value. If the user overrides the value, then it is because the user wants that value, regardless of the corporation who manufactured the OS that the user is running. Possible alternative: delete the option by making it always on.
* vim-patch:9.1.1590: cannot perform autocompletion (#35141)zeertzjq2025-08-03
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: cannot perform autocompletion Solution: Add the 'autocomplete' option value (Girish Palya) This change introduces the 'autocomplete' ('ac') boolean option to enable automatic popup menu completion during insert mode. When enabled, Vim shows a completion menu as you type, similar to pressing |i\_CTRL-N| manually. The items are collected from sources defined in the 'complete' option. To ensure responsiveness, this feature uses a time-sliced strategy: - Sources earlier in the 'complete' list are given more time. - If a source exceeds its allocated timeout, it is interrupted. - The next source is then started with a reduced timeout (exponentially decayed). - A small minimum ensures every source still gets a brief chance to contribute. The feature is fully compatible with other |i_CTRL-X| completion modes, which can temporarily suspend automatic completion when triggered. See :help 'autocomplete' and :help ins-autocompletion for more details. To try it out, use :set ac You should see a popup menu appear automatically with suggestions. This works seamlessly across: - Large files (multi-gigabyte size) - Massive codebases (:argadd thousands of .c or .h files) - Large dictionaries via the `k` option - Slow or blocking LSP servers or user-defined 'completefunc' Despite potential slowness in sources, the menu remains fast, responsive, and useful. Compatibility: This mode is fully compatible with existing completion methods. You can still invoke any CTRL-X based completion (e.g., CTRL-X CTRL-F for filenames) at any time (CTRL-X temporarily suspends 'autocomplete'). To specifically use i_CTRL-N, dismiss the current popup by pressing CTRL-E first. --- How it works To keep completion snappy under all conditions, autocompletion uses a decaying time-sliced algorithm: - Starts with an initial timeout (80ms). - If a source does not complete within the timeout, it's interrupted and the timeout is halved for the next source. - This continues recursively until a minimum timeout (5ms) is reached. - All sources are given a chance, but slower ones are de-prioritized quickly. Most of the time, matches are computed well within the initial window. --- Implementation details - Completion logic is mostly triggered in `edit.c` and handled in insexpand.c. - Uses existing inc_compl_check_keys() mechanism, so no new polling hooks are needed. - The completion system already checks for user input periodically; it now also checks for timer expiry. --- Design notes - The menu doesn't continuously update after it's shown to prevent visual distraction (due to resizing) and ensure the internal list stays synchronized with the displayed menu. - The 'complete' option determines priority—sources listed earlier get more time. - The exponential time-decay mechanism prevents indefinite collection, contributing to low CPU usage and a minimal memory footprint. - Timeout values are intentionally not configurable—this system is optimized to "just work" out of the box. If autocompletion feels slow, it typically indicates a deeper performance bottleneck (e.g., a slow custom function not using `complete_check()`) rather than a configuration issue. --- Performance Based on testing, the total roundtrip time for completion is generally under 200ms. For common usage, it often responds in under 50ms on an average laptop, which falls within the "feels instantaneous" category (sub-100ms) for perceived user experience. | Upper Bound (ms) | Perceived UX |----------------- |------------- | <100 ms | Excellent; instantaneous | <200 ms | Good; snappy | >300 ms | Noticeable lag | >500 ms | Sluggish/Broken --- Why this belongs in core: - Minimal and focused implementation, tightly integrated with existing Insert-mode completion logic. - Zero reliance on autocommands and external scripting. - Makes full use of Vim’s highly composable 'complete' infrastructure while avoiding the complexity of plugin-based solutions. - Gives users C native autocompletion with excellent responsiveness and no configuration overhead. - Adds a key UX functionality in a simple, performant, and Vim-like way. closes: vim/vim#17812 https://github.com/vim/vim/commit/af9a7a04f18693eee4400dd134135527f4e8cd5f Co-authored-by: Girish Palya <girishji@gmail.com>
* fix(lsp): handle nil response in references request #35139Maria José Solano2025-08-02
|
* fix(pack): open confirmation buffer in tabpage after the current oneEvgeni Chasnovski2025-08-02
|
* fix(pack): ensure consistent order of changelog during updateEvgeni Chasnovski2025-08-02
| | | | | | | Problem: Left (`<` prefix) and right (`>` prefix) parts of update changelog come in not fixed order: it can be left-right or right-left. Solution: Ensure left-right order.
* fix(pack): make newer version suggestions more robustEvgeni Chasnovski2025-08-02
| | | | | | | | | | | | | Problem: New version suggestions in update confirmation buffer might include semver tags that were committed later but for versions that are not greater than current. Like if versions committed in order `v0.2.0` - `v0.3.0` - `v0.2.1` - `v0.3.1`, then when on `v0.3.0` both `v0.2.1` and `v0.3.1` are suggested, but only the latter is newer as a version. This is because those tags are computed with post-processed `git tag --list --contains HEAD`. Solution: Compute all semver tags and filter only those greater than the latest version available at HEAD.
* refactor(pack): use `vim.cmd` methods with structured inputEvgeni Chasnovski2025-08-02
|
* fix(pack): ensure explicit default `version` in events (where possible)Evgeni Chasnovski2025-08-02
| | | | | | | | | | | | | | | | | | | | | | Problem: Both `PackChangedPre` and `PackChanged` contain |event-data| with plugin's `spec`. It looks like a good idea to have all its triggers contain the same format across all kinds ("install", "update", "delete"). There are several choices: - Have it be as verbatim as supplied to `vim.pack.add()`, i.e. can be either string or table. A bit too ambiguous. - Have it be table with `src` and `name` inferred. This requires less work for "install", but more work for "update" and "delete" (since they use `vim.pack.get()` which already infers default `version`). - Have it be table with *all* defaults made explicit. This looks like the best approach, but requires extra care to only infer default `version` when needed (i.e. avoid inferring during regular load) because it is costly in terms of startup time. This might also introduce inconsistency when dealing with lockfile(s) as information there should be as close to what user supplied as possible. Address that when dealing with lockfile. Solution: Ensure explicit `version` in all events where possible.
* fix(pack): use `vim.pack:` as message/progress prefixEvgeni Chasnovski2025-08-02
|
* fix(pack): validate installed plugins in `update()` and `del()`Evgeni Chasnovski2025-08-02
| | | | | | | | | Problem: Currently `update()` and `del()` silently ignore input plugin names that are not for already installed plugin. This might lead to confusion because they are not explicitly reported. Solution: Check that all input names are for installed plugins and error otherwise.
* feat(pack): use colored `nvim_echo` chunks to show progress reportEvgeni Chasnovski2025-08-02
| | | | | | | | Problem: using `print()` to show progress report writes to `stdout` when in `--headless` mode (interferes with the testing output) and doesn't allow coloring. Solution: use `nvim_echo` with colored chunks.
* fix(pack): ignore 'loadplugins' when sourcing 'after/plugin' scriptsEvgeni Chasnovski2025-08-02
| | | | | | | | | Problem: Sourcing of 'after/plugin' scripts depends on the value of 'loadplugins' option. It is redundant, as it has effect only during startup, while it is combined with `vim.v.vim_did_enter == 1` (i.e. "it is after starting up") condition. Solution: Ignore it.
* fix(pack): improve `vim.pack.add()` input validationEvgeni Chasnovski2025-08-02
|
* fix(pack): use 'coxpcall.lua' on non-LuaJITEvgeni Chasnovski2025-08-02
| | | | | | | | Problem: `attempt to yield across metamethod/C-call boundary` error when trying to use `vim.pack.add()`. Solution: use `pcall()` variant from 'coxpcall' on non-LuaJIT version of Lua.
* fix(statusline): don't require'vim.diagnostic' unless already usedbfredl2025-08-02
| | | | | | | | | This workarounds a bug likely in nvim__get_runtime, and fixes #35124 Though I'd argue it is more correct anyway as the point of vim.SUBMODULE lazy loading is "only pay for what you use". If no one has require'vim.diagnostic' yet in LSP or otherwise, there cannot be any diagostics available and loading the lua module is wasteful.
* fix(diagnostic): check if the buffer is loaded #35125Eisuke Kawashima2025-07-31
| | | | | fix #35116 Co-authored-by: Eisuke Kawashima <e-kwsm@users.noreply.github.com>
* fix(statusline): check buf valid before redraw #35123Anton Kastritskii2025-07-31
| | | fixes #35116
* feat(statusline): vim.diagnostic.status() #33723Anton Kastritskii2025-07-29
| | | | | | | | Problem: Not easy to get a status string for diagnostics. Solution: - Add vim.diagnostic.status(). - Add it to the default 'statusline'.
* fix(extui): ensure windows are valid in scheduled on_key (#35106)luukvbaal2025-07-29
|
* fix(messages): 'exrc' / secure messagesJustin M. Keyes2025-07-28
|
* docs: lsp, ui events, dev guidance, osc7Justin M. Keyes2025-07-28
| | | | fix #34981
* feat(exrc): user must view and explicitly run ":trust" #35069nyngwang2025-07-28
| | | | | | | | | Problem: It's relatively easy to mispress key `a` to (a)llow arbitrary execution of 'exrc' files. #35050 Solution: - For exrc files (not directories), remove "allow" menu item. Require the user to "view" and then explicitly `:trust` the file.
* feat(lua): add vim.list.unique()Lewis Russell2025-07-28
| | | | | | | | Problem: No way to deduplicate values in a list in-place Solution: Add `vim.list.unique()`
* fix(diagnostics): avoid jumping to diagnostics in deleted ranges #35088Sergei Slipchenko2025-07-28
| | | | | | | | | | | | Problem: diagnostic extmark used for positioning continues to exist after deleting a range containing it, so it's possible to jump to a next/previous diagnositc, which isn't visible in any way, including not being shown via `open_float`. Solution: enable `invalidate` flag when setting an extmark to be able to filter out diagnostics based on `invalid` flag when looking for next/previous diagnostic to jump to.
* feat: serverlist({peer=true}) returns peer addresses #34806Siddhant Agarwal2025-07-27
| | | | | | | Problem: serverlist() only lists servers that were started by the current Nvim. Solution: Look for other Nvim servers in stdpath("run").
* feat(lsp): enable document_color by default #35086Maria José Solano2025-07-27
|
* fix(snippet): jumping backwards to choice node (#35062)TheBlob422025-07-27
| | | | Avoid duplicate text when jumping back to a choice node. Set cursor to end of tabstop range and prioritize current choice in completion items.
* fix(snippet): setting end_right_gravity (#35061)TheBlob422025-07-27
| | | | | | When right_gravity is set to true for deactivating tabstop expansion we have to set end_right_gravity to false to avoid expanding the tabstop region on the right side. Vice versa for activating tabstop expansion again.
* fix(lsp): don't override `config.title` in `vim.lsp.buf.signature_help()` #35075Maria José Solano2025-07-26
|
* fix(lsp): codelens extmark line out of range (#35070)Jaehwang Jung2025-07-26
| | | | | | | | | Problem: When setting extmark for a codelens after it's asynchronously resolved, the line may have been removed, raising "invalid 'line': out of range" error. This is a regression from #34888. Solution: Re-introduce the line count check.
* fix(diagnostics): position diagnostics using extmarks #34014Sergei Slipchenko2025-07-25
| | | | | | | | | | | | | Problem: Diagnostic positions are not being updated after text changes, which means `vim.diagnostic.open_float` and `vim.diagnostic.jump` will work with outdated positions when text is changed until diagnostics are updated again (if ever). Solution: Create extmarks in `vim.diagnostic.set` and use their positions for `vim.diagnostic.open_float` and `next_diagnostic` (used by `vim.diagnostic.jump`, `vim.diagnostic.get_next` and `vim.diagnostic.get_prev`).
* fix(diagnostics): extend conversion support from/to quickfix format (#34006)Mike2025-07-25
| | | | | Use uppercase to check severity Mark quickfix items as valid when converting from diagnostics Support nr/code attribute between formats
* fix(extui): attempt to perform arithmetic on field 'last_emsg' (#35047)phanium2025-07-24
| | | Co-authored-by: Luuk van Baal <luukvbaal@gmail.com>
* refactor(lua): use vim.system #34707Yochem van Rosmalen2025-07-23
|
* fix(iter): ArrayIter:last returns nil when filtered to empty #34697glepnir2025-07-22
| | | | | | Problem: After filtering out all elements, ArrayIter:last still returns a stale element. Solution: Add check for self._head == self._tail and return nil early. Fix #34696
* vim-patch:5711d76: runtime(doc): Tweak documentation stylezeertzjq2025-07-23
| | | | | | | | closes: vim/vim#17824 https://github.com/vim/vim/commit/5711d768181c3b08869ac41ee947a56a26763450 Co-authored-by: Hirohito Higashi <h.east.727@gmail.com>
* vim-patch:9.1.1576: cannot easily trigger wildcard expansion (#35022)zeertzjq2025-07-23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: cannot easily trigger wildcard expansion Solution: Introduce wildtrigger() function (Girish Palya) This PR introduces a new `wildtrigger()` function. See `:h wildtrigger()` `wildtrigger()` behaves like pressing the `wildchar,` but provides a more refined and controlled completion experience: - Suppresses beeps when no matches are found. - Avoids displaying irrelevant completions (like full command lists) when the prefix is insufficient or doesn't match. - Skips completion if the typeahead buffer has pending input or if a wildmenu is already active. - Does not print "..." before completion. This is an improvement on the `feedkeys()` based autocompletion script given in vim/vim#16759. closes: vim/vim#17806 https://github.com/vim/vim/commit/b486ed8266d3b8cd1ffab7d7f302fbd6d5a55c70 While at it, also make Ctrl-Z trigger search completion. Co-authored-by: Girish Palya <girishji@gmail.com>
* fix(lsp): support `containerName` in symbol requests #35029Riley Bruins2025-07-22
| | | The field is present for SymbolInformation and WorkspaceSymbol.
* feat(ui2): more predictable routing #35028luukvbaal2025-07-22
| | | | | | Problem: Routing based on message kinds can be perceived as unpredictable. Solution: Implement phase 1 of #34281, always showing the full message in a window dismissed on any user input when it does not fit in the 'cmdheight'. Also show spill "[+n]" indicator if needed.
* feat(lsp): diagnostic related documents supportRiley Bruins2025-07-21
|
* fix(lsp): store result id for unchanged diagnostic reportsRiley Bruins2025-07-21
| | | | | | | | | **Problem:** For unchanged document diagnostic reports, the `resultId` is ignored completely, even though it should still be saved for the request (in fact, the spec marks it as mandatory for unchanged reports, so it should be extra important). **Solution:** Always store the `resultId`.
* Merge pull request #34894 from janlazo/vim-8.1.0857zeertzjq2025-07-21
|\ | | | | vim-patch:8.1.{770,857,914,977,1004,1526,1551,1565,1584,1629,1641,1703,1728,1730,1736,1802,1853,1891,2127,2200},8.2.3922,9.0.{546,928},9.1.1382