aboutsummaryrefslogtreecommitdiff
path: root/src
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.
* docs: update version.c #42344github-actions[bot]2 days
| | | | | | | | | | | | | | | vim-patch:9.2.1181: patch 9.2.1181: MS-Windows: compile warnings with clang 23 vim-patch:9.2.1188: patch 9.2.1188: prop_type_get() does not return the "override" item vim-patch:ce7c78578 AGENTS.md does not explain how to write garbage collection tests vim-patch:9.2.1192: patch 9.2.1192: Compile warning when FEAT_DIFF is disabled vim-patch:9.2.1193: patch 9.2.1193: Vim9: dict type with type variable not checked in generic function vim-patch:3f1281d50 CI: enable Linux coverage for string-valued action input vim-patch:9.2.1202: patch 9.2.1202: Vim9: crash on error in a long "implements" list vim-patch:9.2.1181: patch 9.2.1181: MS-Windows: compile warnings with clang 23 vim-patch:9.2.1084: Cannot check a script without executing it vim-patch:9.2.1140: Vim9: :def in legacy script can create a script variable vim-patch:9.2.1184: the dry run feature not well received
* fix(options): out-of-range number in 'iskeyword' aborts Nvim (#42410)ump45nose3 days
| | | | | | | | | | | | Problem: A number in 'iskeyword', 'isfname' or 'isident' that overflows (e.g. via a modeline) hits abort() or an assert in getdigits_int(). Solution: Parse the numbers non-strictly so an out-of-range value gives E474. Fixes #42409 AI-assisted
* 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.1198: memory leak with 'quickfixtextfunc' #42405zeertzjq3 days
| | | | | | | | | | | | Problem: The list returned by 'quickfixtextfunc' is never unreferenced, so it is not freed until garbage collection. Solution: Unreference the list after filling the quickfix buffer (Volodymyr Chernetskyi). closes: vim/vim#21437 https://github.com/vim/vim/commit/84d86c65d3bc612320c3d38c2fc987c5cdd81ae9 Co-authored-by: Volodymyr Chernetskyi <19735328+chernetskyi@users.noreply.github.com>
* Merge pull request #42404 from zeertzjq/vim-9.2.1196zeertzjq3 days
|\ | | | | vim-patch:9.2.{1196,1199}
| * vim-patch:9.2.1199: case-folded regexp matches can end inside a UTF-8 characterzeertzjq3 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: Case-folded regexp matches can end inside a UTF-8 character when the input is longer than the literal pattern. Solution: Return the input byte length after a successful comparison even when it exceeds the pattern byte length, and test literal replacements and backreferences (Volodymyr Chernetskyi). related: vim/vim#14756 related: vim/vim#21212 closes: vim/vim#21439 https://github.com/vim/vim/commit/c9a9517ce8498256b50576e8291709083b607d70 Co-authored-by: Volodymyr Chernetskyi <19735328+chernetskyi@users.noreply.github.com>
| * vim-patch:9.2.1196: NFA literal matches miss characters with different ↵zeertzjq3 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | case-folded widths Problem: NFA literal matches miss characters with different case-folded widths, including when retrying after a failed suffix match. Solution: Advance past the actual input character in both paths and test string and buffer searches (Volodymyr Chernetskyi). related: vim/vim#14294 closes: vim/vim#21438 https://github.com/vim/vim/commit/b3affdd29ea4b1017f5c870824a9e4576731fa95 Co-authored-by: Volodymyr Chernetskyi <19735328+chernetskyi@users.noreply.github.com>
* | 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(startup): respect --noplugin when used with --clean #42362Max Coplan3 days
| | | | | | | | | | | | | | | Problem: When starting Nvim with both `--clean` and `--noplugin` (in either order), `--noplugin` is silently ignored and built-in runtime plugins are loaded anyway. `command_line_scan()` sets `p_lpl = false` for `--noplugin`, and `--clean` sets `params.use_vimrc = "NONE"` and `params.clean = true`, which later overwrites `p_lpl` back to `true` via `p_lpl = vimrc_none ? params.clean : p_lpl`. Solution: Only reset `p_lpl = false` when `vimrc_none && !params.clean`, preserving `p_lpl = false` if `--noplugin` was passed. AI-assisted
* docs: cleanup tables, highlights.scm #42381Justin M. Keyes3 days
| | | highlights.scm: `#match` is slow, prefer `#lua-match`.
* vim-patch:9.2.1197: :autocmd completion fails after ++args (#42384)glepnir4 days
| | | | | | | | | Problem: Cannot complete the command after ++once or ++nested for :autocmd. Solution: Skip over these flags in set_context_in_autocmd() (glepnir). closes: vim/vim#21429 https://github.com/vim/vim/commit/cf57ec0db8a9bc9926c7ede86a8586f057545723
* fix(options): extend dry-run validationLewis Russell4 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: nvim_set_option_value() dry runs skip checks in did_set_* callbacks. This logic also prepares values needed to apply the option, such as tab widths or a compiled regexp. Moving the checks into validation callbacks needs a way to save that work for did_set_*. Solution: Store prepared values in optset_T so did_set_* can consume them after the option is stored. Dry runs perform the same validation, then free the prepared values without changing live state. This extends dry-run validation for: - 'cedit': reject invalid command-line window keys. - 'completeitemalign': require each completion column exactly once. - 'cursorlineopt': reject empty values and conflicting line modes. - 'encoding': accept only UTF-8 and its aliases. - 'fileencoding': reject lists and local changes with 'nomodifiable'. - 'messagesopt': require mandatory fields and enforce numeric limits. - 'spellcapcheck': return regexp errors, including under :silent!. - 'spellsuggest': reject conflicting suggestion modes. - 'varsofttabstop' and 'vartabstop': reject invalid tab widths. - 'wildmode': reject more than four completion stages. 'makeencoding' also uses the shared encoding preparation. Separating value preparation exposed a bug in 'vartabstop' and 'varsofttabstop': failed assignments could discard local tab widths, and global assignments could overwrite them. Fix this by preparing new widths separately and applying them only after a valid local assignment. AI-assisted
* 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.
* fix(search): crash on "//e" with only a substitute pattern (#42345)Jonas Örnfelt5 days
| | | | | | | | | | | | | | | vim-patch:9.2.1191: crash with "//e" when only a substitute pattern exists Problem: Crash when using "//e" or "//" while there is a substitute pattern but no previous search pattern (after v9.2.0374). Solution: Use the previous pattern selected for an empty pattern (Jonas Ornfelt). related: vim/vim#19998 closes: vim/vim#21533 AI-assisted https://github.com/vim/vim/commit/c58607c9a0579de0da909fc46f68144a01378af1
* docs: fix invalid vimdoc #42353Justin M. Keyes5 days
|
* fix(api): nvim_buf_call() from expression for window in non-current tabpage ↵Justin M. Keyes5 days
| | | | | | | | | | | | | | | | #42352 Problem: - nvim_buf_call() aborts (assert) when called from an expression evaluated for a window in another tabpage ('foldexpr', 'statusline'), because `curwin` is not in `curtab`. - After it returns, `curwin` is wrong if it switched windows. - `vim._with{win=…, keepcwd=true}` does not undo `:lcd` if `win` is in another tabpage. Solution: - Allow `curwin` outside `curtab`, and restore if it was outside `curtab` at `ctx_switch()`. - Find the target window in any tabpage when restoring its dirs.
* 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.
* fix(terminal): [Process exited] msg hides last line of full screen #42349Justin M. Keyes5 days
| | | | | | | | | Problem: If a job exits with cursor at last row, the `[Process exited]` message covers the text of that row. Solution: Start a new line before showing the message, like the old `\r\n[Process exited]` did.
* vim-patch:9.2.1183: fuzzy completion order is unstable (#42343)zeertzjq6 days
| | | | | | | | | | | Problem: Fuzzy completion sort order is unstable for equal scores. Solution: Remember the list position when a match is first scored and use it to break ties (glepnir). closes: vim/vim#21443 https://github.com/vim/vim/commit/8c735cae9e589d1e587127386d6bf6869caed93b Co-authored-by: glepnir <glephunter@gmail.com>
* vim-patch:9.2.1182: autocommand checks paths for non-existing events (#42342)zeertzjq6 days
| | | | | | | | | | | | | | | Problem: has_autocmd() expands file names for events without registered autocommands. Solution: Return early when no autocommand patterns exist for the event (Yasuhiro Matsumoto). With my configuration on MS-Windows startup goes from 259 ms to 246 ms (median of 9 runs). closes: vim/vim#21449 https://github.com/vim/vim/commit/97a721d6c599829b242649d13844c4baa0f16b8a Co-authored-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
* 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
* fix(channel): emit ChanInfo for :detach! #42295Sanzhar Kuandyk6 days
| | | | | | | | | Problem: :detach! changes the channel's detach property without emitting ChanInfo, so plugins watching channel updates cannot react to changes. Solution: Schedule ChanInfo after setting detach=true. Add a test covering emit on :detach!. AI-assisted
* fix(terminal): missing "?" in theme-update sequence #42297Zoe Roux6 days
| | | | | | | | | | | | | | | | Problem: With DEC mode 2031 enabled, the terminal sends "CSI 997 ; Ps n" when background changes. The spec[1] defines the notification as "CSI ? 997 ; Ps n", same as the reply to "CSI ? 996 n" (which libvterm already sends correctly). Strict parsers (e.g. opentui) ignore it, so apps running in :terminal never follow theme changes. Nvim itself doesn't notice because its TUI accepts 997 DSRs without the marker. Solution: Send "CSI ? 997 ; Ps n". [1] https://contour-terminal.org/vt-extensions/color-palette-update-notifications/ AI-assisted
* fix(ops): '] and yank width of forced-blockwise motion #42321IcyJerry6 days
| | | | | | | | | | | | | | | Problem: `g@<C-v>j` and `y<C-v>j` set '] one char short of the block corner, so 'operatorfunc' cannot get the block. With 'virtualedit' "block", "y" also yanks a short last line one column narrow. Solution: - Decide `inclusive` from the motion's own type, before get_op_vcol() makes it blockwise (like Vim). - Never exclude the end of a block from '] (`g@<C-v>l`): a block includes its corner. Co-authored-by: IcyJerry <263879414+Icyjerry@users.noreply.github.com> Co-authored-by: Nagato Yuzuru <nagato@yuzuru.me>
* refactor(cmdatom): add payload in atom_from_frame() #42325Justin M. Keyes6 days
| | | | | | | Problem: Redundant code led to bugs like 2323746bfe4af534979249b051e7ada11c63b389 Solution: Append the payload in atom_from_frame().
* docs: update version.c #42229github-actions[bot]6 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | vim-patch:8.2.2338: patch 8.2.2338: Vim9: no error if using job_info() result wrongly vim-patch:9.0.1572: patch 9.0.1572: error messages are not translated vim-patch:86fcada95 translation(ru): adjust tutor/README.ru.utf-8.txt (#13789) vim-patch:9.1.0500: patch 9.1.0500: cannot switch buffer in a popup vim-patch:c5e24ee24 runtime(doc): add a note for netrw bug reports vim-patch:2e359b98f runtime(tutor): fix typo in Chapter 2 vim-patch:5ccf7f140 runtime(tutor): regenerated some translated tutor1 files vim-patch:0b5926f77 translation(it): include Italian version of tutor chapter 2 vim-patch:cdbbdb9ec runtime(tutor): fix another typo in tutor2 vim-patch:b183f5028 runtime(tutor): Reformat tutor1 vim-patch:802183082 runtime(tutor): updated Russian translation for tutor chapter 1 vim-patch:5f2a95955 runtime(doc): symlinking netrw.txt causes problems during install on Windows vim-patch:8322923b4 translation(ru): include Russian translation for chapter two of the tutorial vim-patch:721be7fd0 runtime(doc): add back help tag "pi_netrw.txt" vim-patch:951d025af runtime(tutor): Add Galician language versions of tutor1 and tutor2 vim-patch:ba19b6589 runtime(doc): fix typo in description of :redrawtabpanel vim-patch:30dcd0e1f runtime(tutor): apply fixes to runtime/tutor/tutor2 vim-patch:9.1.1494: patch 9.1.1494: runtime(tutor): no French translation for Chapter 2 vim-patch:477c893c0 runtime(tutor): remove duplicate tutor1.zh vim-patch:b87f133b0 runtime(tutor): Add a section on text objects and special registers to Chapter 2 vim-patch:0ef50d9d8 runtime(tutor): Update German translation for the tutor vim-patch:9cd512c7f runtime(tutor): Improve Spanish translation of chapter 1 vim-patch:58fafb654 runtime(tutor): Add Spanish translation for chapter 2 vim-patch:48940d94f runtime(tutor): Improve style for chapter 2 vim-patch:bbf616a9d runtime(tutor): Improve Spanish translations vim-patch:e74e40dc4 runtime(tutor): Improve Spanish translation for chapter 2 after 757b42a vim-patch:a4ee22529 translation(sv): Add Swedish translation of tutor2 vim-patch:0eb8e4de4 translation(sv): Update tutor1.sv to version 1.7 vim-patch:89296da39 translation(it): Add Italian translation of tutors README vim-patch:5979d7dd7 PR template duplicates the commit message and needs edits to fill in vim-patch:9.2.1170: patch 9.2.1170: GTK2 compile error when image feature is enabled vim-patch:9.2.1172: patch 9.2.1172: Vim9: crash when lambda assigns to item of outer argument vim-patch:2248250b4 CI: Bump msys2/setup-msys2 vim-patch:9.1.0807: tests: having 'nolist' in modelines isn't always desired
* fix(api): crash on invalid :tab address #42328glepnir6 days
| | | | | | | | Problem: nvim_parse_cmd("'btab", {}) and typing ":'btab" crash, parse_cmdline() continues with a NULL eap->cmd after an invalid :tab address. Solution: Fail if parse_command_modifiers() set an error.
* fix(ui): ext_messages/ui2: stale 'rulerformat' "[+]" after :write #42315Justin M. Keyes7 days
| | | | | | | | | | | | | | Problem: With 'ruler' in the cmdline ('laststatus=0') and ext_messages (ui2), a 'rulerformat' "%m" does not update the "[+]" indicator after ":write", until a cursor-move. Analysis: `redraw_buf_status_later()` only marks windows with a statusline or winbar. The symptom is hidden by the legacy message grid because the write message overwrites the cmdline, which redraws the ruler. Solution: Also mark the cmdline 'ruler', like `status_redraw_buf()`.
* fix(multicursor): Visual-mode mapping drops getchar() payload #42324Justin M. Keyes7 days
| | | | | | | | | | Problem: A Visual-mode mapping that reads input (`getchar()`) does not include that input when cascading to other cursors (they only see ESC). OTOH, Normal-mode mappings do replay the input. Solution: Append the payload to the Visual session's Lua-mapping subatom, and to the session-ending command (`:<C-u>…` mapping).
* 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()`.
* vim-patch:9.2.1174: fixed-sized windows grow when closing other windows (#42314)zeertzjq7 days
| | | | | | | | | | | | | Problem: Fixed-size windows are resized when sharing free space to a group of windows. Solution: When resizing a group of windows, skip windows with a fixed size if possible (Aryan). fixes: vim/vim#21478 closes: vim/vim#21479 https://github.com/vim/vim/commit/354c4c0d04c3524b74f8ce6175efebda6cfa4c67 Co-authored-by: Aryan <ether9095cable@gmail.com>
* fix(multicursor): "zqn" places no cursors after "/\%V" search #42313Justin M. Keyes7 days
| | | | | | | | Problem: After `/\%Vfoo<CR>`, `zqn` places no cursors. `mc_zq_target()` clears `'< '>` before `gn` (to detect a failed match), so `\%V` never matches. Solution: Keep the user's `'< '>` during `gn`; detect failure by its beep.
* 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.
* vim-patch:9.2.1176: Vim writes test file "4913" (#42310)zeertzjq8 days
| | | | | | | | | | | | | | | | | | | | Problem: Vim writes test file "4913". Solution: Write probe file as (hidden) swap file, so file watchers can apply standard ignore patterns (Keith Smiley). This logic creates and deletes an arbitrary numbered filename. I found that some file system watchers that otherwise respect VCS ignore patterns can pick this file up and potentially rerun because of that. This changes the arbitrary filename to use the swp extension so it's more likely to already be ignored by the VCS. related: vim/vim#5145 related: neovim/neovim#3460 closes: vim/vim#21468 https://github.com/vim/vim/commit/7eb646597d6b6be42f5941cf194938afa3af5208 Co-authored-by: Keith Smiley <keithbsmiley@gmail.com>
* fix(setreg): use better estimate of register widthbfredl8 days
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | vim-patch:9.2.1175: setreg() block width wrong for unprintable chars When yanking, the width of a <c-v>{motion}y register is determined by the virtual colums of the text. However in setreg() in 'b' mode use an idosyncratic width measurement where C0 control chars (ASCII 0x00 - 0x19) and invalid UTF-8 bytes have width 1 instead of their display width (2 or 4 cells). Consider the following test case: let strings = ['"reference', '"Übel', "\"aa\x07bb", "\"qq\x82", "\"x\nbabbel"] for string in strings call append('$', string) exec "normal G0\<c-v>$\"ay" let one = getregtype('a') if string != strings[-1] call setreg("b", string, 'b') let two = getregtype('b') else let two = "na" endif call setreg("c", [string], 'b') let three = getregtype('c') call append('$', '"yank: '.one.", string: ".two.", list: ".three) endfor AFter this fix, all the three ways of measuring the width gives equal values (or two, in the case of not being able to use setreg() with a plain string in the first case)
* fix(windows): server dies with terminal after :restartJustin M. Keyes10 days
| | | | | | | | | | | | | Problem: On Windows, a server started by :restart attaches to the TUI's console. Closing the host-terminal kills the server, even after :detach or :detach!: the swap to a hidden console only happens when a stdio UI disconnects, but after :restart the TUI is on a socket. Solution: Track whether the console is inherited from the parent. When the last UI disconnects and the server keeps running, swap an inherited console for a hidden one.
* 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.
* refactor(ui): remove "stop" UI eventJustin M. Keyes10 days