aboutsummaryrefslogtreecommitdiff
path: root/runtime
Commit message (Collapse)AuthorAge
* docs(help): specify h4 "function signature" format #42434masterJustin M. Keyes2 days
| | | | | | | | | | | | | | | | | | | | | Work towards enabling ["flow" layout](https://github.com/neovim/neovim/blob/9244da12e400ec0291450a5e9400d995e7a29b83/src/gen/gen_help_html.lua#L86-L88) in all `:help` files. Problem: The final boss of vimdoc pseudo-structure: Vim's quasi-headings on function signatures and excmd docs is visually distinctive but too inconsistent for a nice parse rule. Solution: - Define the quasi-heading format as an "h4" variant, specified at `:help help-tag-heading`. - For simplicity and predictability, it is defined as any line that ends with a help tag(s) preceded by 2 or more spaces (or 1 tab). - Update existing docs. - This one-time update has a lot of changes, but is very unlikely to conflict with ported Vim-patches because (1) Vim rarely adds new *excmds* that we want, and (2) *function* docs are auto-generated. ref https://github.com/neovim/tree-sitter-vimdoc/issues/110
* feat(defaults): drop TAB from 'termpastefilter' #42433Justin M. Keyes2 days
| | | | | | | | Problem: By default, 'termpastefilter' removes TAB chars when pasting to a :terminal. Very annoying, and does not improve "security". Solution: Drop "HT" from the 'termpastefilter' default.
* vim-patch:4eae1d0: runtime(gitrevlist): prevent interpreting keywords as ↵zeertzjq3 days
| | | | | | | | | | | | | | | | | options (#42403) Problem: gitrevlist's keywordprg "git show" doesn't realise that input should never be interpreted as an option. (Note that it is in practice impossible to pass a value that is interpreted as an option, but this expresses intent and is defensive.) Solution: pass --end-of-options to force input to be interpreted as arguments. related: vim/vim#20702 closes: vim/vim#21472 https://github.com/vim/vim/commit/4eae1d03e82c5b775a25c097509562efd350a8a3 Co-authored-by: Fionn Fitzmaurice <git@fionn.computer>
* fix(snippet): preserve the full TM_DIRECTORY path (#42408)Volodymyr Chernetskyi3 days
| | | | | | | | | | Problem: TM_DIRECTORY expands to the directory's basename, losing its parent path. Solution: Remove the tail modifier when expanding the current file's directory. Extend the existing known-variable test to check the full directory path. AI-assisted
* refactor(watch): extract watchdirs into a classLewis Russell3 days
| | | | | | | | | | | | Problem: watchdirs() keeps its state in large nested callbacks in _watch.lua, which makes its directory tracking logic harder to change. Solution: Move the backend into its own module and store its state in a WatchDirs instance. Split setup, event handling and cleanup into methods. Extend the existing test to cover cancellation while a directory stat is pending. AI-assisted
* docs: vimdoc specification #42412Justin M. Keyes3 days
| | | | | | | | | Problem: No "spec" for various :help format (vimdoc) conventions, including the new "table" support. Solution: Introduce `:help help-spec`. Also, bump the vimdoc parser.
* docs: flow layoutJustin M. Keyes3 days
| | | | | | | | | | Work towards enabling "flow" layout in most `:help` files. Since [tables are supported in help](https://github.com/neovim/tree-sitter-vimdoc#tables), it's now possible to render most help files as ["flow" layout](https://github.com/neovim/neovim/blob/9244da12e400ec0291450a5e9400d995e7a29b83/src/gen/gen_help_html.lua#L86-L88) instead of the legacy fixed-width layout. Besides [improved HTML rendering](https://github.com/neovim/neovim/pull/42381#discussion_r4285705739), flow layout will allow `:help` presentation-mode to un-hardwrap text blocks.
* docs: cleanup invalid help sourceJustin M. Keyes3 days
| | | | | | | | | | Work towards enabling "flow" layout in most `:help` files. Since [tables are supported in help](https://github.com/neovim/tree-sitter-vimdoc#tables), it's now possible to render most help files as ["flow" layout](https://github.com/neovim/neovim/blob/9244da12e400ec0291450a5e9400d995e7a29b83/src/gen/gen_help_html.lua#L86-L88) instead of the legacy fixed-width layout. Besides [improved HTML rendering](https://github.com/neovim/neovim/pull/42381#discussion_r4285705739), flow layout will allow `:help` presentation-mode to un-hardwrap text blocks.
* vim-patch:9.2.1201: [security]: code injection via cargo quickfix plugin #42406zeertzjq3 days
| | | | | | | | | | | | | | Problem: [security]: code injection via cargo quickfix plugin (Daniel Dalvelac) Solution: Use chdir() instead of string executing a cd command Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-x2w5-pj55-7hpc fyi @gpanders https://github.com/vim/vim/commit/b93c000ddfc27c6a1192bcba77204709536cf094 Co-authored-by: Christian Brabandt <cb@256bit.org>
* fix(diagnostic): use logical positions for counted jumps #42394Volodymyr Chernetskyi3 days
| | | | | | | | | | | | | Problem: After edits move diagnostic ranges, counted jumps resume searching from their original positions. This can revisit the same diagnostic and hang the default first/last diagnostic mappings. Solution: Advance the search origin using the diagnostic's current logical position. Test forward and backward counted jumps after inserting or deleting a line, including jumps to the last or first diagnostic without wrapping. AI-assisted
* fix(lsp): ignore completion items without LSP metadata #42401Volodymyr Chernetskyi3 days
| | | | | | | | | | | | Problem: Accepting an item from another completion source raises an error when its user_data.nvim table does not contain LSP metadata. Solution: Retrieve and guard the nested LSP metadata before accessing its fields. Cover acceptance of a foreign completion item without LSP metadata. AI-assisted
* fix(lsp): keep label fallback for empty snippet insertText #42402Volodymyr Chernetskyi3 days
| | | | | | | | | | | | Problem: An empty snippet insertText falls back to the label during selection, but acceptance clears that label and expands an empty string. Solution: Require nonempty insertText before expanding a snippet without textEdit. Extend the omnifunc acceptance fixture with an empty snippet insertion. AI-assisted
* fix(lsp): preserve explicit completion edit ranges #42399Volodymyr Chernetskyi3 days
| | | | | | | | | | | | Problem: A completion list default edit range can replace the explicit range of an InsertReplaceEdit, filtering out valid items or changing their replacement. Solution: Only synthesize a default text edit when the completion item has none. Extend the existing itemDefaults test for explicit edits with both range variants. AI-assisted
* fix(lsp): prefer textEdit for snippet completion text #42400Volodymyr Chernetskyi3 days
| | | | | | | | | | | | Problem: Snippet completion words and previews prefer insertText even when textEdit is present, although the actual expansion uses textEdit.newText. Solution: Use the text edit before the fallback insertion text in both selectors. Extend the existing precedence test to check the snippet word and preview. AI-assisted
* docs: cleanup #42395Justin M. Keyes3 days
| | | | | | | | | | Work towards enabling "flow" layout in most `:help` files. Since [tables are supported in help](https://github.com/neovim/tree-sitter-vimdoc#tables), it's now possible to render most help files as ["flow" layout](https://github.com/neovim/neovim/blob/9244da12e400ec0291450a5e9400d995e7a29b83/src/gen/gen_help_html.lua#L86-L88) instead of the legacy fixed-width layout. Besides [improved HTML rendering](https://github.com/neovim/neovim/pull/42381#discussion_r4285705739), flow layout will allow `:help` presentation-mode to un-hardwrap text blocks. https://github.com/neovim/neovim/issues/31825
* fix(health): handle percent signs in LSP reports #42396Volodymyr Chernetskyi3 days
| | | | | | | | | | | Problem: Active-feature report text is passed to string.format() without arguments. Percent signs in buffer or client names can raise an error or change the displayed text. Solution: Report the concatenated text without formatting it again. AI-assisted
* fix(ui2): use global value of 'fillchars' #42397Evgeni Chasnovski3 days
| | | | | | | | Problem: Custom ui2 window tracks 'fillchars' option to adjust to the change of `msgsep` flag. However, 'fillchars' is `:h global-local` window option. If it is set locally to the window, ui2 reacts to its `msgsep` value and keeps using it afterwards even in other windows. Solution: Use and react to only global value of 'fillchars'.
* feat(inspector): support ranges in vim.inspect_posLewis Russell3 days
| | | | | | | | | | | | | | | | Problem: Highlight inspection is limited to a single position, and its result types do not document the fields shared by different highlight sources. Solution: Accept end_row/end_col in vim.inspect_pos to inspect a range. Keep range ends exclusive and retain the existing single-position behavior. Support Ex line ranges in :Inspect, including Visual selections. Document named result types, expose shared highlight fields, and keep the existing extmark details and buffer field for compatibility. AI-assisted
* fix(health): stop timed-out provider probe jobs #42390Volodymyr Chernetskyi3 days
| | | | | | | | | | Problem: The timeout handler raises an error before jobstop(), leaving the provider probe running after the healthcheck fails. Solution: Stop the job before raising the timeout error. AI-assisted
* fix(health): run provider probes only once #42391Volodymyr Chernetskyi3 days
| | | | | | | | | | | | | Problem: Provider checks start and wait for a job, then execute the same command again to obtain its output. The returned output can disagree with the first process's exit status, and the second execution has no timeout. Solution: Return the first job's captured output. Bind the output callbacks to their state and preserve line breaks between callback data entries. Cover invocation count, multiline stdout, and merged stderr. AI-assisted
* fix(health): report when 'paste' is enabled #42389Volodymyr Chernetskyi3 days
| | | | | | | | | | Problem: The configuration check compares the boolean 'paste' option to 1, so it never reports that the option is enabled. Solution: Check the boolean value directly and cover enabled and disabled states. AI-assisted
* docs: cleanup tables, highlights.scm #42381Justin M. Keyes3 days
| | | highlights.scm: `#match` is slow, prefer `#lua-match`.
* feat(diagnostic): add source option to virtual_lines handler (#42371)Aradhya Jain4 days
| | | | | | | | | | | | vim.diagnostic.Opts.VirtualText has a `source` option to prefix diagnostic messages with their source (`'if_many'` or always), but the newer virtual_lines handler never got the same option, even though the shared helpers it needs (diagnostic_shared.prefix_source/count_sources) are already render-target-agnostic and used by virtual_text as-is. Add the same `source` field to vim.diagnostic.Opts.VirtualLines and apply it in the virtual_lines handler right after message formatting, mirroring virtual_text's own ordering (format first, then prefix the source onto the already-formatted message).
* feat(docs): generate PDFJustin M. Keyes4 days
| | | | | Generate PDF using `chrome`. TODO: we probably don't need the `typst` codepath.
* feat(docs): table renderingJustin M. Keyes4 days
| | | | | | Render tables in both `:help` and generated HTML. Use NBSP (nonbreaking space) char in empty table cells.
* fix(docs): listitems with codeblocks #42367Justin M. Keyes4 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: - `<` before a listitem (`< - foo`) is not concealed. - Codeblock HTML has extra blank lines. - Codeblock in a listitem ends the listitem, so HTML docs drop the rest of the item and its nesting. Example from `:h nvim_open_win()`: ``` • border: … the double-box style can be specified as: > [ "╔", "═" ,"╗", "║", "╝", "═", "╚", "║" ]. < If fewer than eight chars are given, they will be repeated. • bufpos: … tree-sitter-vimdoc v4.1.0: (block (line_li (prefix) (line) (codeblock (code (line))))) (block (line) ; "If fewer…" (line_li (prefix) (line) (line))) ; "bufpos" tree-sitter-vimdoc v4.2.0: (block (line_li (prefix) (line) (codeblock (code (line))) (line)) ; "If fewer…" (line_li (prefix) (line) (line))) ; "bufpos" ``` Solution: - Bump tree-sitter-vimdoc to v4.2.0. https://github.com/neovim/tree-sitter-vimdoc/pull/174 - gen_help_html: get listitem indent from its first line - gen_help_html: don't double codeblock newlines. - highlight query: conceal `<` in `line_li`. - docs: fix doc sources where a blank line was missing after listitems followed by non-listitem text.
* vim-patch:26d8c85: runtime(gnat): Use shellescape to prevent code injection ↵zeertzjq5 days
| | | | | | | | | | | via filename While at it, also fix E716 when calling gnat.Get_Command('Find') by renaming the key from 'Find_Program' to the expected 'Find_Command'. https://github.com/vim/vim/commit/26d8c851889df19e93dde2a3572e1e356b3a84e3 Co-authored-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
* vim-patch:abb6f3e: runtime(compiler): escape paths for cppcheck compilerzeertzjq5 days
| | | | | | https://github.com/vim/vim/commit/abb6f3ea4cf61ec1b5702a6fbb6be2594549fb16 Co-authored-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
* docs: fix invalid vimdoc #42355Justin M. Keyes5 days
| | | | | Fixes some vimdoc CI errors: https://github.com/neovim/tree-sitter-vimdoc/blob/0c53e5be84a62cee1e583b15febf2b90720e52c9/.github/workflows/main.yml#L41-L47 The other errors are "lone backtick" cases, which will be fixed by https://github.com/neovim/tree-sitter-vimdoc/pull/171
* docs: fix invalid vimdoc #42353Justin M. Keyes5 days
|
* fix(api): nvim_set_option_value() "remove" ignores non-adjacent items #42351Justin M. Keyes5 days
| | | | | | | | | | | | | Problem: `nvim_set_option_value('fo', {'c','r','o'}, {operation='remove'})` does nothing on "jcqrol": the items are joined into one `:set-=` value, which only matches a contiguous substring. Removing map keys, e.g. {'eol','space'} from 'listchars', never matches. `vim.opt:remove{…}` inherits this. (Regression from f34ee3da80e8; 429338e74bf4 fixed the case where the flags are adjacent and in order.) Solution: Remove each item separately.
* vim-patch:partial:d6f7a03: runtime(misc): Use correct terminal feature test ↵zeertzjq6 days
| | | | | | | | | | | | | | | | | | in ftplugins (#42340) Problem: The current test 'exists(':terminal') == 2' is valid even in Vim builds that have the terminal not included (e.g. normal feature builds) and thus the K key would cause an error: "E319: Sorry, the command is not available in this version" or "E117: Unknown function: term_start()" Solution: Change the terminal feature test to "has('terminal')" to properly detect Vims without the terminal feature and use exists('*term_start') for functionality that depends on Vims support for the term_start() feature. While at it, change the Last Change date to the preferred style for Vim runtime files. https://github.com/vim/vim/commit/d6f7a03f7c569d84f34259c68dabfe9b357ba0fb Co-authored-by: Christian Brabandt <cb@256bit.org>
* feat(multicursor): ]C [C use previous cursors if mc inactive #42267IOCRYPOSTO6 days
| | | | | | | | | | | | Problem: After clearing cursors, "]C" "[C" do nothing, although the previous cursor positions ("gQ") may still be useful as marks. Solution: If multicursor is not active, "]C" "[C" iterate the "nvim.multicursor.last" extmarks. They also work as an operator motion ("d]C"), since there is no cascade. AI-assisted
* vim-patch:9.2.1178: [security]: code injection via rmd syntax patternzeertzjq7 days
| | | | | | | | | | | | | | Problem: [security]: code injection via rmd syntax pattern for fenced languages (ylerni7-ant) Solution: Keep only the leading word characters of the language name in the syntax script. Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-x2w5-pj55-7hpc https://github.com/vim/vim/commit/7670338d8b695c476de868dabd34d68d6de2443b Co-authored-by: Christian Brabandt <cb@256bit.org>
* vim-patch:9.2.1177: [security]: possible code injection via rubycompletezeertzjq7 days
| | | | | | | | | | | | | Problem: [security]: possible code injection via rubycomplete (tnshima) Solution: Do not use eval() for arbitrary buffer text Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-4xgr-vqh2-xfx8 https://github.com/vim/vim/commit/05d704d2856dbb75e95bd33cf222c2e6264fff8b Co-authored-by: Christian Brabandt <cb@256bit.org>
* vim-patch:52ce28a: runtime(systemd): use script-local function for keyword ↵zeertzjq7 days
| | | | | | | | lookup https://github.com/vim/vim/commit/52ce28a4ad0ec9df8eebb6556ebf677cc46ddbe8 Co-authored-by: Christian Brabandt <cb@256bit.org>
* vim-patch:0fa6704: runtime(sshconfig): correctly escape search pattern for ↵zeertzjq7 days
| | | | | | | | keywordprg https://github.com/vim/vim/commit/0fa670400bda8d78f90287c9b80af57fbb76ef55 Co-authored-by: Christian Brabandt <cb@256bit.org>
* vim-patch:40295c9: runtime(go): prevent code injection with keywordprgzeertzjq7 days
| | | | | | https://github.com/vim/vim/commit/40295c92be643a09d6443121637fa93d6cd105a1 Co-authored-by: Christian Brabandt <cb@256bit.org>
* fix(multicursor): v:cascading during on_key, insert-preview #42319Justin M. Keyes7 days
| | | | | | | | | | | Problem: - `v:cascading` is false during the Insert-mode live-preview. - `vim.on_key()` sees the internal keys of the Visual-selection preview and "zq" steps. Solution: - Set `v:cascading` during the Insert-mode preview. - Don't send internal keys to `on_key` callbacks. - Use `v:cascading` as the source of truth for `mc_replaying()`.
* multicursor: v:cascading #42289Evgeni Chasnovski7 days
| | | | | Problem: No way to check if cascade is in action. Solution: Add `v:cascading` variable.
* fix(multicursor): insert-mode Lua/API edit dropped on ESC #42312Justin M. Keyes7 days
| | | | | | | | | | | | | | | | | | | | | | | | Problem: With multicursors, an Insert-mode edit by a Lua/`<Cmd>` mapping or API (nvim_put(), …) is live-previewed at the other cursors, but dropped at ESC: the cascade replays _redo_, which does not contain such edits. Solution: When `<Cmd>`/Lua/RPC changes the buffer during Insert-mode, sync the previews and restart the capture (like a non-captured cursor-move). The edit stays as text. - The mapping runs only at the primary. Its text is mirrored as-is (similar to insert-completion). Re-running it per cursor would require a "partial-remap" span replay, and breaks single-session plugins (vim.snippet). - Not during completion; redo already captures the pre-inserted candidate on accept. - Text typed before the edit is kept as mirrored, not replayed, so per-cursor effects ('textwidth' wrapping, …) don't apply to it. Known issues: - "o"/"O"/"cc" with 'autoindent' followed by the mapping: the per-cursor insert-entry replay is still pending, so the edit is lost.
* fix(diagnostic): "Failed to delete autocmd" after noautocmd bwipeout #42303Justin M. Keyes7 days
| | | | | | | | | | | Problem: Handlers defer `show()` on unloaded buffers with a buffer-local BufRead autocmd whose id is stored per-namespace: - `noautocmd bwipeout` deletes the autocmd, so the next show/hide fails. - Showing another buffer in the same namespace cancels the pending show. Solution: Handlers skip unloaded buffers. The existing global BufRead autocmd shows cached diagnostics when the buffer loads.
* feat(startup): --embed --listen waits for UI if stdin is not a pipeJustin M. Keyes10 days
| | | | | | | | | | | | | | | | | | | | | | Problem: `nvim --embed --listen addr` always treats stdin as an RPC channel. If stdin is /dev/null (e.g. backgrounded over ssh), the channel closes before a UI can attach, so Nvim exits (detach=false behavior). If stdin is a tty, keystrokes are read as RPC. Solution: With `--embed --listen`, open the stdio RPC channel only if stdin is a pipe or socket. Else wait for a UI at the `--listen` address. $ nvim --embed --listen ./nvim.sock Nvim server (pid: 71984) waiting for UI, listening on: "./nvim.sock" Note: - No change when stdin is a pipe. So the test harness, TUI, and :restart all behave exactly as before. - The #29634 use-case of configuring a UI that attaches *after* startup (a second UI, or reattach) still requires #25377 (reliable UIEnter). Not affected by this change.
* feat(api): nvim_chan_set()Justin M. Keyes10 days
| | | | | | | | | | | | | | | | | | | Problem: Only the stdio channel can "own" a server (self-exit on close). After :restart the TUI reconnects over a socket, so the restarted server does not have "self-exit" behavior when the channel closes (e.g. by UI disconnect, host-terminal close, etc.), which leaves a dangling server. Solution: - Introduce `nvim_chan_set`. (`nvim_set_client_info` doesn't fit: exposing it to Lua would require a `channel` param, which is not backwards-compatible, plus it's awkward because it doesn't merge info.) - Broadcast per-channel properties in the "restart" UI event as an opaque dict (a potentially useful pattern for other UI-events in the future). - UIs are expected to restore the channel properties on restart. - `nvim_get_chan_info()` reports "detach". - Remove `nvim__chan_set_detach()`.
* vim-patch:b114ec4: runtime(algol68): Update syntaxzeertzjq13 days
| | | | | | | | | | | | - Remove duplicate STRUCT definition. - Add Genie NEW, alias for HEAP. closes: vim/vim#21435 https://github.com/vim/vim/commit/b114ec4791f41f97a4306e1efe5c319852c51ec7 Co-authored-by: Doug Kearns <dougkearns@gmail.com> Co-authored-by: Janis Papanagnou <janis_papanagnou@hotmail.com>
* vim-patch:cff1d9e: runtime(typescript): Update syntax, fix pattern memory ↵zeertzjq13 days
| | | | | | | | | | | | | | | usage with re=1 - Fix typescriptArrowFuncDef pattern memory errors when regexpegine=1. - Add a test. fixes: vim/vim#17247 related: vim/vim#21400 closes: vim/vim#21423 https://github.com/vim/vim/commit/cff1d9e4e73a390ce3da333a8536d0490ce15d20 Co-authored-by: Doug Kearns <dougkearns@gmail.com>
* Merge pull request #42198 from lewis6991/watch-pruningLewis Russell13 days
|\ | | | | perf(watch): skip directories outside include glob prefixes
| * perf(watch): skip directories outside include glob prefixesLewis Russell2026-10-05
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: watchdirs() scans and watches every directory that is not excluded, even when a glob only matches files in one subtree. Some language servers register absolute dependency filenames separately. Neovim uses the workspace root for these string globs, so each extra registration can scan and allocate libuv handles across the whole tree. Solution: Keep each glob's literal directory prefix with its compiled matcher. A directory must be allowed by both the include filter and at least one watch rule. Skip unrelated subtrees, including new directories created later. Keep ancestors watched so matching directories can still be found. Report events only when they match the full patterns. For example, watching /project for /project/src/**/*.lua only needs the src tree and /project itself: /project/ watched |-- src/