aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim
Commit message (Collapse)AuthorAge
...
* | vim-patch:9.2.0926: filetype: Business Central files are not recognized (#41230)Torben Leth2026-08-09
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: filetype: Business Central files are not recognized Solution: Add filetype detection logic for *.al files to detect perl or use either perl or al filetype (Torben Leth). Reference: https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-dev-overview closes: vim/vim#20975 Supported by AI. https://github.com/vim/vim/commit/9b41cf6386bc0afd1bf5eca396adfdd488e617d0
* | feat(lsp): pass target buffer to `reuse_client` predicate #41163Mike J McGuirk2026-08-07
| | | | | | | | | | | | Problem: The reuse_client predicate does not pass the target buffer, preventing decisions from being truly made per buffer. Solution: Pass the target buffer.
* | fix(terminal): spawn in effective CWD #41211Justin M. Keyes2026-08-07
| | | | | | | | | | | | | | | | | | Problem: `:terminal` does not respect the invocation-time CWD. This wasn't noticeable with `:lcd` because the window-local CWD gets applied to the new terminal buffer. But it is noticeable with `:bcd`. Solution: Specify `cwd` in the job spec.
* | feat(cwd)!: :lcd! (bang), rearrange :bcd/:lcd/… scope precedence #41194Justin M. Keyes2026-08-07
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: - buf-local CWD scope is lower priority than :lcd, which is weird. ``` win > buf > tab > global ``` - No way to clear current CWD at a given scope. Solution: - Rerrange scope precedence to: ``` buf > win > tab > global ``` - Introduce "bang" variants (`:bcd!`/`:lcd!`/`:tcd!`) which clears the local CWD for the given scope.
* | vim-patch:9.2.0920: filetype: json-ld files are not recognizedzeertzjq2026-08-07
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: filetype: json-ld files are not recognized Solution: Detect *.jsonld files as jsonld filetype, include filetype, indent and syntax plugins (Bogdan Barbu). Reference: https://www.w3.org/TR/json-ld11/ closes: vim/vim#20954 https://github.com/vim/vim/commit/a1e2198a2ca8bbddcad69ade8629f371bcb4cf1f Co-authored-by: Bogdan Barbu <l4b.bogdan.barbu@gmail.com>
* | feat(vim._with): `keepcwd`Justin M. Keyes2026-08-06
| |
* | feat(cwd): support explicit chdir (:bcd/:tcd/…) in temp contextJustin M. Keyes2026-08-06
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: - Explicit `:bcd` (etc.) persists from `nvim_buf_call()` but not from an autocmd handler targeting a hidden buf (`LspAttach`, `TermRequest`, …), which needs a `vim.schedule()` workaround. - `vim._with()` is supposed to work as a "sandbox", discarding side-effects, but it leaks CWD changes: `:lcd` from a `win` context, any chdir from a visible-buffer context. Solution: - Explicit :cd/:tcd/:bcd during a temp context persists by default. - "Ambient" directory changes ('autochdir', existing win-local CWD, etc.) are still undone, as before. - Add `kCtxKeepDirs`: snapshot/restore the target's full CWD state (w/b/tp-local, global, cwd). Used by `vim._with()` and `'inccommand'`, which must not leak state.
* | refactor(vim.fs): slug() minor cleanupJustin M. Keyes2026-08-06
| |
* | docs: misc, :bcd, slug()Justin M. Keyes2026-08-06
| |
* | feat(fs): vim.fs.normalize{plain:boolean} #41127Olivia Kinnear2026-08-05
| | | | | | | | | | | | `opts.plain=true` does not expand tildes in addition to environment variables, unlike `opts.expand_env=false`. `opts.expand_env=false` is soft-deprecated.
* | fix(ui2): pager handling #41179Justin M. Keyes2026-08-05
| | | | | | | | | | | | | | | | - Avoid shared state. Pass `focus` to set_pos()/expand_msg() instead of a shared `pager_focus` flag: the flag is only cleared when set_pos() actually enters the pager, so ":messages" from inside the pager left it set. - pager_shown(): the pager window is invalid after leaving it with "q". - Reuse pager_shown() in expand_msg().
* | fix(ui2): do not steal focus when consecutive cmds emit messages #41062Erdiansyah2026-08-05
| | | | | | | | | | | | | | | | | | | | Problem: A message emitted while a previous expanded message is still visible opens the pager and enters it, moving focus away from the buffer window without an explicit request (#41061). Solution: Only enter the pager when it was explicitly requested ("g<", :messages, or entered from the expanded cmdline). An unfocused pager is dismissed by the cmdline key handler, which stays armed across the cmdline and no longer dismisses on non-typed keys (#39221).
* | feat(lua): vim.fs.slug() #41005Willaaaaaaa2026-08-04
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: Several subsystems need to derive a short, filesystem-safe identifier from an arbitrary path, and each reinvents it ad-hoc: - `'undodir'` and `swapfiles` encode the full path into a single filename, which may exceed filesystem length-limits. - `:connect ssh://` needs the SSH ControlPath socket name to stay under the 104-byte `sun_path` limit on macOS; today the path overflows it. - the upcoming :terminal state dir. - arbitrary plugin purposes. Solution: Provide `vim.fs.slug()`, which generates a bounded, one-way filename from an arbitrary string. The input is normalized so equivalent paths produce the same result. An 8-char hash is appended for uniqueness
* | fix(:bcd): do not "inherit" buffer-local dirJustin M. Keyes2026-08-04
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: Buffer-local CWD (:bcd) is "sticky", similar to window-local CWD (:lcd). But this contradicts one of its main benefits: per-buffer "project root" for LSP, OSC7. Other problems: - A buffer created with :edit/:enew/:new silently inherits b_localdir (and b_prevdir) from the previous buffer. - curbuf_reusable() refuses to recycle a scratch buffer that has `b_localdir`. - After :new/:vnew/:tabnew the CWD sticks to previous buffer's `b_localdir` even though the new curbuf has none, so :new is not equivalent to ":split | enew", and getcwd() disagrees with haslocaldir(). - Requires "which buffer spawned this buffer" semantics that no other buffer-local state has. Solution: Drop sticky/inherit behavior of buffer-local CWD (:bcd). - do_ecmd: always apply the new curbuf's dir (`fix_current_dir`), like `do_autochdir` already does. :tabnew from a :bcd buffer now reverts to global CWD (and fires DirChanged), same as :tabnew from a :lcd window. - curbuf_reusable(): recycling a scratch buffer frees its b_localdir. To get sticky/inherit behavior of CWD, use `:lcd`.
* | fix(cwd): validate getcwd(…, -1)Justin M. Keyes2026-08-04
| |
* | refactor(editor): cleanup change-directory (:bcd) logicJustin M. Keyes2026-08-04
| |
* | feat(editor): `:bcd` changes buffer-local directorysaher2026-08-04
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: No way to set a buffer-local directory. Use-cases: - "Root dir" for LSP (and the "project" concept). - `:terminal` OSC 7 Solution: Add `:bcd` command. - Extend `getcwd()` to take a third arg; `getcwd(-1, -1, bunfr)` returns the buffer-local working directory. - Buffer-local directories have less priority than window-local ones, and more priority than tab-local ones. Co-authored-by: Justin M. Keyes <justinkz@gmail.com>
* | Merge #41114 from epithet/default-ruler-as-expressionJustin M. Keyes2026-08-04
|\ \
| * | refactor(ruler)!: replace C implementation with 'rulerformat' expressionSébastien Hoffmann2026-08-04
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: The default 'ruler' is implemented in C instead of the 'statusline' DSL. Solution: Replace the C implementation with a default 'rulerformat' expression. This is a continuation of #1248 and #33036. Advantages: - configuration is more discoverable, the default being a useful example - users and plugins can augment the default - code reuse and less C code to maintain - ui2: due to the use of an item group with `minwid`, it can expand instead of truncating when the content gets too long, which is particularly useful for locales with long translations of Top/Bot/All Implementation details: As is the case for 'statusline', when trying to set 'rulerformat' to an empty string, the default expression is restored instead, mimicking how previously the default C implementation would have been activated. Just like before, `:set rulerformat=` and `:set rulerformat&` have the same effect, and the ruler is disabled with `:set noruler`. The default expression uses an item group with `%=`, unlike the fallback in the previous default statusline `%-14.(%l,%c%V%) %P`, because the total width and how it is configured is immediately clear without documentation, it is a more useful pattern in general that works when both sides have flexible width, and it also works for vim, which is useful for configuration sharing/reuse. A truncation marker `%<` is added at the end to mimic how at small screen widths, the scroll percentage would disappear first, so that the cursor position can remain fully visible. BREAKING CHANGES: - `&rulerformat` can no longer be set to an empty string - ui2: the default ruler is no longer of fixed width, but can expand - at very small screen widths (< 36 columns) - ui2: it will no longer try to shrink white-space before truncating - it truncates gradually from the right, whereas previously, the scroll percentage would disappear all at once - l10n can no longer add a space after the comma between line and column (this was only done for one language: Ukrainian)
| * | fix(ruler)!: consistent width in last line and statuslineSébastien Hoffmann2026-08-04
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: Traditionally, the ruler in the last line is one cell shorter than in the statusline, leaving the last cell of the screen blank. According to code comments, this is in order to prevent unwanted scrolling on "some" (unspecified, but presumably ancient) terminals. Berkeley vi is more specific in its `vs_modeline` function: dumb terminals with hardware scroll, SunOS 4.1.1 and Ultrix 4.2 curses. (n)curses still has a similar limitation in `(w)addstr`, but apparently only for historical reasons. Maintaining the different widths leads to awkward inconsistencies when the ruler is configured with 'rulerformat', except for the special case where it contains a top-level `%=`. Shifting the ruler in the last line to the left would be a solution, but the empty cell at the end doesn't seem to be relevant anymore. Solution: extend the ruler in the last line all the way to the right edge of the screen, just like in the statusline. The exact same amount of place will be available to the rest of the UI as before. BREAKING CHANGE: - the default ruler width is now 18 cells - the last cell of the screen is no longer empty Closes #41076
* | | docs(api): buffer columns are byte indices #41137Barrett Ruth2026-08-04
| | |
* | | fix(lsp): ignore (and log once) invalid documentSelector globs #41055Rocco Vaccone2026-08-04
|/ / | | | | | | | | | | | | | | | | | | | | | | | | Problem: Client:_get_registrations() errors if a documentSelector pattern is not a valid glob (e.g. "**/**.dart" from dartls). The error discards already-matched registrations and propagates to supports_method() and the client/registerCapability handler, disabling capabilities unrelated to the offending pattern. Solution: Skip invalid globs. Treat them as non-matching, and log once per client. (Similar approach was taken for filewatcher globs: 4d9e5acfb5ee081b5b0761205c8a8c36ed7e49e5)
* | fix(lsp): only send `didSave` to clients attached to the buffer (#41126)Maria Solano2026-08-03
| |
* | fix(treesitter): make TSHighlighter.new() idempotent for an active buffer #41090Freddie Haddad2026-08-02
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: Calling vim.treesitter.start() a second time on a buffer that already has an active TSHighlighter creates a brand new instance instead of reusing it, whether the parser tree is unchanged (e.g. calling start() twice) or different (e.g. switching languages). Either way the old instance is silently discarded without calling :destroy() on it, so its on_bytes/on_changedtree/on_detach callbacks stay registered and its buffer-local state (spelloptions, decoration namespace) is never restored, both leaking indefinitely for an orphaned instance that nothing references anymore. Solution: Return the existing instance when TSHighlighter.active[source] is already set for the same parser tree, instead of unconditionally constructing a new one. When the tree differs instead (e.g. a language switch), destroy() the old instance first, matching stop() semantics, before constructing the new one.
* | Merge #41106 from altermo/selection-refactor-fixJustin M. Keyes2026-08-02
|\ \
| * | fix(treesitter): handle `&selection=exclusive`altermo2026-08-01
| | |
| * | refactor: combine all visual_selection funcionsaltermo2026-08-01
| | |
* | | vim-patch:9.2.0894: filetype: ed script files not recognised (#41109)zeertzjq2026-08-02
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: filetype: ed script files not recognised. Solution: Add filetype detection for *.ed files and shebang lines, include syntax script and syntax tests. Features of the ed syntax file: - BSD and GNU extensions are supported - Andrew L. Moore's ed extensions are not supported - Rebuild synmenu.vim closes: vim/vim#19602 https://github.com/vim/vim/commit/c28515b9992e52f49c3fd90484601c248c672aec Co-authored-by: Doug Kearns <dougkearns@gmail.com>
* | | docs: func/expr options, misc #41102Justin M. Keyes2026-08-01
|/ /
* | feat(vim.fs): abspath({cwd, plain}) #40597AlexCodesApps2026-08-01
| | | | | | | | | | Adds optional parameters to `vim.fs.abspath`: 1. `cwd` to specify directory akin to `--relative-from` in `realpath(1)`. 2. `plain` disables expansion of tilde (~) in paths.
* | refactor(options): memory managementJustin M. Keyes2026-07-31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: Numerous callers have to manually check optval ownership (i.e. whether, and how, to release) via `is_callback_option`, `option_is_global_local`, etc. This is fragile, hard to use correctly; and if we introduce another optval variant in the future, we'll have to redo all of these careful checks and boilerplate again. Solution: Provide a unified system and use it everywhere: optval_free_owned optval_is_owned optval_own
* | 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>
* docs: misc #41063Justin M. Keyes2026-07-30
|
* vim-patch:partial:b4ae16c: runtime(doc): clarify 'laststatus' effect (#41052)zeertzjq2026-07-30
| | | | | | | fixes: vim/vim#20875 https://github.com/vim/vim/commit/b4ae16ca3ed558e4b2da28bbb05c15fb4fdcd4eb Co-authored-by: Christian Brabandt <cb@256bit.org>
* refactor(zip)!: builtin zip.lua plugin #40846Barrett Ruth2026-07-29
| | | | | | | | | | Problem: The bundled `zip` plugin is implemented in Vimscript, making it harder to maintain and build on with Nvim's Lua runtime infrastructure. Solution: Add an opt-out `zip.lua` browser backed by `nvim.dir`, and disable the legacy Vimscript implementation by moving it to `pack/dist/opt/zip/`. Load it with `:packadd zip`.
* fix(ui2): clear empty cmdline after backspace #41043Nathan Zeng2026-07-29
| | | | | | | | Problem: Cmdline area shows stale ":" after backspacing out of the command line. Solution: Clear the command line for empty commands. Note that `:<CR>` will now clear the command line too.
* docs(health): avoid warnings for dynamic filetypes #41036flatplum2026-07-29
| | | | | | | Problem: Dynamic filetypes defined by `vim.filetype.add` may show health warnings. Solution: Document a way to suppress these harmless warnings.
* vim-patch:9.2.0870: filetype: marko files are not recognized (#41038)zeertzjq2026-07-29
| | | | | | | | | | | | | | | | | Problem: filetype: marko files are not recognized Solution: Detect *.marko files as marko filetype, include a syntax plugin and add syntax tests (Brian Carbone) References: https://markojs.com https://github.com/marko-js/tree-sitter https://github.com/marko-js/language-server https://v5.markojs.com/docs/editor-plugins/ closes: vim/vim#20863 https://github.com/vim/vim/commit/95da62a910809787cc8fdf26b131721359812d8f Co-authored-by: Brian Carbone <brian@briancarbone.com>
* fix(pack): do not write the lockfile when installing from it #41031Evgeni Chasnovski2026-07-28
| | | | | | | | | | | | Problem: Installing plugins during lockfile synchronization always writes the lockfile, even though its content is used during install. This might be a problem if the lockfile (itself or its parent directory) is not writeable (can only be read). Solution: Do not write the lockfile when installing directly from it. This is okay since the `src` and `rev` are used directly from the lockfile and don't change at this step. While potential change in `version` (that must be written to the lockfile) is handled in other code path.
* fix(lsp): multibyte fragment treated as commit char #41019glepnir2026-07-28
| | | | | | | | | | Problem: commit_chars_str() reads a 0x80-0xBF byte as a 2-byte lead, so "\xA9x" makes "x" a commit character. nvim_get_hl() returns a dict, so `#` on it is 0 whether or not the group exists Solution: use vim.str_utf_end() and drop entries that are not one whole character. use next check dict length.
* fix(eval): complete_info() equal, preselect, commit_chars #41022glepnir2026-07-28
| | | | | Problem: complete_info() does not report "equal", "preselect" or "commit_chars". Solution: Report them for the items that set them.
* feat(pos): vim.pos.cursor() without args returns curwin pos #40975Olivia Kinnear2026-07-28
|
* fix(treesitter): incremental selection: "vin" not always starts "v" #41016altermo2026-07-28
|
* vim-patch:9.2.0860: filetype: xilinx design constraint files are not ↵zeertzjq2026-07-28
| | | | | | | | | | | | | | | recognized (#41024) Problem: filetype: xilinx design constraint files are not recognized Solution: Detect *.xdc files as tcl filetype (Wu, Zhenyu) Reference: https://docs.amd.com/r/en-US/ug903-vivado-using-constraints/About-XDC-Constraints closes: vim/vim#20853 https://github.com/vim/vim/commit/247a4cb45e5d9b03e4cb0bbf1eddd0538471649d Co-authored-by: Wu, Zhenyu <wuzhenyu@ustc.edu>