aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/fileio.c
Commit message (Collapse)AuthorAge
* fix(fileio): coverity CHECKED_RETURN #42247Justin M. Keyes2026-10-05
| | | | | | | | CID 657024: Error handling issues (CHECKED_RETURN) /src/nvim/fileio.c: 2720 in rename_with_tmp() >>> Calling "os_rename" without checking return value (as is done elsewhere 4 out of 5 times). 2720 os_rename(tempname, from); If moving the file back fails, log where it is (the temp name).
* fix(fileio): do not remove destination file before rename (#42152)Qiming zhao2026-10-03
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * fix(fileio): do not remove destination file before rename Problem: `vim_rename()` unconditionally removes the destination file `to` via `os_remove(to)` before calling `os_rename(from, to)`. If Neovim is killed or a crash occurs between `os_remove()` and `os_rename()`, the destination file is lost. For example, during `shada_write_file()`, `main.shada` is deleted before being replaced by `main.shada.tmp.a`, which can lead to silent loss of command history, marks, and registers. Furthermore, if `os_rename()` subsequently fails, the destination was already destroyed. Solution: In Neovim, `os_rename()` uses `uv_fs_rename()`, which atomically replaces existing destination files on both POSIX (`rename(2)`) and Windows (`MoveFileExW(..., MOVEFILE_REPLACE_EXISTING)`). Attempt `os_rename(from, to)` first. Only if it fails (e.g. cross-device link) and copying is required as a fallback, remove `to` before `vim_copyfile()`. Fixes #41940 AI-assisted * fix(fileio): retry rename after removing destination Retry the native rename after successfully removing the destination so a directory can still replace an existing file. Keep the initial rename attempt before removal and the existing copy fallback. AI-assisted
* fix(restart): missing 'filetype' after session load #41975Justin M. Keyes2026-09-18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: A buffer loaded (`bufload()`) from a (`BufAdd nested=false`) autocmd does not trigger `BufReadPost` (which does filetype-detection). Then 'filetype' is never set. A session file does `:badd` on all buffers: :badd +0 a.md :badd +0 b.md :edit a.md If a mystery plugin(?) loads the buffers via `bufload()` from the `nested=false BufAdd` autocmd triggered by those `:badd` calls, filetype detection never happens. Solution: When `BufReadPost` was skipped and 'filetype' is empty, retry the `filetypedetect` augroup. `do_write` uses a similar approach: https://github.com/neovim/neovim/blob/9047ee1460ede5aa8b0f0807c15bb554f5dcb8f1/src/nvim/ex_cmds.c#L1964-L1967 Note: Intentionally not using ":filetype detect". - It silently re-enables detection when the user turned it off. - It runs `do_modelines` again (redundant). - It loses the `<afile>` name.
* feat(multicursor): MC HAMMER #41587Justin M. Keyes2026-09-01
| | | | | | | | | | | | | | | | | | | | | Other (squashed) commits: fix(tui): emit ui_send output atomically with the frame Problem: tui_ui_send() writes directly to the TTY, bypassing the output buffer. Sequences sent via nvim_ui_send() (e.g. kitty multiple-cursors, or visual-dot-repeat) always arrive in a separate TTY write from the frame they were computed for. This manifests as "tearing", or e.g. in the case of multicursor the terminal renders text with stale cursor overlays. Solution: - tui_ui_send(): while a frame is being assembled (pending invalid regions or buffered output), buffer instead of writing directly. - Out-of-frame sends (tty queries, clear-on-disable) still write immediately. - mcursor.lua: emit the terminal-cursor update at the end of the redraw cycle (`on_end`, when screen positions are final) instead of vim.schedule().
* fix(cwd): flicker after temp context-switch #41561 #41582Justin M. Keyes2026-08-31
| | | | | | | | | | Problem: `shorten_fnames()` always redraws the statusline/tabline, even if no buffer name changed. Since b296666e a temp context-switch (`win_execute()`, `vim._with{win=}`) restores the CWD, so every such switch flickers the message area. Solution: Redraw only if `shorten_buf_fname()` actually changed a name.
* fix(cwd): E812 when a message opens a window during a file read #41458Justin M. Keyes2026-08-23
| | | | | | | | | | | | | | | | | | | | | Problem: When ui2 is enabled, opening an already-open file in another Neovim instance results in the error `E812: Autocommands changed buffer…`. Analysis: On E812 the file is not loaded. The default SwapExists handler notifies `W325: Ignoring swapfile…`, and ui2 shows that message by opening a window, which is a temp context switch. `ctx_dirs_restore()` re-shortens every buffer name on the way out, and `shorten_buf_fname()` always frees and reallocates `b_sfname`. `readfile()` aliases `b_fname` across `check_need_swap()` and compares the pointer to detect a rename. Regression by b296666e419c, which replaced the `cs_save_sfname` restore (that kept curbuf's pointer) with `shorten_fnames(true)`. Solution: Keep the allocation in `shorten_buf_fname()` when the short name is unchanged. Pointer stability is what the E200/E201/E812 guards actually assert.
* refactor(path): pathcmp() #41035tao2026-08-07
| | | | | | | | | | | | | | | | | | | | | | Problem: Redudant code Solution: Add `path_fold_char()` to normalize path sep. Refactor `pathcmp()` and `path_fnamencmp()` into `path_cmp`. | feature | pathcmp | path_fnamencmp | path_cmp(now) | | ------------------------ | -------------- | -------------- | ------------- | | case folding | `mb_toupper()` | `utf_fold()` | `utf_fold()` | | consults fileignorecase | ✅ | ✅ | `ic` param | | `maxlen` | ✅ | ✅ | ✅ | | `/` == `\` | ✅ | ✅ | ✅ | | MSWIN drive letter | ❌ | ✅ | ✅ | | sep affects sorting | ✅ | ❌ | ✅ | | ignores a trailing slash | ✅ | ❌ | ✅ | Refactor `path_fnamecmp` and `path_full_compare` into `path_equal`, with flags controlling "no filesystem" comparison (i.e. `path_cmp`), env variables expansion, absolute path resolution and filesystem access.
* fix(progress): ins-compl progress-msg during pum #41226Justin M. Keyes2026-08-07
| | | | | | | | | Problem: The insert-mode completion progress-message is in "running" state while the user is selecting an item. That is noisy and unwanted UX; it was only intended for the "Scanning..." task. Solution: End the progress-msg just after `ins_compl_show_statusmsg`.
* fix(messages): dangling progress-messages #41222Justin M. Keyes2026-08-07
| | | | | | | | | | Problem: Some builtin features emit progress-messages which never "complete". - On failure, `:write` does not complete the progress-msg it started. - ins-completion never ends its "Scanning..." message. Solution: - `buf_write()` emits "failed" status on failure. - `ins_compl_stop()` ends the completion one.
* fix(messages): :read starts a "bufwrite" progress #41219Justin M. Keyes2026-08-07
| | | | | | | | | | | Problem: filemess() treats an empty suffix as "a buffer write is starting", but readfile() calls it that way too. So ":read" (and ":edit", …) opens a `nvim.bufwrite "<file>"` progress that is never completed. Users of e.g. ghostty will see a stuck "progress" spinner. Solution: Only `buf_write()` starts the progress, via `filemess_progress()`.
* feat(options): lua closure/function optionsJustin M. Keyes2026-07-31
| | | | | | | | | | | | | | | Problem: Cannot assign Lua functions/closures to "func" ('completefunc', 'tagfun', …) or "expr" ('foldexpr', 'indentexpr', …) options. Solution: - Store "func"/"expr" options as `Callback` instead of string. - Delete oceans of copy-pasted code. - BREAKING: LuaRef returned via RPC/Vimscript is now represented as `"<Lua N: file:line>"` (like what `:map` shows) instead of `nil`. - Note: `man.vim` still uses `v:lua` string, bc it's a vimscript ftplugin. Helped-by: Lewis Russell <lewis6991@gmail.com>
* refactor(options): drop OptVal, use ObjectJustin M. Keyes2026-07-29
| | | | | | | | | | | | | Problem: The object subsystem has an intermediate representation for no real reason. Besides the code cost, this also adds an extra (api <=> OptVal) conversion step, which is a (small) perf cost. Solution: We already have `Object`, so use it instead. - drop `OptVal`, `OptValData`, `OptValType`, and related boilerplate. - add `kObjectTypeUnset`.
* refactor(exmode): Ex-mode as cmdwin + Lua #40991Justin M. Keyes2026-07-27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: POSIX-compatible Ex-mode requires special-cases all over the codebase to match various quirks that don't actually matter to users. - The main utility of *interactive* Ex-mode is its REPL behavior, and that can be achieved with `cmdwin`, which also gains extra UX benefits. - The main utility of *non-interactive* `nvim -es` is for shell scripting, where Ex-mode quirks are mostly unhelpful (e.g. the "Entering Ex mode" message). Solution: - Reimplement *interactive* Ex-mode as a "persistent, insert-mode cmdwin" in Lua. - "nvim -e/-E" is simply an alias to "gQ". - Reframe *non-interactive* Ex-mode (`nvim -es`) as "script mode". - Drop POSIX Ex-mode quirks. Improvements: - "nvim -V1 -es" output ends with a final newline! - "nvim -V1 -es" no longer shows the "Entering Ex mode" msg. (This was pointless noise, unwanted for scripting purposes.) - stdin is no longer typeahead. Scripts (":lua io.read()") can read stdin as data. - Empty line is a no-op: a stray blank line no longer moves the cursor (deviates from POSIX ex "+1"), no longer exits 1 at EOF (E501). Preserved behavior: - cursor starts at "$" - mode()=="cv" (for non-interactive) - multiline commands (:append/:function/heredoc pull continuation lines) - bare-range print - :print=>stdout - -V1=>stderr - CRLF input - continue-after-error and exit codes Dropped (regressed) POSIX behavior (non-interactive): - Event loop only ticks while/between commands, not while blocked waiting for a stdin line. - ":g/pat/visual...Q" - input()/getchar()/":s/x/y/c" no longer consume stdin lines as answers: Nvim stops at end-of-input, skipping the rest of the script, exit 0. Use ":lua io.read()" instead. - If users care about this they should use interactive Ex-mode (`gQ`). - ":@r" stops at end of the register instead of continuing to read cmdline input from stdin.
* fix(buffer): name becomes empty when it is the cwd #40980Barrett Ruth2026-07-26
| | | | | | | | | Problem: Shortening the name of a buffer whose full name is the current directory + path sep yields empty string -> buf unnamed. This doesn't interact well with things like `:mksession`, which for example could `:badd` with no arg -> E471. Solution: Keep the full path when shortening yields an empty name, as `path_try_shorten_fname()` already does.
* feat(options): schema, "dict" options, messagesJustin M. Keyes2026-07-24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: Options parsing is still painful for dict-style options. Solution: schema-maxxing => better `opt:get()` (will be the basis for `vim.o()`), unified (and more-detailed) err msgs. - Drop bespoke structure-builder in `_core/options.lua`. - Define `schema` for all non-primitive options (except 'guicursor' and statusline-style options); generate reified keysets `OptKeyDict`). - Generate 'fillchars' => `fcs_tab`, 'listchars' => `lcs_tab`. - `nvim_set_option_value`: - Return the improved structures. Also from `vim.opt.x:get()`. - Eliminate api <=> lua roundtrip, centralize option structure handling. - Improve/unify errors. - Bump ERR_BUFLEN 80 → 256 so the "one of" list isn't truncated. - Eliminate old 'diffopt' order-dependence (`iwhiteall` before `iwhite`) Error samples: Typed-key path (opt_strings_check → diffopt/mousescroll/breakindentopt): E474: Unknown item 'foo' E474: 'context' requires a number E474: 'ver' number is out of range E474: 'algorithm' must be one of: myers, minimal, patience, histogram E474: 'filler' does not take a value Related: - #31084 - #34661 - #31820 - #14739 - #20107 - fix #18875 - :get() returns `{ sbr = true, shift = '3' }` (reified-keyset) instead of `{'sbr', 'shift:3'}` - Setting via table now works too. `object_as_optval_for` `is_map` now recognizes struct options. - fix #30296 - instead of `E474: Invalid argument`, errors now look like: ``` E474: Invalid value 'x', expected one of: single, double: ambiwidth=x E474: Unknown item 'foo': diffopt=foo E474: 'context' requires a number: diffopt=context:x ``` simplify `win_float_parse_option` from #26799.
* fix(filetype): trigger FileType after BufReadCmd #40679Barrett Ruth2026-07-13
| | | | | | | | | | | | | Problem: A successful `BufReadCmd` can leave an existing `filetype` without rerunning its `FileType` setup, so state cleared during reload may not be restored. This also causes `:edit`/reload syntax `directoryDirectory` groups to not be reapplied. Solution: After `BufReadCmd` handles a read, trigger `FileType` for the existing `filetype` if no `FileType` event fired during the read.
* fix(path): normalize separators (slashes) #39155tao2026-07-12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: Continue separators normalization, and try to keep it at the nvim <-> external boundary, e.g., `fn.xxx`, `api.xxx`, `:xxx` Solution: some key changes - normalize `$HOME-windows` - normalize entry points of changing directory - `nvim_set_current_dir()`, `chdir()` - normalize the named pipe - `--listen` arg, `--server` arg, `:restart` - `serverstart()`, `sockconnect()`, `serverstop()` - make `expand()` respect 'shellslash' again - clean up `did_set_shellslash` - replace `forward_slash` with `TO_SLASH` - remove obsolete `TMP_PATHSEPSTR` - remove `slash_adjust` in `do_autocmd_dirchanged`? - make `fnamemodify()` always return `/` (except when substituting separators via `:s`, `:gs` ?) Note: - these funcs still apply `slash_adjust` on return, as before: `:pwd`, `chdir()`, `exepath()`, `getcwd()` - these funcs alwarys return `/`, unlike before the normalization PRs - `getcompletion()`, `finddir()`, `findfile()` Also - clean up code, comments, formatting and tests - move `TO_SLASH` from `f_chdir` to `changedir_func` - move `TO_SLASH` from `f_bufadd` to `buflist_new` Co-authored-by: Justin M. Keyes <justinkz@gmail.com>
* refactor(insert): rename edit.c => insert.c #40705Justin M. Keyes2026-07-12
| | | | | | | | | | Problem: - `edit.c` is an unnecessarily misleading and less-discoverable name than `insert.c`. - Numerous insert-mode related things are named with a `ins_` prefix. - There is already a `insexpand.c` module... Solution: Rename `edit.c` => `insert.c`.
* refactor(input): rename getchar.c => input.c #40698Justin M. Keyes2026-07-12
| | | | | | | | | | | | Problem: `getchar.c` is a quirky name and doesn't align with our existing `os/input.c` and `tui/input.c` modules, which encompass the same topic at different layers. Solution: Rename `getchar.c` => `input.c` for discoverability. Introduce `dialog.c` for functionality related to showing confirm prompts, dialogs, etc.
* refactor(ctx): drop aucmd_prepbuf/aucmd_restbuf #40692Justin M. Keyes2026-07-11
|
* refactor(os): deduplicate console/fd boilerplate #40509Justin M. Keyes2026-06-30
| | | | | | | | | Problem: Scattered, redundant boilerplate for Windows console/fd plumbing. Solution: - Add os_dup_cloexec() - Add os_reattach_console_stdio(). - Use os_open_conin_fd().
* fix(stdpath): avoid DOS 8.3 filenames for "cache", "run" #40201tao2026-06-12
| | | | | | | | | | | | Problem: stdpath() may return a DOS 8.3 "shortened" filename, because Windows truncates long usernames into `6ch~N` names in `TEMP/TMP` env vars. We don't want to "leak" them into Nvim. Solution: For "run", pass `true` to `vim_FullName` to expand 8.3 filenames. For "cache", call `os_realpath` to expand 8.3 filenames. Co-authored-by: Justin M. Keyes <justinkz@gmail.com>
* vim-patch:9.2.0506: home_replace() function can be improved (#39925)zeertzjq2026-05-21
| | | | | | | | | | | | | | | | Problem: home_replace() function can be improved Solution: Refactor home_replace() to return the length of the string (John Marriott). In addition: - in function set_b0_fname() move ulen into the block where it is used. - In function findswapname() rework logic around displaying "swap file already exists" dialogue so that literal message text is set once. closes: vim/vim#20249 https://github.com/vim/vim/commit/a0931a90eeee6692556f330b5ba1fb413f9ea85d Co-authored-by: John Marriott <basilisk@internode.on.net>
* refactor: simplify aucmd_restbuf usage #39879Justin M. Keyes2026-05-19
| | | | | | | | Problem: `aucmd_restbuf` must be guarded in case `aucmd_prepbuf` wasn't called. Solution: Update `aucmd_restbuf` to be a no-op if `aucmd_prepbuf` wasn't called. This requires `aco` to be zero-initialized.
* fix(style): some clang-tidy 22 fixesbfredl2026-05-11
| | | | | | | | | | | | | | | | | | | | | | CI currently uses clang-tidy 20, but this affects local builds and CI is going to be upgraded sooner or later. Some remaining systematic issues: - clang-tidy warns agains any atoi() or atol() usage (because of no error handling) - functions which takes (char *fmt, char *only_string_arg) and expect fmt to contain exactly one "%s" usage. - error: initializing non-local variable with non-const expression depending on uninitialized non-local variable (cppcoreguidelines-interfaces-global-init) This is a much worse problem in C++ (hence C++ core guidelines) where initialization is intermingled with arbitrary code execution. I "think" in plain C, the linker will either resolve all these deterministically or barf an error. But with some restructuring we could make all static initialization actually static..
* build: strncat warning in buf_write #39684phanium2026-05-08
| | | | | | | | | | | | | | | | | | | | | To make gcc happy ``` src/nvim/bufwrite.c: In function ‘buf_write’: src/nvim/bufwrite.c:1674:5: warning: ‘strncat’ specified bound depends on the length of the source argument [-Wstringop-overflow=] 1674 | strncat(msg_id + 14, IObuff, strlen(IObuff) - 1); | ^ src/nvim/bufwrite.c:1674:34: note: length computed here 1674 | strncat(msg_id + 14, IObuff, strlen(IObuff) - 1); | ^ src/nvim/fileio.c: In function ‘filemess’: src/nvim/fileio.c:137:5: warning: ‘strncat’ specified bound depends on the length of the source argument [-Wstringop-overflow=] 137 | strncat(msg_id + 14, IObuff, strlen(IObuff) - 1); | ^ src/nvim/fileio.c:137:34: note: length computed here 137 | strncat(msg_id + 14, IObuff, strlen(IObuff) - 1); | ^ ```
* fix(messages): disallow source="nvim" progress msg #39315luukvbaal2026-05-06
| | | | | | | | | Problem: Internal progress messages use the "nvim" source (since ff68fd6b), plugins shouldn't be allowed to set the progress message source to "nvim". The message ID used for internal progress messages is not identifiable as such. Solution: Disallow setting opts->source to "nvim" with nvim_echo(). Refactor msg_progress() and callees to bypass nvim_echo(). Prepend message id for internal progress messages with "nvim.".
* fix(messages): "progress" kind for busy messages #39280luukvbaal2026-04-21
| | | | | | | | | | Problem: The "Scanning:" completion, bufwrite, and indent (there may be more) messages which indicate progress can use the "progress" kind for their msg_show event. Indent message does not have a kind. Solution: Emit these messages with the "progress" kind. Set the message id to the replaced kind so that a UI knows to replace it (and to provide a migration path in case a UI was distinguishing these messages for whatever reason).
* build: update clang v21, fix warningsdundargoc2026-04-14
| | | | | - `src/nvim/ex_cmds_defs.h`: use "U" instead of "u" per `readability-uppercase-literal-suffix`
* vim-patch:9.2.0271: buffer underflow in vim_fgets() (#38575)zeertzjq2026-03-30
| | | | | | | | | | | Problem: buffer underflow in vim_fgets() Solution: Ensure size is always greater than 1 (Koda Reef) https://github.com/vim/vim/commit/3c0f8000e152ceb02619249f5ebf06d6ffe9c8d8 This currently never happens in Nvim. Co-authored-by: Koda Reef <kodareef5@gmail.com>
* vim-patch:9.2.0140: file reading performance can be improved (#38266)zeertzjq2026-03-12
| | | | | | | | | | | | | | | | | Problem: Reading large files is slow because UTF-8 validation and newline scanning are performed byte-by-byte. Initial file loading also triggers listener and channel processing. Solution: Use memchr() for SIMD-optimized newline scanning, implement word-at-a-time ASCII skipping during UTF-8 validation using a bitmask, skip listener/netbeans/channel notifications when the ML_APPEND_NEW flag is set during readfile() (Yasuhiro Matsumoto). closes: vim/vim#19612 https://github.com/vim/vim/commit/2ca96b09d751c35189dd587d9b201e2aeb5559c0 Co-authored-by: Yasuhiro Matsumoto <mattn.jp@gmail.com> Co-authored-by: NRK <nrk@disroot.org>
* vim-patch:9.2.0024: Reading files with very long lines crashes with a segfaultzeertzjq2026-02-19
| | | | | | | | | | | | | | | | | | | | Problem: Reading files with lines approaching MAXCOL length crashes with segfault due to colnr_T overflow. Solution: The split check 'linerest >= MAXCOL' fired too late because linerest could grow by up to 'size' bytes before the next check. Change threshold to 'linerest >= MAXCOL - size' to ensure the line passed to ml_append() stays within colnr_T range. Note: supported by AI claude fixes: vim/vim#17935 closes: vim/vim#18953 closes: vim/vim#19332 https://github.com/vim/vim/commit/6cc291da063e7d9a74a6337d6a80af2b3bcbb5a9 Co-authored-by: Christian Brabandt <cb@256bit.org>
* vim-patch:9.1.2128: Heap use after free in buf_check_timestamp()Sean Dewar2026-02-03
| | | | | | | | | | | | Problem: heap UAF if autocommands from reloading a file changed outside of Vim wipe its buffer. Solution: Validate the bufref after buf_reload (Sean Dewar) closes: vim/vim#19317 https://github.com/vim/vim/commit/392b428d1239e963020b73682cd03f17ffb538b3 Co-authored-by: Sean Dewar <6256228+seandewar@users.noreply.github.com>
* refactor(fileio.c): avoid downcasting in {read,write}_eintr() (#37323)zeertzjq2026-01-09
|
* vim-patch:9.1.1483: not possible to translation position in buffer (#37099)zeertzjq2025-12-26
| | | | | | | | | | | | | | | | | | Problem: not possible to translation position in buffer Solution: use _() macro to mark the output as translatable (Emir SARI) Row/Column indicator separator is currently not customizable. Some languages have a space after the comma as the usual practice, plus this would help translators use a custom separator like colons if necessary. Additionally, after a save, the line and the byte indicator is also hardcoded, this enables i18n for that as well. closes: vim/vim#17608 https://github.com/vim/vim/commit/81f9815831c7b3fc9ea1e0164e27e12f321ff2c3 Co-authored-by: Emir SARI <emir_sari@icloud.com>
* vim-patch:9.1.0974: typo in change of commit v9.1.0873Jan Edmund Lazo2025-12-24
| | | | | | | | | | | | | Problem: typo in change of commit v9.1.0873 (Christ van Willegen) Solution: Add back the square brackets (John Marriott) closes: vim/vim#16340 https://github.com/vim/vim/commit/df4b3ca5dc26689d866c0a743ab835917f4cd6b7 Co-authored-by: John Marriott <basilisk@internode.on.net>
* vim-patch:partial:9.1.0973: too many strlen() calls in fileio.cJan Edmund Lazo2025-12-24
| | | | | | | | | | | | | | | Problem: too many strlen() calls in fileio.c Solution: refactor fileio.c and remove calls to STRLEN(), check for out-of-memory condition in buf_check_timestamp() (John Marriott) closes: vim/vim#16306 https://github.com/vim/vim/commit/14ede1890f820d119ad521a4cfc2ef4beee5b4d3 Full port requires v8.2.0988 to update readdir_core(). Co-authored-by: John Marriott <basilisk@internode.on.net>
* refactor(messages): encapsulate msg_delay logicJustin M. Keyes2025-12-20
| | | | see also 9bbbeb60e355844780db0aef955e860d68ac0342
* test(messages): skip os_delay during testsJustin M. Keyes2025-12-20
| | | | | | | | | | | Problem: Tests that trigger `os_delay` messages may take 1-3 seconds, wasting build/CI time, since this serves no purpose in tests. Solution: - Introduce `msg_delay` for cases where `os_delay` is being used as a "UI feature". - Skip `msg_delay` in tests.
* vim-patch:partial:8.1.1939: code for handling v: variables in generic eval ↵Jan Edmund Lazo2025-10-04
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | file (#35968) Problem: Code for handling v: variables in generic eval file. Solution: Move v: variables to evalvars.c. (Yegappan Lakshmanan, closes vim/vim#4872) https://github.com/vim/vim/commit/e5cdf153bcb348c68011b308c8988cea42d6ddeb Remove direct reference to "vimvars" for following functions: - assert_error() - get_vim_var_nr() - get_vim_var_list() - get_vim_var_dict() - get_vim_var_str() - set_cmdarg() - set_reg_var() - set_vcount() - set_vexception() - set_vthrowpoint() - set_vim_var_bool() - set_vim_var_dict() - set_vim_var_list() - set_vim_var_nr() - set_vim_var_special() - set_vim_var_string() - set_vim_var_type() Reorder functions based on v8.2.4930 for eval_one_expr_in_str() and eval_all_expr_in_str(). Co-authored-by: Bram Moolenaar <Bram@vim.org>
* vim-patch:8.2.0853: ml_delete() often called with FALSE argumentJan Edmund Lazo2025-08-20
| | | | | | | | | Problem: ml_delete() often called with FALSE argument. Solution: Use ml_delete_flags(x, ML_DEL_MESSAGE) when argument is TRUE. https://github.com/vim/vim/commit/ca70c07b72c24aae3d141e67d08f50361f051af5 Co-authored-by: Bram Moolenaar <Bram@vim.org>
* refactor(build): remove INCLUDE_GENERATED_DECLARATIONS guardsbfredl2025-08-14
| | |