mirror of
https://github.com/neovim/neovim.git
synced 2024-12-19 10:45:16 -07:00
Merge #28747 from justinmk/doc
This commit is contained in:
commit
7c13d1a4a8
@ -114,11 +114,6 @@ the VCS/git logs more valuable. The structure of a commit message is:
|
||||
BREAKING CHANGE: refactor to use Python 3 features since Python 2 is no longer supported.
|
||||
```
|
||||
|
||||
### News
|
||||
|
||||
High level release notes are maintained in [news.txt](runtime/doc/news.txt). A PR is not required to add a news item
|
||||
but is generally recommended.
|
||||
|
||||
### Automated builds (CI)
|
||||
|
||||
Each pull request must pass the automated builds on [Cirrus CI] and [GitHub Actions].
|
||||
|
64
MAINTAIN.md
64
MAINTAIN.md
@ -50,10 +50,9 @@ has a major bug:
|
||||
1. Fix the bug on `master`.
|
||||
2. Cherry-pick the fix to `release-x.y`.
|
||||
3. Cut a release from `release-x.y`.
|
||||
* Run `./scripts/release.sh`
|
||||
* Update (force-push) the remote `stable` tag.
|
||||
* Run `./scripts/release.sh` (requires [git cliff](https://github.com/orhun/git-cliff))
|
||||
* The [CI job](https://github.com/neovim/neovim/blob/3d45706478cd030c3ee05b4f336164bb96138095/.github/workflows/release.yml#L11-L13)
|
||||
will update the release assets and force-push to the `stable` tag.
|
||||
will update the release assets and [force-push to the "stable" tag](https://github.com/neovim/neovim/blob/cdd87222c86c5b2274a13d36f23de0637462e317/.github/workflows/release.yml#L229).
|
||||
|
||||
### Release automation
|
||||
|
||||
@ -72,39 +71,37 @@ inform users of the change.
|
||||
When a (non-experimental) feature is slated to be removed it should:
|
||||
|
||||
1. Be _soft_ deprecated in the _next_ release
|
||||
- Use of the deprecated feature will still work.
|
||||
- This means deprecating via documentation and annotation (`@deprecated`).
|
||||
- Include a note in `deprecated.txt`.
|
||||
- For Lua features, use `vim.deprecate()`. The specified version is the
|
||||
current minor version + 2. For example, if the current version is
|
||||
`v0.10.0-dev-1957+gd676746c33` then use `0.12`.
|
||||
- For Vimscript features, use `v:lua.vim.deprecate()`. Use the same version
|
||||
as described for Lua features.
|
||||
- Use of the deprecated feature will still work.
|
||||
- This means deprecating via documentation and annotation (`@deprecated`).
|
||||
- Include a note in `deprecated.txt`.
|
||||
- For Lua features, use `vim.deprecate()`. The specified version is the
|
||||
current minor version + 2. For example, if the current version is
|
||||
`v0.10.0-dev-1957+gd676746c33` then use `0.12`.
|
||||
- For Vimscript features, use `v:lua.vim.deprecate()`. Use the same version
|
||||
as described for Lua features.
|
||||
2. Be _hard_ deprecated in a following a release in which it was soft deprecated.
|
||||
- Use of the deprecated feature will still work but should issue a warning.
|
||||
- Features implemented in C will need bespoke implementations to communicate
|
||||
to users that the feature is deprecated.
|
||||
- Use of the deprecated feature will still work but should issue a warning.
|
||||
- Features implemented in C will need bespoke implementations to communicate
|
||||
to users that the feature is deprecated.
|
||||
3. Be removed in a release following the release in which it was hard deprecated
|
||||
- Usually this will be the next release, but it may be a later release if a
|
||||
longer deprecation cycle is desired
|
||||
- If possible, keep the feature as a stub (e.g. function API) and issue an error
|
||||
when it is accessed.
|
||||
- Usually this will be the next release, but it may be a later release if
|
||||
a longer deprecation cycle is desired
|
||||
- If possible, keep the feature as a stub (e.g. function API) and issue an
|
||||
error when it is accessed.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
Deprecation Removal
|
||||
┆ ┆ ┆
|
||||
┆ Soft ┆ Hard ┆
|
||||
┆ Deprecation ┆ Deprecation ┆
|
||||
┆ Period ┆ Period ┆
|
||||
────────────────────────────────────────────────────────────
|
||||
Version: 0.10 0.11 0.12
|
||||
────────────────────────────────────────────────────────────
|
||||
Old code Old code Old code
|
||||
+ +
|
||||
New code New code New code
|
||||
```
|
||||
Deprecation Removal
|
||||
┆ ┆ ┆
|
||||
┆ Soft ┆ Hard ┆
|
||||
┆ Deprecation ┆ Deprecation ┆
|
||||
┆ Period ┆ Period ┆
|
||||
────────────────────────────────────────────────────────────
|
||||
Version: 0.10 0.11 0.12
|
||||
────────────────────────────────────────────────────────────
|
||||
Old code Old code Old code
|
||||
+ +
|
||||
New code New code New code
|
||||
|
||||
Feature removals which may benefit from community input or further discussion
|
||||
should also have a tracking issue (which should be linked to in the release
|
||||
@ -133,11 +130,11 @@ Some can be auto-bumped by `scripts/bump_deps.lua`.
|
||||
* [libiconv](https://ftp.gnu.org/pub/gnu/libiconv)
|
||||
* [libuv](https://github.com/libuv/libuv)
|
||||
* [libvterm](https://www.leonerd.org.uk/code/libvterm/)
|
||||
* Downloading from the original source is unreliable, so we use our [mirror](https://github.com/neovim/libvterm) instead.
|
||||
* Downloading from the original source is unreliable, so we use our [mirror](https://github.com/neovim/libvterm) instead.
|
||||
* [lua-compat](https://github.com/keplerproject/lua-compat-5.3)
|
||||
* [tree-sitter](https://github.com/tree-sitter/tree-sitter)
|
||||
* [unibilium](https://github.com/neovim/unibilium)
|
||||
* The original project [was abandoned](https://github.com/neovim/neovim/issues/10302), so the [neovim/unibilium](https://github.com/neovim/unibilium) fork is considered "upstream" and is maintained on the `master` branch.
|
||||
* The original project [was abandoned](https://github.com/neovim/neovim/issues/10302), so the [neovim/unibilium](https://github.com/neovim/unibilium) fork is considered "upstream" and is maintained on the `master` branch.
|
||||
* [treesitter parsers](https://github.com/neovim/neovim/blob/7e97c773e3ba78fcddbb2a0b9b0d572c8210c83e/cmake.deps/deps.txt#L47-L62)
|
||||
|
||||
### Vendored dependencies
|
||||
@ -210,7 +207,6 @@ https://github.com/neovim/neovim-backup
|
||||
* Avoid macOS if an Ubuntu or a Windows runner can be used instead. This is
|
||||
because macOS runners have [tighter restrictions on the number of concurrent
|
||||
jobs](https://docs.github.com/en/actions/learn-github-actions/usage-limits-billing-and-administration#usage-limits).
|
||||
|
||||
* Runner versions:
|
||||
* For special-purpose jobs where the runner version doesn't really matter,
|
||||
prefer `-latest` tags so we don't need to manually bump the versions. An
|
||||
|
@ -79,20 +79,20 @@ DEPRECATED IN 0.9 *deprecated-0.9*
|
||||
- *nvim_get_hl_by_id()* Use |nvim_get_hl()| instead.
|
||||
|
||||
• The following top level Treesitter functions have been moved:
|
||||
*vim.treesitter.inspect_language()* -> |vim.treesitter.language.inspect()|
|
||||
*vim.treesitter.get_query_files()* -> |vim.treesitter.query.get_files()|
|
||||
*vim.treesitter.set_query()* -> |vim.treesitter.query.set()|
|
||||
*vim.treesitter.query.set_query()* -> |vim.treesitter.query.set()|
|
||||
*vim.treesitter.get_query()* -> |vim.treesitter.query.get()|
|
||||
*vim.treesitter.query.get_query()* -> |vim.treesitter.query.get()|
|
||||
*vim.treesitter.parse_query()* -> |vim.treesitter.query.parse()|
|
||||
*vim.treesitter.query.parse_query()* -> |vim.treesitter.query.parse()|
|
||||
*vim.treesitter.add_predicate()* -> |vim.treesitter.query.add_predicate()|
|
||||
*vim.treesitter.add_directive()* -> |vim.treesitter.query.add_directive()|
|
||||
*vim.treesitter.list_predicates()* -> |vim.treesitter.query.list_predicates()|
|
||||
*vim.treesitter.list_directives()* -> |vim.treesitter.query.list_directives()|
|
||||
*vim.treesitter.query.get_range()* -> |vim.treesitter.get_range()|
|
||||
*vim.treesitter.query.get_node_text()* -> |vim.treesitter.get_node_text()|
|
||||
- *vim.treesitter.inspect_language()* -> |vim.treesitter.language.inspect()|
|
||||
- *vim.treesitter.get_query_files()* -> |vim.treesitter.query.get_files()|
|
||||
- *vim.treesitter.set_query()* -> |vim.treesitter.query.set()|
|
||||
- *vim.treesitter.query.set_query()* -> |vim.treesitter.query.set()|
|
||||
- *vim.treesitter.get_query()* -> |vim.treesitter.query.get()|
|
||||
- *vim.treesitter.query.get_query()* -> |vim.treesitter.query.get()|
|
||||
- *vim.treesitter.parse_query()* -> |vim.treesitter.query.parse()|
|
||||
- *vim.treesitter.query.parse_query()* -> |vim.treesitter.query.parse()|
|
||||
- *vim.treesitter.add_predicate()* -> |vim.treesitter.query.add_predicate()|
|
||||
- *vim.treesitter.add_directive()* -> |vim.treesitter.query.add_directive()|
|
||||
- *vim.treesitter.list_predicates()* -> |vim.treesitter.query.list_predicates()|
|
||||
- *vim.treesitter.list_directives()* -> |vim.treesitter.query.list_directives()|
|
||||
- *vim.treesitter.query.get_range()* -> |vim.treesitter.get_range()|
|
||||
- *vim.treesitter.query.get_node_text()* -> |vim.treesitter.get_node_text()|
|
||||
|
||||
• Lua stdlib:
|
||||
- *nvim_exec()* Use |nvim_exec2()| instead.
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
Nvim style guide *dev-style*
|
||||
|
||||
This is style guide for developers working on Nvim's source code.
|
||||
Style guidelines for developers working Nvim's source code.
|
||||
|
||||
License: CC-By 3.0 https://creativecommons.org/licenses/by/3.0/
|
||||
|
||||
|
@ -4,9 +4,9 @@
|
||||
NVIM REFERENCE MANUAL
|
||||
|
||||
|
||||
Nvim theme style guide *dev-theme*
|
||||
Nvim colorscheme guidelines *dev-theme*
|
||||
|
||||
This is style guide for developers working on Nvim's default color scheme.
|
||||
Style guidelines for developing Nvim's default colorscheme.
|
||||
|
||||
License: CC-By 3.0 https://creativecommons.org/licenses/by/3.0/
|
||||
|
||||
@ -17,19 +17,15 @@ Design
|
||||
|
||||
- Be "Neovim branded", i.e. have mostly "green-blue" feel plus one or two
|
||||
colors reserved for very occasional user attention.
|
||||
|
||||
- Be oriented for 'termguicolors' (true colors) while being extra minimal for
|
||||
'notermguicolors' (16 colors) as fallback.
|
||||
|
||||
- Be accessible, i.e. have high enough contrast ratio (as defined in
|
||||
https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef).
|
||||
This means to have value at least 7 for |hl-Normal| and 4.5 for some common
|
||||
cases (|hl-Visual|, `Comment` with set 'cursorline', colored syntax, `Diff*`,
|
||||
|hl-Search|).
|
||||
|
||||
- Be suitable for dark and light backgrounds via exchange of dark and light
|
||||
palettes.
|
||||
|
||||
- Be usable, i.e. provide enough visual feedback for common objects.
|
||||
|
||||
|
||||
@ -38,39 +34,29 @@ Palettes
|
||||
|
||||
- There are two separate palettes: dark and light. They all contain the same
|
||||
set of colors exported as `NvimDark*` and `NvimLight*` colors respectively.
|
||||
|
||||
- The dark palette is used for background in the dark color scheme and for
|
||||
foreground in the light color scheme; and vice versa. This introduces
|
||||
recognizable visual system without too standing out.
|
||||
|
||||
- Actual computation of palettes should be done in a perceptually uniform
|
||||
color space. Oklch is a good choice.
|
||||
|
||||
- Each palette has the following colors (descriptions are for dark background;
|
||||
reverse for light one):
|
||||
|
||||
- Four shades of colored "cold" greys for general UI.
|
||||
|
||||
- Dark ones (from darkest to lightest) are reserved as background for
|
||||
|hl-NormalFloat| (considered as "black"), |hl-Normal| (background),
|
||||
|hl-CursorLine|, |hl-Visual|.
|
||||
|
||||
- Light ones (also from darkest to lightest) are reserved for
|
||||
`Comment`, |hl-StatusLine|/|hl-TabLine|, |hl-Normal| (foreground),
|
||||
and color considered as "white".
|
||||
|
||||
- Six colors to provide enough terminal colors: red, yellow, green, cyan,
|
||||
blue, magenta.
|
||||
They should have (reasonably) similar lightness and chroma to make them
|
||||
visually coherent. Lightness should be as equal to the palette's basic grey
|
||||
(which is used for |hl-Normal|) as possible. They should have (reasonably)
|
||||
different hues to make them visually separable.
|
||||
|
||||
- For 16 colors:
|
||||
|
||||
- Greys are not used and are replaced with the foreground and background
|
||||
colors of the terminal emulator.
|
||||
|
||||
- Non-grey colors fall back to terminal colors as ordered in ANSI codes
|
||||
(https://en.wikipedia.org/wiki/ANSI_escape_code#3-bit_and_4-bit),
|
||||
that is red (1, 9), green (2, 10), yellow (3, 11), blue (4, 12),
|
||||
@ -78,33 +64,25 @@ Palettes
|
||||
To increase contrast, colors 1-6 are used for light background and 9-14
|
||||
for dark background.
|
||||
|
||||
|
||||
==============================================================================
|
||||
Highlight groups
|
||||
|
||||
Use:
|
||||
|
||||
- Grey shades for general UI according to their design.
|
||||
|
||||
- Bold text for keywords (`Statement` highlight group). This is an important
|
||||
choice to increase accessibility for people with color deficiencies, as it
|
||||
doesn't rely on actual color.
|
||||
|
||||
- Green for strings, |hl-DiffAdd| (as background), |hl-DiagnosticOk|, and some
|
||||
minor text UI elements.
|
||||
|
||||
- Cyan as main syntax color, i.e. for function usage (`Function` highlight
|
||||
group), |hl-DiffText|, |hl-DiagnosticInfo|, and some minor text UI elements.
|
||||
|
||||
- Red to generally mean high user attention, i.e. errors; in particular for
|
||||
|hl-ErrorMsg|, |hl-DiffDelete|, |hl-DiagnosticError|.
|
||||
|
||||
- Yellow very sparingly to mean mild user attention, i.e. warnings. That is,
|
||||
|hl-DiagnosticWarn| and |hl-WarningMsg|.
|
||||
|
||||
- Blue very sparingly as |hl-DiagnosticHint| and some additional important
|
||||
syntax group (like `Identifier`).
|
||||
|
||||
- Magenta very carefully (if at all).
|
||||
|
||||
In case of 16 colors:
|
||||
@ -113,9 +91,7 @@ In case of 16 colors:
|
||||
colors can be used as foreground". This means that in any
|
||||
foreground/background combination there should be background and one
|
||||
non-background color.
|
||||
|
||||
- Use 0 (black) or 15 (bright white) as foreground for non-grey background,
|
||||
depending on whether normal background is light or dark.
|
||||
|
||||
|
||||
vim:tw=78:ts=8:et:ft=help:norl:
|
||||
|
@ -4,7 +4,7 @@
|
||||
NVIM REFERENCE MANUAL
|
||||
|
||||
|
||||
Development of Nvim *development* *dev*
|
||||
Development of Nvim *development* *dev*
|
||||
|
||||
This reference describes design constraints and guidelines, for developing
|
||||
Nvim applications or Nvim itself.
|
||||
@ -16,13 +16,13 @@ Nvim is free and open source. Everybody is encouraged to contribute.
|
||||
Type |gO| to see the table of contents.
|
||||
|
||||
==============================================================================
|
||||
Design goals *design-goals*
|
||||
Design goals *design-goals*
|
||||
|
||||
Most important things come first (roughly). Some items conflict; this is
|
||||
intentional. A balance must be found.
|
||||
|
||||
|
||||
NVIM IS... IMPROVED *design-improved*
|
||||
NVIM IS... IMPROVED *design-improved*
|
||||
|
||||
The Neo bits of Nvim should make it a better Vim, without becoming a
|
||||
completely different editor.
|
||||
@ -35,7 +35,7 @@ completely different editor.
|
||||
never break.
|
||||
|
||||
|
||||
NVIM IS... WELL DOCUMENTED *design-documented*
|
||||
NVIM IS... WELL DOCUMENTED *design-documented*
|
||||
|
||||
- A feature that isn't documented is a useless feature. A patch for a new
|
||||
feature must include the documentation.
|
||||
@ -44,7 +44,7 @@ NVIM IS... WELL DOCUMENTED *design-documented*
|
||||
item is easier to find.
|
||||
|
||||
|
||||
NVIM IS... FAST AND SMALL *design-speed-size*
|
||||
NVIM IS... FAST AND SMALL *design-speed-size*
|
||||
|
||||
Keep Nvim small and fast. This directly affects versatility and usability.
|
||||
- Computers are becoming faster and bigger each year. Vim can grow too, but
|
||||
@ -59,7 +59,7 @@ Keep Nvim small and fast. This directly affects versatility and usability.
|
||||
("composability").
|
||||
|
||||
|
||||
NVIM IS... MAINTAINABLE *design-maintain*
|
||||
NVIM IS... MAINTAINABLE *design-maintain*
|
||||
|
||||
- The source code should not become a mess. It should be reliable code.
|
||||
- Use comments in a useful way! Quoting the function name and argument names
|
||||
@ -70,7 +70,7 @@ NVIM IS... MAINTAINABLE *design-maintain*
|
||||
knowledge spread to other parts of the code.
|
||||
|
||||
|
||||
NVIM IS... NOT *design-not*
|
||||
NVIM IS... NOT *design-not*
|
||||
|
||||
Nvim is not an operating system; instead it should be composed with other
|
||||
tools or hosted as a component. Marvim once said: "Unlike Emacs, Nvim does not
|
||||
@ -78,10 +78,10 @@ include the kitchen sink... but it's good for plumbing."
|
||||
|
||||
|
||||
==============================================================================
|
||||
Developer guidelines *dev-guidelines*
|
||||
Developer guidelines *dev-guidelines*
|
||||
|
||||
|
||||
PROVIDERS *dev-provider*
|
||||
PROVIDERS *dev-provider*
|
||||
|
||||
A primary goal of Nvim is to allow extension of the editor without special
|
||||
knowledge in the core. Some core functions are delegated to "providers"
|
||||
@ -115,7 +115,7 @@ For example, the Python provider is implemented by the
|
||||
to 2 only if a valid external Python host is found. Then `has("python")`
|
||||
reflects whether Python support is working.
|
||||
|
||||
*provider-reload*
|
||||
*provider-reload*
|
||||
Sometimes a GUI or other application may want to force a provider to
|
||||
"reload". To reload a provider, undefine its "loaded" flag, then use
|
||||
|:runtime| to reload it: >vim
|
||||
@ -124,7 +124,7 @@ Sometimes a GUI or other application may want to force a provider to
|
||||
:runtime autoload/provider/clipboard.vim
|
||||
|
||||
|
||||
DOCUMENTATION *dev-doc*
|
||||
DOCUMENTATION *dev-doc*
|
||||
|
||||
- "Just say it". Avoid mushy, colloquial phrasing in all documentation
|
||||
(docstrings, user manual, website materials, newsletters, …). Don't mince
|
||||
@ -230,7 +230,7 @@ in src/nvim/api/win_config.c like this: >
|
||||
|
||||
|
||||
Lua docstrings ~
|
||||
*dev-lua-doc*
|
||||
*dev-lua-doc*
|
||||
Lua documentation lives in the source code, as docstrings on the function
|
||||
definitions. The |lua-vim| :help is generated from the docstrings.
|
||||
|
||||
@ -289,7 +289,7 @@ vim.paste in runtime/lua/vim/_editor.lua like this: >
|
||||
--- @returns false if client should cancel the paste.
|
||||
|
||||
|
||||
LUA STDLIB DESIGN GUIDELINES *dev-lua*
|
||||
LUA STDLIB DESIGN GUIDELINES *dev-lua*
|
||||
|
||||
See also |dev-naming|.
|
||||
|
||||
@ -304,19 +304,22 @@ See also |dev-naming|.
|
||||
- accept iterable instead of table
|
||||
- exception: in some cases iterable doesn't make sense, e.g. spair() sorts
|
||||
the input by definition, so there is no reason for it to accept an
|
||||
iterable, because the input needs to be "hydrated", it can't operate on
|
||||
iterable, because the input needs to be "reified"; it can't operate on
|
||||
a "stream".
|
||||
- return iterable instead of table
|
||||
- mimic the pairs() or ipairs() interface if the function is intended to be
|
||||
used in a "for" loop.
|
||||
- when a result-or-error interface is needed, return `result|nil, errmsg|nil`: >
|
||||
- when a result-or-error interface is needed, return `result|nil, nil|errmsg`: >
|
||||
---@return Foo|nil # Result object, or nil if not found.
|
||||
---@return nil|string # Error message on failure, or nil on success.
|
||||
<
|
||||
- Examples: |vim.ui.open()| |io.open()| |luv-error-handling|
|
||||
|
||||
*dev-patterns*
|
||||
Interface conventions ~
|
||||
|
||||
Where possible, these patterns apply to _both_ Lua and the API:
|
||||
|
||||
- When accepting a buffer id, etc., 0 means "current buffer", nil means "all
|
||||
buffers". Likewise for window id, tabpage id, etc.
|
||||
- Examples: |vim.lsp.codelens.clear()| |vim.diagnostic.enable()|
|
||||
@ -327,8 +330,19 @@ Interface conventions ~
|
||||
filter(table, opts, function() … end)
|
||||
BAD:
|
||||
filter(function() … end, table, opts)
|
||||
- "Enable" ("toggle") interface and behavior:
|
||||
- `enable(…, nil)` and `enable(…, {buf=nil})` are synonyms and control the
|
||||
the "global" enablement of a feature.
|
||||
- `is_enabled(nil)` and `is_enabled({buf=nil})`, likewise, query the
|
||||
global state of the feature.
|
||||
- `enable(…, {buf: number})` sets a buffer-local "enable" flag.
|
||||
- `is_enabled({buf: number})`, likewise, queries the buffer-local state of
|
||||
the feature.
|
||||
- See |vim.lsp.inlay_hint.enable()| and |vim.lsp.inlay_hint.is_enabled()|
|
||||
for a reference implementation of these "best practices".
|
||||
- NOTE: open questions: https://github.com/neovim/neovim/issues/28603
|
||||
|
||||
API DESIGN GUIDELINES *dev-api*
|
||||
API DESIGN GUIDELINES *dev-api*
|
||||
|
||||
See also |dev-naming|.
|
||||
|
||||
@ -368,7 +382,7 @@ Naming conventions ~
|
||||
In general, look for precedent when choosing a name, that is, look at existing
|
||||
(non-deprecated) functions. In particular, see below...
|
||||
|
||||
*dev-name-common*
|
||||
*dev-name-common*
|
||||
Use existing common {verb} names (actions) if possible:
|
||||
- add: Appends or inserts into a collection
|
||||
- attach: Listens to something to get events from it (TODO: rename to "on"?)
|
||||
@ -424,7 +438,7 @@ Do NOT use these deprecated nouns:
|
||||
- command Use "cmd" instead
|
||||
- window Use "win" instead
|
||||
|
||||
*dev-name-events*
|
||||
*dev-name-events*
|
||||
Use the "on_" prefix to name event-handling callbacks and also the interface for
|
||||
"registering" such handlers (on_key). The dual nature is acceptable to avoid
|
||||
a confused collection of naming conventions for these related concepts.
|
||||
@ -438,7 +452,7 @@ Use this format to name API (RPC) events: >
|
||||
Example: >
|
||||
nvim_buf_changedtick_event
|
||||
<
|
||||
*dev-name-api*
|
||||
*dev-api-name*
|
||||
Use this format to name new RPC |API| functions: >
|
||||
nvim_{topic}_{verb}_{arbitrary-qualifiers}
|
||||
|
||||
@ -458,7 +472,7 @@ be a parameter (typically manifest as mutually-exclusive buf/win/… flags like
|
||||
and uses the "del" {verb}.
|
||||
|
||||
|
||||
INTERFACE PATTERNS *dev-patterns*
|
||||
INTERFACE PATTERNS *dev-api-patterns*
|
||||
|
||||
Prefer adding a single `nvim_{topic}_{verb}_…` interface for a given topic.
|
||||
|
||||
@ -510,9 +524,9 @@ recommended (compare these 12(!) functions to the above 3 functions): >
|
||||
nvim_win_get_ns(…)
|
||||
nvim_tabpage_get_ns(…)
|
||||
|
||||
API-CLIENT *dev-api-client*
|
||||
API-CLIENT *dev-api-client*
|
||||
|
||||
*api-client*
|
||||
*api-client*
|
||||
API clients wrap the Nvim |API| to provide idiomatic "SDKs" for their
|
||||
respective platforms (see |jargon|). You can build a new API client for your
|
||||
favorite platform or programming language.
|
||||
@ -520,9 +534,10 @@ favorite platform or programming language.
|
||||
List of API clients:
|
||||
https://github.com/neovim/neovim/wiki/Related-projects#api-clients
|
||||
|
||||
*pynvim*
|
||||
The Python client is the reference implementation for API clients.
|
||||
https://github.com/neovim/pynvim
|
||||
*node-client* *pynvim*
|
||||
These clients can be considered the "reference implementation" for API clients:
|
||||
- https://github.com/neovim/node-client
|
||||
- https://github.com/neovim/pynvim
|
||||
|
||||
Standard Features ~
|
||||
|
||||
@ -573,7 +588,7 @@ API client implementation guidelines ~
|
||||
https://github.com/msgpack-rpc/msgpack-rpc
|
||||
|
||||
|
||||
EXTERNAL UI *dev-ui*
|
||||
EXTERNAL UI *dev-ui*
|
||||
|
||||
External UIs should be aware of the |api-contract|. In particular, future
|
||||
versions of Nvim may add new items to existing events. The API is strongly
|
||||
|
@ -1611,7 +1611,8 @@ get({filter}) *vim.lsp.inlay_hint.get()*
|
||||
local hint = vim.lsp.inlay_hint.get({ bufnr = 0 })[1] -- 0 for current buffer
|
||||
|
||||
local client = vim.lsp.get_client_by_id(hint.client_id)
|
||||
resolved_hint = client.request_sync('inlayHint/resolve', hint.inlay_hint, 100, 0).result
|
||||
local resp = client.request_sync('inlayHint/resolve', hint.inlay_hint, 100, 0)
|
||||
local resolved_hint = assert(resp and resp.result, resp.err)
|
||||
vim.lsp.util.apply_text_edits(resolved_hint.textEdits, 0, client.encoding)
|
||||
|
||||
location = resolved_hint.label[1].location
|
||||
|
@ -34,10 +34,11 @@ Nvim ever ships with Lua 5.4+, a Lua 5.1 compatibility shim will be provided
|
||||
so that old plugins continue to work transparently.
|
||||
|
||||
*lua-luajit*
|
||||
Nvim is built with luajit on platforms which support it, which provides
|
||||
extra functionality. Lua code in |init.lua| and plugins can assume its presence
|
||||
on installations on common platforms. For maximum compatibility with less
|
||||
common platforms, availability can be checked using the `jit` global variable: >lua
|
||||
On supported platforms, Nvim is built with LuaJIT, which provides extra
|
||||
functionality (compared to PUC Lua) such as "bit" and various utilities (see
|
||||
|lua-profile|). Lua code in |init.lua| and plugins can assume its presence on
|
||||
many platforms, but for maximum compatibility should check the `jit` global
|
||||
variable: >lua
|
||||
if jit then
|
||||
-- code for luajit
|
||||
else
|
||||
@ -45,9 +46,21 @@ common platforms, availability can be checked using the `jit` global variable: >
|
||||
end
|
||||
<
|
||||
*lua-bit*
|
||||
In particular, the luajit "bit" extension module is _always_ available.
|
||||
A fallback implementation is included when nvim is built with PUC Lua 5.1,
|
||||
and will be transparently used when `require("bit")` is invoked.
|
||||
The LuaJIT "bit" extension module is _always_ available: when built with PUC
|
||||
Lua, Nvim includes a fallback implementation which provides `require("bit")`.
|
||||
|
||||
*lua-profile*
|
||||
To profile Lua code (with LuaJIT-enabled Nvim), the basic steps are: >lua
|
||||
-- Start a profiling session:
|
||||
require('jit.p').start('ri1', '/tmp/profile')
|
||||
|
||||
-- Perform arbitrary tasks (use plugins, scripts, etc.) ...
|
||||
|
||||
-- Stop the session. Profile is written to /tmp/profile.
|
||||
require('jit.p').stop()
|
||||
|
||||
See https://luajit.org/ext_profiler.html or the "p.lua" source for details: >
|
||||
:lua vim.cmd.edit(package.searchpath('jit.p', package.path))
|
||||
|
||||
==============================================================================
|
||||
LUA CONCEPTS AND IDIOMS *lua-concepts*
|
||||
@ -244,8 +257,8 @@ arguments separated by " " (space) instead of "\t" (tab).
|
||||
*:lua=* *:lua*
|
||||
:lua {chunk}
|
||||
Executes Lua chunk {chunk}. If {chunk} starts with "=" the rest of the
|
||||
chunk is evaluated as an expression and printed. `:lua =expr` or `:=expr` is
|
||||
equivalent to `:lua print(vim.inspect(expr))`.
|
||||
chunk is evaluated as an expression and printed. `:lua =expr` and `:=expr`
|
||||
are equivalent to `:lua vim.print(expr)`.
|
||||
|
||||
Examples: >vim
|
||||
:lua vim.api.nvim_command('echo "Hello, Nvim!"')
|
||||
@ -3060,11 +3073,10 @@ vim.glob.to_lpeg({pattern}) *vim.glob.to_lpeg()*
|
||||
VIM.LPEG *vim.lpeg*
|
||||
|
||||
|
||||
LPeg is a pattern-matching library for Lua, based on
|
||||
Parsing Expression Grammars (https://bford.info/packrat/) (PEGs).
|
||||
LPeg is a pattern-matching library for Lua, based on Parsing Expression
|
||||
Grammars (PEGs). https://bford.info/packrat/
|
||||
|
||||
*lua-lpeg*
|
||||
*vim.lpeg.Pattern*
|
||||
*lua-lpeg* *vim.lpeg.Pattern*
|
||||
The LPeg library for parsing expression grammars is included as `vim.lpeg`
|
||||
(https://www.inf.puc-rio.br/~roberto/lpeg/).
|
||||
|
||||
@ -3457,10 +3469,11 @@ vim.lpeg.version() *vim.lpeg.version()*
|
||||
VIM.RE *vim.re*
|
||||
|
||||
The `vim.re` module provides a conventional regex-like syntax for pattern
|
||||
usage within LPeg |vim.lpeg|.
|
||||
usage within LPeg |vim.lpeg|. (Unrelated to |vim.regex| which provides Vim
|
||||
|regexp| from Lua.)
|
||||
|
||||
See https://www.inf.puc-rio.br/~roberto/lpeg/re.html for the original
|
||||
documentation including regex syntax and more concrete examples.
|
||||
documentation including regex syntax and examples.
|
||||
|
||||
|
||||
vim.re.compile({string}, {defs}) *vim.re.compile()*
|
||||
@ -4342,10 +4355,10 @@ vim.snippet.expand({input}) *vim.snippet.expand()*
|
||||
• {input} (`string`)
|
||||
|
||||
vim.snippet.jump({direction}) *vim.snippet.jump()*
|
||||
Jumps within the active snippet in the given direction. If the jump isn't
|
||||
possible, the function call does nothing.
|
||||
Jumps to the next (or previous) placeholder in the current snippet, if
|
||||
possible.
|
||||
|
||||
You can use this function to navigate a snippet as follows: >lua
|
||||
For example, map `<Tab>` to jump while a snippet is active: >lua
|
||||
vim.keymap.set({ 'i', 's' }, '<Tab>', function()
|
||||
if vim.snippet.active({ direction = 1 }) then
|
||||
return '<cmd>lua vim.snippet.jump(1)<cr>'
|
||||
|
@ -4,7 +4,7 @@
|
||||
NVIM REFERENCE MANUAL
|
||||
|
||||
|
||||
Notable changes in Nvim 0.9 from 0.8 *news-0.9*
|
||||
Notable changes since Nvim 0.8 *news-0.9*
|
||||
|
||||
Type |gO| to see the table of contents.
|
||||
|
||||
|
@ -13,200 +13,139 @@ For changes in the previous release, see |news-0.9|.
|
||||
==============================================================================
|
||||
BREAKING CHANGES *news-breaking*
|
||||
|
||||
The following changes may require adaptations in user config or plugins.
|
||||
These changes may require adaptations in your config or plugins.
|
||||
|
||||
• In some cases, the cursor in the Nvim |TUI| used to blink even without
|
||||
configuring 'guicursor' as mentioned in |cursor-blinking|. This was a bug
|
||||
that has now been fixed. If your cursor has stopped blinking, add the
|
||||
following (or similar, adapted to user preference) to your |config| file: >vim
|
||||
• API:
|
||||
• |nvim_open_win()| now blocks all autocommands when `noautocmd` is set,
|
||||
rather than just those from setting the `buffer` to display in the window.
|
||||
|
||||
set guicursor+=n-v-c:blinkon500-blinkoff500
|
||||
• Defaults:
|
||||
• Default color scheme has been updated to be "Nvim branded" and accessible.
|
||||
Use `:colorscheme vim` to revert to the old legacy color scheme.
|
||||
• These Nvim specific highlight groups are now defined in a meaningfully
|
||||
different way and might need an update:
|
||||
• |hl-FloatBorder| is linked to |hl-NormalFloat| instead of |hl-WinSeparator|.
|
||||
• |hl-NormalFloat| is not linked to |hl-Pmenu|.
|
||||
• |hl-WinBar| has different background.
|
||||
• |hl-WinBarNC| is similar to |hl-WinBar| but not bold.
|
||||
• |hl-WinSeparator| is linked to |hl-Normal| instead of |hl-VertSplit|.
|
||||
• This also might result into some color schemes looking differently due
|
||||
to them relying on implicit assumptions about how highlight groups are
|
||||
defined by default. To account for this, define all attributes of
|
||||
highlight groups explicitly. Alternatively, use `:colorscheme vim` or
|
||||
`:source $VIMRUNTIME/colors/vim.lua` to restore previous definitions.
|
||||
• 'termguicolors' is enabled by default when Nvim is able to determine that
|
||||
the host terminal emulator supports 24-bit color.
|
||||
|
||||
• Editor
|
||||
• When switching windows, |CursorMoved| autocommands trigger when Nvim is
|
||||
back in the main loop rather than immediately. This is more compatible
|
||||
with Vim.
|
||||
• "#" followed by a digit no longer stands for a function key at the start
|
||||
of the lhs of a mapping.
|
||||
• |shm-q| now fully hides macro recording message instead of only shortening it.
|
||||
• Signs placed through the legacy |sign-commands| are now stored and
|
||||
displayed as |extmarks| internally. Along with the following changes:
|
||||
• A sign placed twice in the same group with the same identifier will be
|
||||
moved.
|
||||
• Legacy signs are always deleted along with the line it is placed on.
|
||||
• Legacy and extmark signs will show up in both |:sign-place-list| and
|
||||
|nvim_buf_get_extmarks()|.
|
||||
• Legacy and extmark signs are displayed and listed with the same priority:
|
||||
line number -> priority -> sign id -> recently placed
|
||||
• `:behave` was removed.
|
||||
- If you used `:behave xterm`, the following is equivalent: >vim
|
||||
|
||||
set mousemodel=extend
|
||||
<
|
||||
• |vim.islist()| now checks whether a table is actually list-like (i.e.,
|
||||
has integer keys without gaps and starting from 1). For the previous
|
||||
behavior (only check for integer keys, allow gaps or not starting with 1),
|
||||
use |vim.isarray()|.
|
||||
- If you used `:behave mswin`, the following is equivalent: >vim
|
||||
|
||||
• "#" followed by a digit no longer stands for a function key at the start of
|
||||
the lhs of a mapping.
|
||||
|
||||
• `:behave` was removed.
|
||||
- If you used `:behave xterm`, the following is equivalent: >vim
|
||||
|
||||
set mousemodel=extend
|
||||
set selection=exclusive
|
||||
set selectmode=mouse,key
|
||||
set mousemodel=popup
|
||||
set keymodel=startsel,stopsel
|
||||
<
|
||||
- If you used `:behave mswin`, the following is equivalent: >vim
|
||||
|
||||
set selection=exclusive
|
||||
set selectmode=mouse,key
|
||||
set mousemodel=popup
|
||||
set keymodel=startsel,stopsel
|
||||
• Events
|
||||
• Returning any truthy value from a callback passed to
|
||||
|nvim_create_autocmd()| (rather than just `true`) will delete the
|
||||
autocommand.
|
||||
|
||||
• LSP
|
||||
• |LanguageTree:parse()| will no longer parse injections by default and now
|
||||
requires an explicit range argument to be passed. If injections are
|
||||
required, provide an explicit range via `parser:parse({ start_row, end_row })`.
|
||||
• |vim.lsp.util.parse_snippet()| will now strictly follow the snippet
|
||||
grammar defined by LSP, and hence previously parsed snippets might now be
|
||||
considered invalid input.
|
||||
• |vim.lsp.codelens.refresh()| now takes an `opts` argument. With this
|
||||
change, the default behavior of just refreshing the current buffer has
|
||||
been replaced by refreshing all buffers.
|
||||
• |vim.lsp.util.extract_completion_items()| will no longer return reliable
|
||||
results, since it does not apply `itemDefaults` when its input is
|
||||
a `CompletionList`. Moreover, since support for LSP
|
||||
`completionList.itemDefaults` was added, some third party plugins might be
|
||||
negatively impacted in case the language servers support the feature but
|
||||
the plugin does not. If necessary, the respective capability can be
|
||||
removed when calling |vim.lsp.protocol.make_client_capabilities()|.
|
||||
• |LspRequest| and LspProgressUpdate (renamed to |LspProgress|) autocmds
|
||||
were promoted from a |User| autocmd to first class citizen.
|
||||
|
||||
• Lua:
|
||||
• |-l| ensures output ends with a newline if the script prints messages and
|
||||
doesn't cause Nvim to exit.
|
||||
• Removed functions from the |vim.json| module:
|
||||
• Unnecessary, undocumented functions which caused global side-effects.
|
||||
• `vim.json.null` is redundant with `vim.NIL`.
|
||||
• `vim.json.array_mt` (and related) is redundant with `vim.empty_dict()`.
|
||||
• |vim.islist()| now checks whether a table is actually list-like (i.e., has
|
||||
integer keys without gaps and starting from 1). For the previous behavior
|
||||
(only check for integer keys, allow gaps or not starting with 1), use
|
||||
|vim.isarray()|.
|
||||
• Renamed `vim.treesitter.playground` to `vim.treesitter.dev`.
|
||||
|
||||
• Options
|
||||
• Removed some Vim 5.0<= option compatibilities:
|
||||
• 'backspace' no longer supports number values. Instead:
|
||||
• for `backspace=0` set `backspace=` (empty)
|
||||
• for `backspace=1` set `backspace=indent,eol`
|
||||
• for `backspace=2` set `backspace=indent,eol,start` (default behavior in Nvim)
|
||||
• for `backspace=3` set `backspace=indent,eol,nostop`
|
||||
• 'backupdir' and 'directory' will no longer remove a `>` at the start of
|
||||
the option.
|
||||
• |OptionSet| autocommand args |v:option_new|, |v:option_old|,
|
||||
|v:option_oldlocal|, |v:option_oldglobal| now have the type of the option
|
||||
instead of always being strings. |v:option_old| is now the old global
|
||||
value for all global-local options, instead of just string global-local
|
||||
options.
|
||||
• Local value for a global-local number/boolean option is now unset when the
|
||||
option is set (e.g. using |:set| or |nvim_set_option_value()|) without
|
||||
a scope, which means they now behave the same way as string options.
|
||||
|
||||
• Plugins:
|
||||
• |:TOhtml| has been rewritten in Lua to support Neovim-specific
|
||||
decorations, and many options have been removed.
|
||||
|
||||
• Treesitter
|
||||
• Treesitter highlight groups have been renamed to be more in line with
|
||||
upstream tree-sitter and Helix to make it easier to share queries. The
|
||||
full list is documented in |treesitter-highlight-groups|.
|
||||
|
||||
• TUI
|
||||
• In some cases, the cursor in the Nvim |TUI| used to blink even without
|
||||
configuring 'guicursor' as mentioned in |cursor-blinking|. This was a bug
|
||||
that has now been fixed. If your cursor has stopped blinking, add the
|
||||
following (or similar, adapted to user preference) to your |config| file: >vim
|
||||
set guicursor+=n-v-c:blinkon500-blinkoff500
|
||||
<
|
||||
• When switching windows, |CursorMoved| autocommands trigger when Nvim is back
|
||||
in the main loop rather than immediately. This is more compatible with Vim.
|
||||
|
||||
• |-l| ensures output ends with a newline if the script prints messages and
|
||||
doesn't cause Nvim to exit.
|
||||
|
||||
• |LspRequest| and LspProgressUpdate (renamed to |LspProgress|) autocmds were
|
||||
promoted from a |User| autocmd to first class citizen.
|
||||
|
||||
• Renamed `vim.treesitter.playground` to `vim.treesitter.dev`.
|
||||
|
||||
• Removed functions from the |vim.json| module:
|
||||
• Unnecessary, undocumented functions which caused global side-effects.
|
||||
• `vim.json.null` is redundant with `vim.NIL`.
|
||||
• `vim.json.array_mt` (and related) is redundant with `vim.empty_dict()`.
|
||||
|
||||
• Removed some Vim 5.0<= option compatibilities:
|
||||
• |'backspace'| no longer supports number values. Instead:
|
||||
• for `backspace=0` set `backspace=` (empty)
|
||||
• for `backspace=1` set `backspace=indent,eol`
|
||||
• for `backspace=2` set `backspace=indent,eol,start` (default behavior in Nvim)
|
||||
• for `backspace=3` set `backspace=indent,eol,nostop`
|
||||
• |'backupdir'| and |'directory'| will no longer remove a `>` at the start
|
||||
of the option.
|
||||
|
||||
• |LanguageTree:parse()| will no longer parse injections by default and
|
||||
now requires an explicit range argument to be passed. If injections are
|
||||
required, provide an explicit range via `parser:parse({ start_row, end_row })`.
|
||||
|
||||
• |vim.lsp.util.parse_snippet()| will now strictly follow the snippet grammar
|
||||
defined by LSP, and hence previously parsed snippets might now be considered
|
||||
invalid input.
|
||||
|
||||
• |OptionSet| autocommand args |v:option_new|, |v:option_old|,
|
||||
|v:option_oldlocal|, |v:option_oldglobal| now have the type of the option
|
||||
instead of always being strings. |v:option_old| is now the old global value
|
||||
for all global-local options, instead of just string global-local options.
|
||||
|
||||
• Local value for a global-local number/boolean option is now unset when
|
||||
the option is set (e.g. using |:set| or |nvim_set_option_value()|) without a
|
||||
scope, which means they now behave the same way as string options.
|
||||
|
||||
• Signs placed through the legacy |sign-commands| are now stored and displayed
|
||||
as |extmarks| internally. Along with the following changes:
|
||||
• A sign placed twice in the same group with the same identifier will be moved.
|
||||
• Legacy signs are always deleted along with the line it is placed on.
|
||||
• Legacy and extmark signs will show up in both |:sign-place-list| and |nvim_buf_get_extmarks()|.
|
||||
• Legacy and extmark signs are displayed and listed with the same priority:
|
||||
line number -> priority -> sign id -> recently placed
|
||||
|
||||
• Default color scheme has been updated to be "Nvim branded" and accessible.
|
||||
Use `:colorscheme vim` to revert to the old legacy color scheme.
|
||||
|
||||
Here is a list of Nvim specific highlight groups which are now defined in
|
||||
a meaningfully different way and might need an update:
|
||||
• |hl-FloatBorder| is linked to |hl-NormalFloat| instead of |hl-WinSeparator|.
|
||||
• |hl-NormalFloat| is not linked to |hl-Pmenu|.
|
||||
• |hl-WinBar| has different background.
|
||||
• |hl-WinBarNC| is similar to |hl-WinBar| but not bold.
|
||||
• |hl-WinSeparator| is linked to |hl-Normal| instead of |hl-VertSplit|.
|
||||
|
||||
This also might result into some color schemes looking differently due to
|
||||
them relying on implicit assumptions about how highlight groups are defined
|
||||
by default. To account for this, define all attributes of highlight groups
|
||||
explicitly. Alternatively, use `:colorscheme vim` or `:source
|
||||
$VIMRUNTIME/colors/vim.lua` to restore previous definitions.
|
||||
|
||||
• 'termguicolors' is enabled by default when Nvim is able to determine that
|
||||
the host terminal emulator supports 24-bit color.
|
||||
|
||||
• Treesitter highlight groups have been renamed to be more in line with
|
||||
upstream tree-sitter and Helix to make it easier to share queries. The full
|
||||
list is documented in |treesitter-highlight-groups|.
|
||||
|
||||
• |vim.lsp.codelens.refresh()| now takes an `opts` argument. With this change,
|
||||
the default behavior of just refreshing the current buffer has been replaced by
|
||||
refreshing all buffers.
|
||||
|
||||
• |shm-q| now fully hides macro recording message instead of only shortening it.
|
||||
|
||||
• Returning any truthy value from a callback passed to |nvim_create_autocmd()|
|
||||
(rather than just `true`) will delete the autocommand.
|
||||
|
||||
• |vim.lsp.util.extract_completion_items()| will no longer return reliable
|
||||
results, since it does not apply `itemDefaults` when its input is a
|
||||
`CompletionList`.
|
||||
Moreover, since support for LSP `completionList.itemDefaults` was added,
|
||||
some third party plugins might be negatively impacted in case the language
|
||||
servers support the feature but the plugin does not.
|
||||
If necessary, the respective capability can be
|
||||
removed when calling |vim.lsp.protocol.make_client_capabilities()|.
|
||||
|
||||
• |:TOhtml| has been rewritten in Lua to support Neovim-specific decorations,
|
||||
and many options have been removed.
|
||||
|
||||
• |nvim_open_win()| now blocks all autocommands when `noautocmd` is set,
|
||||
rather than just those from setting the `buffer` to display in the window.
|
||||
|
||||
==============================================================================
|
||||
BREAKING CHANGES IN HEAD *news-breaking-dev*
|
||||
|
||||
====== Remove this section before release. ======
|
||||
|
||||
The following changes to UNRELEASED features were made during the development
|
||||
cycle (Nvim HEAD, the "master" branch).
|
||||
|
||||
• Changed the signature of `vim.lsp.inlay_hint.is_enabled()`.
|
||||
|
||||
• `vim.lsp.inlay_hint.enable()` now take effect on all buffers by default.
|
||||
|
||||
• Removed `vim.treesitter.foldtext` as transparent foldtext is now supported
|
||||
https://github.com/neovim/neovim/pull/20750
|
||||
|
||||
• Changed the signature of `vim.lsp.inlay_hint.enable()`.
|
||||
|
||||
• Changed the signature of `vim.diagnostic.enable()`.
|
||||
|
||||
• Removed vim.iter.map(), vim.iter.filter(), vim.iter.totable().
|
||||
|
||||
• Renamed vim.tbl_isarray() to vim.isarray().
|
||||
|
||||
• Changed |vim.ui.open()| return-signature to match `result|nil, errormsg|nil` convention.
|
||||
|
||||
• Renamed Iter:nextback() to Iter:pop()
|
||||
|
||||
• Renamed Iter:peekback() to Iter:rpeek()
|
||||
|
||||
• Renamed Iter:skipback() to Iter:rskip()
|
||||
|
||||
• Removed Iter:nthback(), use Iter:nth() with negative index instead.
|
||||
|
||||
• Renamed nvim_complete_set to nvim__complete_set and marked it as
|
||||
experimental.
|
||||
|
||||
• Renamed vim.snippet.exit() to vim.snippet.stop().
|
||||
|
||||
• Changed |event-data| table for |LspProgress|: renamed `result` to `params`.
|
||||
|
||||
==============================================================================
|
||||
NEW FEATURES *news-features*
|
||||
|
||||
The following new APIs and features were added.
|
||||
The following new features were added.
|
||||
|
||||
• Performance:
|
||||
• 'diffopt' "linematch" scoring algorithm now favours larger and less groups
|
||||
https://github.com/neovim/neovim/pull/23611
|
||||
• Treesitter highlighting now parses injections incrementally during
|
||||
screen redraws only for the line range being rendered. This significantly
|
||||
improves performance in large files with many injections.
|
||||
• 'breakindent' performance is significantly improved for wrapped lines.
|
||||
• Cursor movement, insertion with [count] and |screenpos()| are now faster.
|
||||
|
||||
• |'winfixbuf'| keeps a window focused onto a specific buffer
|
||||
|
||||
• |vim.iter()| provides a generic iterator interface for tables and Lua
|
||||
iterators |for-in|.
|
||||
|
||||
• |vim.ringbuf()| creates ring buffers.
|
||||
|
||||
• |vim.keycode()| translates keycodes in a string.
|
||||
|
||||
• |'smoothscroll'| option to scroll by screen line rather than by text line
|
||||
when |'wrap'| is set.
|
||||
|
||||
• API enhancements
|
||||
• API
|
||||
• Passing 0 to |nvim_get_chan_info()| gets info about the current channel.
|
||||
• |nvim_buf_set_extmark()| supports inline virtual text.
|
||||
• |nvim_win_text_height()| computes the number of screen lines occupied
|
||||
by a range of text in a given window.
|
||||
@ -215,34 +154,81 @@ The following new APIs and features were added.
|
||||
• Floating windows can now be hidden by setting `hide` in |nvim_open_win()| or
|
||||
|nvim_win_set_config()|.
|
||||
• |nvim_input_mouse()| supports mouse buttons "x1" and "x2".
|
||||
• Added "force_crlf" option field in |nvim_open_term()|.
|
||||
• Added |nvim_tabpage_set_win()| to set the current window of a tabpage.
|
||||
• |nvim__win_add_ns()| can bind a |namespace| to a window-local scope(s).
|
||||
• Extmarks opt-in to this scoping via the `scoped` flag of |nvim_buf_set_extmark()|.
|
||||
• Mapping APIs now support abbreviations when mode short-name has suffix "a".
|
||||
• Floating windows can now show footer with new `footer` and `footer_pos`
|
||||
config fields. Uses |hl-FloatFooter| by default.
|
||||
• |extmarks| can set a "url" highlight attribute, so the text region can
|
||||
become a clickable hyperlink (assuming UI support). The TUI renders URLs
|
||||
using the OSC 8 control sequence, enabling clickable text in supporting
|
||||
terminals.
|
||||
• |nvim_open_win()| and |nvim_win_set_config()| now support opening normal
|
||||
(split) windows, moving floating windows into split windows, and opening
|
||||
windows in non-current tabpages.
|
||||
• Flags added to |nvim_buf_set_extmark()|:
|
||||
- "undo_restore": opt-out extmarks of precise undo tracking.
|
||||
- "invalidate": automatically hide or delete extmarks.
|
||||
- "virt_text_repeat_linebreak": repeat virtual text on wrapped lines.
|
||||
• Extmarks now fully support multi-line ranges, and a single extmark can be
|
||||
used to highlight a range of arbitrary length. The |nvim_buf_set_extmark()|
|
||||
API function already allowed you to define such ranges, but highlight
|
||||
regions were not rendered consistently for a range that covers more than
|
||||
one line break. This has now been fixed. Signs defined as part of
|
||||
a multi-line extmark also apply to every line in the range, not just the
|
||||
first. In addition, |nvim_buf_get_extmarks()| has gained an "overlap"
|
||||
option to return such ranges even if they started before the specified
|
||||
position.
|
||||
|
||||
• 'foldtext' now supports virtual text format. |fold-foldtext|
|
||||
|
||||
• |'foldtext'| can be set to an empty string to disable and render the line:
|
||||
as normal with regular highlighting and no line wrapping.
|
||||
|
||||
• |vim.system()| for running system commands.
|
||||
|
||||
• |vim.lpeg| and |vim.re| expose the bundled Lpeg expression grammar parser
|
||||
and its regex interface.
|
||||
|
||||
• Mapping APIs now support abbreviations when mode short-name has suffix "a".
|
||||
|
||||
• Better cmdline completion for string option value. |complete-set-option|
|
||||
|
||||
• Builtin TUI can now recognize "super" (|<D-|) and "meta" (|<T-|) modifiers in a
|
||||
terminal emulator that supports |tui-csiu|.
|
||||
• Defaults:
|
||||
• The `workspace/didChangeWatchedFiles` LSP client capability is now enabled
|
||||
by default on Mac and Windows. Disabled on Linux since there currently
|
||||
isn't a viable backend for watching files that scales well for large
|
||||
directories.
|
||||
• On Windows 'isfname' does not include ":". Drive letters are handled
|
||||
correctly without it. (Use |gF| for filepaths suffixed with ":line:col").
|
||||
• 'comments' includes "fb:•".
|
||||
• 'shortmess' includes the "C" flag.
|
||||
• 'grepprg' uses the -H and -I flags for grep by default,
|
||||
and defaults to using ripgrep if available.
|
||||
• "]d" and "[d" in Normal mode map to |vim.diagnostic.goto_next()| and
|
||||
|vim.diagnostic.goto_prev()|, respectively. |]d-default| |[d-default|
|
||||
• <C-W>d (and <C-W><C-D>) map to |vim.diagnostic.open_float()|
|
||||
|CTRL-W_d-default|
|
||||
• |vim.lsp.start()| sets the following default keymaps (assuming server
|
||||
support):
|
||||
• |K| in Normal mode maps to |vim.lsp.buf.hover()|, unless 'keywordprg'
|
||||
was customized before calling |vim.lsp.start()|.
|
||||
• Automatic linting of treesitter query files (see |ft-query-plugin|).
|
||||
Can be disabled via: >lua
|
||||
vim.g.query_lint_on = {}
|
||||
<
|
||||
• Enabled treesitter highlighting for:
|
||||
• treesitter query files
|
||||
• Vim help files
|
||||
• Lua files
|
||||
|
||||
• Editor
|
||||
• Better cmdline completion for string option value. |complete-set-option|
|
||||
• Try it with `:set listchars=<tab>`
|
||||
• By default, the swapfile "ATTENTION" |E325| dialog is skipped if the
|
||||
swapfile is owned by a running Nvim process, instead of prompting. If you
|
||||
always want the swapfile dialog, delete the default SwapExists handler:
|
||||
`autocmd! nvim_swapfile`. |default-autocmds|
|
||||
• Navigating the |jumplist| with CTRL+O, CTRL+I behaves more intuitively
|
||||
when deleting buffers, and avoids "invalid buffer" cases. #25461
|
||||
• |:fclose| command.
|
||||
• |v_Q-default| and |v_@-default| repeat a register for each line of
|
||||
a linewise visual selection.
|
||||
• Clicking on a tabpage in the tabline with the middle mouse button closes it.
|
||||
• |:checkhealth| buffer can be opened in a split window using modifiers like
|
||||
|:vertical|, |:horizontal| and |:botright|.
|
||||
|
||||
• Events
|
||||
• |vim.on_key()| callbacks receive a second argument for keys typed before
|
||||
mappings are applied.
|
||||
|
||||
• LSP
|
||||
• LSP method names are available in |vim.lsp.protocol.Methods|.
|
||||
@ -280,11 +266,100 @@ The following new APIs and features were added.
|
||||
|vim.lsp.buf.type_definition()|, and |vim.lsp.buf.implementation()| now
|
||||
support the `loclist` field of |vim.lsp.ListOpts|.
|
||||
|
||||
• Lua:
|
||||
• |:lua| with a |[range]| executes that range as Lua code, in any buffer.
|
||||
• |:source| without arguments treats a buffer with 'filetype' of "lua" as
|
||||
Lua code regardless of its extension.
|
||||
• Vimscript function |exists()| supports checking |v:lua| functions.
|
||||
• |vim.iter()| is a generic interface for all |iterable| objects (tables,
|
||||
|iterator|s).
|
||||
• |vim.snippet| provides a mode for expanding and navigating snippets.
|
||||
• |vim.ringbuf()| is a generic ring buffer (data structure).
|
||||
• |vim.deepcopy()| gained a `noref` argument to avoid hashing table values.
|
||||
• |vim.keycode()| translates keycodes in a string.
|
||||
• |vim.system()| runs commands / starts processes.
|
||||
• |vim.lpeg| and |vim.re| expose the bundled Lpeg expression grammar parser
|
||||
and its regex interface.
|
||||
• |vim.base64.encode()| and |vim.base64.decode()| encode and decode strings
|
||||
using Base64 encoding.
|
||||
• |vim.text.hexencode()| and |vim.text.hexdecode()| convert strings to and
|
||||
from byte representations.
|
||||
• |vim.ui.open()| opens URIs using the system default handler (macOS `open`,
|
||||
Windows `explorer`, Linux `xdg-open`, etc.)
|
||||
• |vim.wo| can now be double indexed for |:setlocal| behaviour. Currently
|
||||
only `0` for the buffer index is supported.
|
||||
• Improved messages for type errors in `vim.api.*` calls (including `opts` params).
|
||||
• Lua type annotations for:
|
||||
• `vim.*`
|
||||
• `vim.fn.*`
|
||||
• `vim.api.*`
|
||||
• `vim.v.*`
|
||||
• Functions that take a severity as an optional parameter (e.g.
|
||||
|vim.diagnostic.get()|) now also accept a list of severities |vim.diagnostic.severity|
|
||||
• |vim.diagnostic.count()| returns the number of diagnostics for a given
|
||||
buffer and/or namespace, by severity. This is a faster alternative to
|
||||
|vim.diagnostic.get()| when only the number of diagnostics is needed, but
|
||||
not the diagnostics themselves.
|
||||
• |vim.diagnostic.is_enabled()|
|
||||
• |vim.version.le()|, |vim.version.ge()|
|
||||
• |vim.fs.root()| finds project root directories from a list of "root
|
||||
markers".
|
||||
• |vim.tbl_contains()| now works for general tables and allows specifying
|
||||
a predicate function that is checked for each value. (Use
|
||||
|vim.list_contains()| for checking list-like tables (integer keys without
|
||||
gaps) for literal values.)
|
||||
• |vim.region()| can use a string accepted by |getpos()| as position.
|
||||
|
||||
• Options
|
||||
• 'winfixbuf' keeps a window focused onto a specific buffer
|
||||
• 'smoothscroll' option to scroll by screen line rather than by text line
|
||||
when 'wrap' is set.
|
||||
• 'foldtext' now supports virtual text format. |fold-foldtext|
|
||||
• 'foldtext' can be set to an empty string to disable and render the line:
|
||||
as normal with regular highlighting and no line wrapping.
|
||||
• 'complete' option supports "f" flag for completing buffer names.
|
||||
• 'completeopt' option supports "popup" flag to show extra information in
|
||||
a floating window.
|
||||
• 'errorfile' (|-q|) accepts `-` as an alias for stdin.
|
||||
|
||||
• Performance:
|
||||
• 'diffopt' "linematch" scoring algorithm now favours larger and less groups
|
||||
https://github.com/neovim/neovim/pull/23611
|
||||
• Treesitter highlighting now parses injections incrementally during
|
||||
screen redraws only for the line range being rendered. This significantly
|
||||
improves performance in large files with many injections.
|
||||
• 'breakindent' performance is significantly improved for wrapped lines.
|
||||
• Cursor movement, insertion with [count] and |screenpos()| are now faster.
|
||||
|
||||
• Plugins:
|
||||
• Nvim now includes |commenting| support.
|
||||
• |:Man| supports the `:hide` modifier to open page in the current window.
|
||||
• |:Man| respects 'wrapmargin'
|
||||
|
||||
• Startup:
|
||||
• |$NVIM_APPNAME| can be set to a relative path instead of only a name.
|
||||
• |--startuptime| reports the startup times for both processes (TUI
|
||||
+ server) as separate sections.
|
||||
|
||||
• Terminal
|
||||
• |:terminal| accepts some |:command-modifiers| (specifically |:horizontal|
|
||||
and those that affect splitting a window).
|
||||
• Terminal buffers emit a |TermRequest| autocommand event when the child
|
||||
process emits an OSC or DCS control sequence.
|
||||
• Terminal buffers respond to OSC background and foreground requests.
|
||||
|default-autocmds|
|
||||
|
||||
• Treesitter
|
||||
• Bundled parsers and queries (highlight, folds) for Markdown, Python, and
|
||||
Bash.
|
||||
• |vim.treesitter.query.omnifunc()| for treesitter query files (set by
|
||||
default).
|
||||
• |:InspectTree| shows root nodes
|
||||
• |:InspectTree| now supports |folding|
|
||||
• |:InspectTree| shows node ranges in 0-based instead of 1-based indexing.
|
||||
• |vim.treesitter.foldexpr()| now recognizes folds captured using a
|
||||
quantified query pattern.
|
||||
• |vim.treesitter.query.omnifunc()| provides completion in treesitter query
|
||||
files (set by default).
|
||||
• |vim.treesitter.query.edit()| provides live editing of treesitter queries.
|
||||
• |Query:iter_matches()| now has the ability to set the maximum start depth
|
||||
for matches.
|
||||
• `@injection.language` now has smarter resolution and will fall back to
|
||||
@ -294,230 +369,75 @@ The following new APIs and features were added.
|
||||
• `@injection.filename` will try to match the node text via
|
||||
|vim.filetype.match()| and treat the result as a language name in the same
|
||||
way as `@injection.language`.
|
||||
• The `#set!` directive now supports `injection.self` and `injection.parent`
|
||||
for injecting either the current node's language or the parent
|
||||
• The `#set!` directive supports `injection.self` and `injection.parent` for
|
||||
injecting either the current node's language or the parent
|
||||
|LanguageTree|'s language, respectively.
|
||||
• |vim.treesitter.query.edit()| allows live editing of treesitter
|
||||
queries.
|
||||
• Improved error messages for query parsing.
|
||||
• |:InspectTree| shows node ranges in 0-based indexing instead of 1-based
|
||||
indexing.
|
||||
• |:InspectTree| shows root nodes
|
||||
• |:InspectTree| now supports |folding|
|
||||
• The `#set!` directive can set the "url" property of a node to have the
|
||||
node emit a hyperlink. Hyperlinks are UI specific: in the TUI, the OSC 8
|
||||
control sequence is used.
|
||||
• |vim.treesitter.foldexpr()| now recognizes folds captured using a
|
||||
quantified query pattern.
|
||||
• Improved error messages for query parsing.
|
||||
|
||||
• |:Man| now supports `:hide` modifier to open page in the current window.
|
||||
• TUI
|
||||
• Builtin TUI can now recognize "super" (|<D-|) and "meta" (|<T-|) modifiers
|
||||
in a terminal emulator that supports |tui-csiu|.
|
||||
• The |TermResponse| event can be used with |v:termresponse| to read escape
|
||||
sequence responses from the host terminal.
|
||||
• A clipboard provider which uses OSC 52 to copy the selection to the system
|
||||
clipboard is now bundled by default and will be automatically enabled under
|
||||
certain conditions. |clipboard-osc52|
|
||||
• 'termsync' option asks the terminal emulator to buffer screen updates
|
||||
until the redraw cycle is complete. Requires support from the host terminal.
|
||||
|
||||
• |vim.ui.open()| opens URIs using the system default handler (macOS `open`,
|
||||
Windows `explorer`, Linux `xdg-open`, etc.)
|
||||
• UI
|
||||
• Enhanced support for rendering multibyte characters using composing
|
||||
characters: the maximum limit was increased from 1+6 codepoints to
|
||||
31 bytes, which is guaranteed to fit all chars from before but often more.
|
||||
• NOTE: the regexp engine still has a hard-coded limit of considering
|
||||
6 composing chars only.
|
||||
|
||||
• |vim.wo| can now be double indexed for |:setlocal| behaviour. Currently only
|
||||
`0` for the buffer index is currently supported.
|
||||
|
||||
• Lua type annotations for:
|
||||
• `vim.*`
|
||||
• `vim.fn.*`
|
||||
• `vim.api.*`
|
||||
• `vim.v.*`
|
||||
|
||||
• Improved messages for type errors in `vim.api.*` calls (including `opts` params)
|
||||
|
||||
• Functions that take a severity as an optional parameter (e.g.
|
||||
|vim.diagnostic.get()|) now also accept a list of severities |vim.diagnostic.severity|
|
||||
|
||||
• Floating windows can now show footer with new `footer` and `footer_pos`
|
||||
config fields. Uses |hl-FloatFooter| by default.
|
||||
|
||||
• |:terminal| command now accepts some |:command-modifiers| (specifically
|
||||
|:horizontal| and those that affect splitting a window).
|
||||
|
||||
• |$NVIM_APPNAME| can be set to a relative path instead of only a name.
|
||||
|
||||
• |:fclose| command.
|
||||
|
||||
• |vim.snippet| handles expansion of snippets in LSP format.
|
||||
|
||||
• 'complete' option supports "f" flag for completing buffer names.
|
||||
|
||||
• |vim.base64.encode()| and |vim.base64.decode()| encode and decode strings
|
||||
using Base64 encoding.
|
||||
|
||||
• The |TermResponse| autocommand event can be used with |v:termresponse| to
|
||||
read escape sequence responses from the terminal.
|
||||
|
||||
• A clipboard provider which uses OSC 52 to copy the selection to the system
|
||||
clipboard is now bundled by default and will be automatically enabled under
|
||||
certain conditions. |clipboard-osc52|
|
||||
|
||||
• 'termsync' option asks the terminal emulator to buffer screen updates until
|
||||
the redraw cycle is complete. Requires support from the terminal.
|
||||
|
||||
• |vim.text.hexencode()| and |vim.text.hexdecode()| convert strings to and
|
||||
from byte representations.
|
||||
|
||||
• 'completeopt' option supports "popup" flag to show extra information in a
|
||||
floating window.
|
||||
|
||||
• |v_Q-default| and |v_@-default| repeat a register for each line of a linewise
|
||||
visual selection.
|
||||
|
||||
• |vim.diagnostic.count()| returns the number of diagnostics for a given
|
||||
buffer and/or namespace, by severity. This is a faster alternative to
|
||||
|vim.diagnostic.get()| when only the number of diagnostics is needed, but
|
||||
not the diagnostics themselves.
|
||||
|
||||
• Introduced |vim.diagnostic.is_enabled()|
|
||||
|
||||
• |vim.deepcopy()| has a `noref` argument to avoid hashing table values.
|
||||
|
||||
• Terminal buffers emit a |TermRequest| autocommand event when the child
|
||||
process emits an OSC or DCS control sequence.
|
||||
|
||||
• Terminal buffers respond to OSC background and foreground requests. |default-autocmds|
|
||||
|
||||
• |vim.version.le()| and |vim.version.ge()| are added to |vim.version|.
|
||||
|
||||
• |extmarks| can set a "url" highlight attribute, so the text region can
|
||||
become a clickable hyperlink (assuming UI support). The TUI renders URLs
|
||||
using the OSC 8 control sequence, enabling clickable text in supporting
|
||||
terminals.
|
||||
|
||||
• Clicking on a tabpage in the tabline with the middle mouse button closes it.
|
||||
|
||||
• Added built-in |commenting| support.
|
||||
|
||||
• |vim.fs.root()| finds project root directories from a list of "root
|
||||
markers".
|
||||
|
||||
==============================================================================
|
||||
CHANGED FEATURES *news-changed*
|
||||
|
||||
The following changes to existing APIs or features add new behavior.
|
||||
These existing features changed their behavior.
|
||||
|
||||
• |vim.tbl_contains()| now works for general tables and allows specifying a
|
||||
predicate function that is checked for each value. (Use |vim.list_contains()|
|
||||
for checking list-like tables (integer keys without gaps) for literal values.)
|
||||
• API:
|
||||
• |nvim_buf_call()| and |nvim_win_call()| now preserve any return value (NB:
|
||||
not multiple return values)
|
||||
|
||||
• |vim.region()| can use a string accepted by |getpos()| as position.
|
||||
• Editor
|
||||
• |gx| now uses |vim.ui.open()| and not netrw. To customize, you can redefine
|
||||
`vim.ui.open` or remap `gx`. To continue using netrw (deprecated): >vim
|
||||
:call netrw#BrowseX(expand(exists("g:netrw_gx")? g:netrw_gx : '<cfile>'), netrw#CheckIfRemote())<CR>
|
||||
|
||||
• |vim.on_key()| callbacks receive a second argument for keys typed before
|
||||
mappings are applied.
|
||||
• LSP:
|
||||
• LSP hover and signature help now use Treesitter for highlighting of
|
||||
Markdown content. Note that highlighting of code examples requires
|
||||
a matching parser and may be affected by custom queries.
|
||||
• |LspRequest| autocmd callbacks contain more information about the LSP
|
||||
request status update that occurred.
|
||||
|
||||
• |vim.diagnostic.config()| now accepts a function for the virtual_text.prefix
|
||||
option, which allows for rendering e.g., diagnostic severities differently.
|
||||
• Lua:
|
||||
• |vim.wait()| cannot be called in |api-fast|.
|
||||
• |vim.diagnostic.config()| now accepts virtual text relevant options to
|
||||
|nvim_buf_set_extmark()| (e.g. "virt_text_pos" and "hl_mode") in its
|
||||
"virtual_text" table, which gives users more control over how diagnostic
|
||||
virtual text is displayed.
|
||||
• |vim.diagnostic.get()| and |vim.diagnostic.count()| accept multiple
|
||||
namespaces rather than just a single namespace.
|
||||
• |vim.diagnostic.enable()| gained new parameters, and the old signature is
|
||||
deprecated.
|
||||
• |vim.diagnostic.config()| now accepts a function for the virtual_text.prefix
|
||||
option, which allows for rendering e.g., diagnostic severities differently.
|
||||
|
||||
• Defaults:
|
||||
• On Windows 'isfname' does not include ":". Drive letters are handled
|
||||
correctly without it. (Use |gF| for filepaths suffixed with ":line:col").
|
||||
• 'comments' includes "fb:•".
|
||||
• 'shortmess' includes the "C" flag.
|
||||
• 'grepprg' uses the -H and -I flags for grep by default,
|
||||
and defaults to using ripgrep if available.
|
||||
• "]d" and "[d" in Normal mode map to |vim.diagnostic.goto_next()| and
|
||||
|vim.diagnostic.goto_prev()|, respectively. |]d-default| |[d-default|
|
||||
• <C-W>d (and <C-W><C-D>) map to |vim.diagnostic.open_float()|
|
||||
|CTRL-W_d-default|
|
||||
• Automatic linting of treesitter query files (see |ft-query-plugin|).
|
||||
Can be disabled via: >lua
|
||||
vim.g.query_lint_on = {}
|
||||
<
|
||||
• Enabled treesitter highlighting for treesitter query files.
|
||||
• Enabled treesitter highlighting for help files.
|
||||
• Enabled treesitter highlighting for Lua files.
|
||||
• Options
|
||||
• Attempting to set an invalid keycode option (e.g. `set t_foo=123`) no
|
||||
longer gives an error.
|
||||
|
||||
• The `workspace/didChangeWatchedFiles` LSP client capability is now enabled
|
||||
by default on Mac and Windows. Disabled on Linux since there currently isn't
|
||||
a viable backend for watching files that scales well for large directories.
|
||||
|
||||
• |LspRequest| autocmd callbacks now contain additional information about the LSP
|
||||
request status update that occurred.
|
||||
|
||||
• |:source| without arguments treats a buffer with its 'filetype' set to "lua"
|
||||
as Lua code regardless of its extension.
|
||||
|
||||
• |:lua| with a |[range]| executes that range in the current buffer as Lua code
|
||||
regardless of its extension.
|
||||
|
||||
• |:Man| now respects 'wrapmargin'
|
||||
|
||||
• |gx| now uses |vim.ui.open()| and not netrw. To customize, you can redefine
|
||||
`vim.ui.open` or remap `gx`. To continue using netrw (deprecated): >vim
|
||||
|
||||
:call netrw#BrowseX(expand(exists("g:netrw_gx")? g:netrw_gx : '<cfile>'), netrw#CheckIfRemote())<CR>
|
||||
|
||||
• |vim.lsp.start()| now creates the following default keymaps (assuming the
|
||||
server supports the feature):
|
||||
- |K| in Normal mode maps to |vim.lsp.buf.hover()|, unless |'keywordprg'|
|
||||
was customized before calling |vim.lsp.start()|.
|
||||
|
||||
• Terminal buffers started with no arguments (and use 'shell') close
|
||||
automatically if the job exited without error, eliminating the (often
|
||||
unwanted) "[Process exited 0]" message.
|
||||
|
||||
• |vim.diagnostic.config()| now accepts virtual text relevant options to
|
||||
|nvim_buf_set_extmark()| (e.g. "virt_text_pos" and "hl_mode") in its
|
||||
"virtual_text" table, which gives users more control over how diagnostic
|
||||
virtual text is displayed.
|
||||
|
||||
• |vim.diagnostic.get()| and |vim.diagnostic.count()| accept multiple
|
||||
namespaces rather than just a single namespace.
|
||||
|
||||
• |vim.diagnostic.enable()| gained new parameters, and the old signature is
|
||||
deprecated.
|
||||
|
||||
• Extmarks now fully support multi-line ranges, and a single extmark can be
|
||||
used to highlight a range of arbitrary length. The |nvim_buf_set_extmark()|
|
||||
API function already allowed you to define such ranges, but highlight regions
|
||||
were not rendered consistently for a range that covers more than one line break.
|
||||
This has now been fixed. Signs defined as part of a multi-line extmark also
|
||||
apply to every line in the range, not just the first.
|
||||
In addition, |nvim_buf_get_extmarks()| has gained an "overlap" option to
|
||||
return such ranges even if they started before the specified position.
|
||||
|
||||
• The following flags were added to |nvim_buf_set_extmark()|:
|
||||
- "undo_restore": opt-out extmarks of precise undo tracking.
|
||||
- "invalidate": automatically hide or delete extmarks.
|
||||
- "virt_text_repeat_linebreak": repeat virtual text on wrapped lines.
|
||||
|
||||
• LSP hover and signature help now use Treesitter for highlighting of Markdown
|
||||
content.
|
||||
Note that syntax highlighting of code examples requires a matching parser
|
||||
and may be affected by custom queries.
|
||||
|
||||
• Support for rendering multibyte characters using composing characters has been
|
||||
enhanced. The maximum limit have been increased from 1+6 codepoints to
|
||||
31 bytes, which is guaranteed to fit all chars from before but often more.
|
||||
|
||||
NOTE: the regexp engine still has a hard-coded limit of considering
|
||||
6 composing chars only.
|
||||
|
||||
• |vim.wait()| is no longer allowed to be called in |api-fast|.
|
||||
|
||||
• Vimscript function |exists()| supports checking |v:lua| functions.
|
||||
|
||||
• Added "force_crlf" option field in |nvim_open_term()|.
|
||||
|
||||
• Attempting to set an invalid keycode option (e.g. `set t_foo=123`) no longer
|
||||
gives an error.
|
||||
|
||||
• Passing 0 to |nvim_get_chan_info()| gets info about the current channel.
|
||||
|
||||
• |:checkhealth| buffer can now be opened in a split window using modifiers like
|
||||
|:vertical|, |:horizontal| and |:botright|.
|
||||
|
||||
• |nvim_open_win()| and |nvim_win_set_config()| now support opening normal (split)
|
||||
windows, moving floating windows into split windows, and opening windows in
|
||||
non-current tabpages.
|
||||
|
||||
• 'errorfile' (|-q|) accepts `-` as an alias for stdin.
|
||||
|
||||
• |--startuptime| reports the startup times for both processes (TUI + server) as separate sections.
|
||||
|
||||
• |nvim_buf_call()| and |nvim_win_call()| now preserves any return value (NB: not multiple return values)
|
||||
• Terminal
|
||||
• Terminal buffers started with no arguments (and use 'shell') close
|
||||
automatically if the job exited without error, eliminating the (often
|
||||
unwanted) "[Process exited 0]" message.
|
||||
|
||||
• Treesitter
|
||||
• |Query:iter_matches()|, |vim.treesitter.query.add_predicate()|, and
|
||||
@ -534,7 +454,7 @@ The following changes to existing APIs or features add new behavior.
|
||||
==============================================================================
|
||||
REMOVED FEATURES *news-removed*
|
||||
|
||||
The following deprecated functions or APIs were removed.
|
||||
These deprecated features were removed.
|
||||
|
||||
• Vimball support
|
||||
- :Vimuntar command
|
||||
|
@ -1321,7 +1321,11 @@ LanguageTree:included_regions() *LanguageTree:included_regions()*
|
||||
(`table<integer, Range6[]>`)
|
||||
|
||||
LanguageTree:invalidate({reload}) *LanguageTree:invalidate()*
|
||||
Invalidates this parser and all its children
|
||||
Invalidates this parser and its children.
|
||||
|
||||
Should only be called when the tracked state of the LanguageTree is not
|
||||
valid against the parse tree in treesitter. Doesn't clear filesystem
|
||||
cache. Called often, so needs to be fast.
|
||||
|
||||
Parameters: ~
|
||||
• {reload} (`boolean?`)
|
||||
|
@ -6,11 +6,10 @@ error('Cannot require a meta file')
|
||||
-- with types being renamed to include the vim namespace and with some descriptions made less verbose.
|
||||
|
||||
--- @brief <pre>help
|
||||
--- LPeg is a pattern-matching library for Lua, based on
|
||||
--- Parsing Expression Grammars (https://bford.info/packrat/) (PEGs).
|
||||
--- LPeg is a pattern-matching library for Lua, based on Parsing Expression
|
||||
--- Grammars (PEGs). https://bford.info/packrat/
|
||||
---
|
||||
--- *lua-lpeg*
|
||||
--- *vim.lpeg.Pattern*
|
||||
--- *lua-lpeg* *vim.lpeg.Pattern*
|
||||
--- The LPeg library for parsing expression grammars is included as `vim.lpeg`
|
||||
--- (https://www.inf.puc-rio.br/~roberto/lpeg/).
|
||||
---
|
||||
|
@ -8,11 +8,11 @@ error('Cannot require a meta file')
|
||||
-- See 'lpeg.html' for license
|
||||
|
||||
--- @brief
|
||||
--- The `vim.re` module provides a conventional regex-like syntax for pattern usage
|
||||
--- within LPeg |vim.lpeg|.
|
||||
--- The `vim.re` module provides a conventional regex-like syntax for pattern usage within LPeg
|
||||
--- |vim.lpeg|. (Unrelated to |vim.regex| which provides Vim |regexp| from Lua.)
|
||||
---
|
||||
--- See https://www.inf.puc-rio.br/~roberto/lpeg/re.html for the original
|
||||
--- documentation including regex syntax and more concrete examples.
|
||||
--- See https://www.inf.puc-rio.br/~roberto/lpeg/re.html for the original documentation including
|
||||
--- regex syntax and examples.
|
||||
|
||||
--- Compiles the given {string} and returns an equivalent LPeg pattern. The given string may define
|
||||
--- either an expression or a grammar. The optional {defs} table provides extra Lua values to be used
|
||||
|
@ -136,7 +136,8 @@ end
|
||||
--- local hint = vim.lsp.inlay_hint.get({ bufnr = 0 })[1] -- 0 for current buffer
|
||||
---
|
||||
--- local client = vim.lsp.get_client_by_id(hint.client_id)
|
||||
--- resolved_hint = client.request_sync('inlayHint/resolve', hint.inlay_hint, 100, 0).result
|
||||
--- local resp = client.request_sync('inlayHint/resolve', hint.inlay_hint, 100, 0)
|
||||
--- local resolved_hint = assert(resp and resp.result, resp.err)
|
||||
--- vim.lsp.util.apply_text_edits(resolved_hint.textEdits, 0, client.encoding)
|
||||
---
|
||||
--- location = resolved_hint.label[1].location
|
||||
|
@ -532,10 +532,9 @@ end
|
||||
|
||||
--- @alias vim.snippet.Direction -1 | 1
|
||||
|
||||
--- Jumps within the active snippet in the given direction.
|
||||
--- If the jump isn't possible, the function call does nothing.
|
||||
--- Jumps to the next (or previous) placeholder in the current snippet, if possible.
|
||||
---
|
||||
--- You can use this function to navigate a snippet as follows:
|
||||
--- For example, map `<Tab>` to jump while a snippet is active:
|
||||
---
|
||||
--- ```lua
|
||||
--- vim.keymap.set({ 'i', 's' }, '<Tab>', function()
|
||||
|
@ -225,7 +225,10 @@ function LanguageTree:_log(...)
|
||||
self._logger('nvim', table.concat(msg, ' '))
|
||||
end
|
||||
|
||||
--- Invalidates this parser and all its children
|
||||
--- Invalidates this parser and its children.
|
||||
---
|
||||
--- Should only be called when the tracked state of the LanguageTree is not valid against the parse
|
||||
--- tree in treesitter. Doesn't clear filesystem cache. Called often, so needs to be fast.
|
||||
---@param reload boolean|nil
|
||||
function LanguageTree:invalidate(reload)
|
||||
self._valid = false
|
||||
|
@ -4,27 +4,29 @@
|
||||
# changelog header
|
||||
header = """
|
||||
# Changelog\n
|
||||
All notable changes to this project will be documented in this file.\n
|
||||
For notable changes, see runtime/doc/news.txt (or `:help news` in Nvim).\n
|
||||
Following is a list of fixes/features commits.\n
|
||||
"""
|
||||
# template for the changelog body
|
||||
# https://github.com/Keats/tera
|
||||
# https://keats.github.io/tera/docs/
|
||||
body = """
|
||||
{% if version %}\
|
||||
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
|
||||
# [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
|
||||
{% else %}\
|
||||
## [unreleased]
|
||||
# [unreleased]
|
||||
{% endif %}\
|
||||
{% for group, commits in commits | group_by(attribute="group") %}
|
||||
### {{ group | striptags | upper_first }}
|
||||
{{ group | striptags | upper_first }}
|
||||
--------------------------------------------------------------------------------
|
||||
{% for commit in commits | sort(attribute="message")%}\
|
||||
{% if not commit.scope %}\
|
||||
- {{ commit.message }}
|
||||
- {{ commit.id | truncate(length=12, end="") }} {{ commit.message }}
|
||||
{% endif %}\
|
||||
{% endfor %}\
|
||||
{% for group, commits in commits | group_by(attribute="scope") %}\
|
||||
{% for commit in commits | sort(attribute="message") %}\
|
||||
- **{{commit.scope}}**: {{ commit.message }}
|
||||
- {{ commit.id | truncate(length=12, end="") }} {{commit.scope}}: {{ commit.message }}
|
||||
{% endfor %}\
|
||||
{% endfor %}
|
||||
{% endfor %}\n
|
||||
@ -45,18 +47,18 @@ commit_preprocessors = [
|
||||
]
|
||||
# regex for parsing and grouping commits
|
||||
commit_parsers = [
|
||||
{ message = "!:", group = "<!-- 0 -->Breaking"},
|
||||
{ message = "^feat", group = "<!-- 1 -->Features"},
|
||||
{ message = "^fix", group = "<!-- 2 -->Bug Fixes"},
|
||||
{ message = "^perf", group = "<!-- 3 -->Performance"},
|
||||
{ message = "^build", group = "<!-- 4 -->Build System"},
|
||||
{ message = "^vim-patch", group = "<!-- 5 -->Vim patches"},
|
||||
{ message = "^refactor", group = "<!-- 6 -->Refactor" },
|
||||
{ message = "!:", group = "<!-- 0 -->BREAKING"},
|
||||
{ message = "^feat", group = "<!-- 1 -->FEATURES"},
|
||||
{ message = "^fix", group = "<!-- 2 -->FIXES"},
|
||||
{ message = "^perf", group = "<!-- 3 -->PERFORMANCE"},
|
||||
{ message = "^build", group = "<!-- 4 -->BUILD"},
|
||||
{ message = "^vim-patch", group = "<!-- 5 -->VIM PATCHES"},
|
||||
{ message = "^refactor", group = "<!-- 6 -->REFACTOR" },
|
||||
{ message = "^ci", group = "<!-- 8 -->CI" },
|
||||
{ message = "^test", group = "<!-- 9 -->Testing" },
|
||||
{ message = "^docs", group = "<!-- 99 -->Documentation" },
|
||||
{ message = "^revert", group = "<!-- 999 -->Reverted Changes" },
|
||||
{ message = ".*", group = "<!-- 9999 -->Other"},
|
||||
{ message = "^test", group = "<!-- 9 -->TESTING" },
|
||||
{ message = "^docs", group = "<!-- 99 -->DOCUMENTATION" },
|
||||
{ message = "^revert", group = "<!-- 999 -->REVERTED CHANGES" },
|
||||
{ message = ".*", group = "<!-- 9999 -->OTHER"},
|
||||
]
|
||||
# filter out the commits that are not matched by commit parsers
|
||||
filter_commits = true
|
||||
|
@ -63,10 +63,15 @@ local new_layout = {
|
||||
['channel.txt'] = true,
|
||||
['deprecated.txt'] = true,
|
||||
['develop.txt'] = true,
|
||||
['dev_style.txt'] = true,
|
||||
['dev_theme.txt'] = true,
|
||||
['dev_tools.txt'] = true,
|
||||
['dev_vimpatch.txt'] = true,
|
||||
['lua.txt'] = true,
|
||||
['luaref.txt'] = true,
|
||||
['news.txt'] = true,
|
||||
['news-0.9.txt'] = true,
|
||||
['news-0.10.txt'] = true,
|
||||
['nvim.txt'] = true,
|
||||
['pi_health.txt'] = true,
|
||||
['provider.txt'] = true,
|
||||
|
@ -1,52 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Prints a nicely-formatted commit history.
|
||||
# - Commits are grouped below their merge-commit.
|
||||
# - Issue numbers are moved next to the commit-id.
|
||||
#
|
||||
# Parameters:
|
||||
# $1 "since" commit
|
||||
# $2 "inverse match" regex pattern
|
||||
|
||||
set -e
|
||||
set -u
|
||||
set -o pipefail
|
||||
|
||||
__SINCE=$1
|
||||
__INVMATCH=$2
|
||||
|
||||
is_merge_commit() {
|
||||
git rev-parse "$1" >/dev/null 2>&1 \
|
||||
|| { echo "ERROR: invalid commit: $1"; exit 1; }
|
||||
git log "$1"^2 >/dev/null 2>&1 && return 0 || return 1
|
||||
}
|
||||
|
||||
# Removes parens from issue/ticket/PR numbers.
|
||||
#
|
||||
# Example:
|
||||
# in: 3340e08becbf foo (#9423)
|
||||
# out: 3340e08becbf foo #9423
|
||||
_deparen() {
|
||||
sed 's/(\(\#[0-9]\{3,\}\))/\1/g'
|
||||
}
|
||||
|
||||
# Cleans up issue/ticket/PR numbers in the commit descriptions.
|
||||
#
|
||||
# Example:
|
||||
# in: 3340e08becbf foo (#9423)
|
||||
# out: 3340e08becbf #9423 foo
|
||||
_format_ticketnums() {
|
||||
nvim -Es +'g/\v(#[0-9]{3,})/norm! ngEldE0ep' +'%p' | _deparen
|
||||
}
|
||||
|
||||
for commit in $(git log --format='%H' --first-parent "$__SINCE"..HEAD); do
|
||||
if is_merge_commit "${commit}" ; then
|
||||
if [ -z "$__INVMATCH" ] || ! git log --oneline "${commit}^1..${commit}^2" \
|
||||
| >/dev/null 2>&1 grep -E "$__INVMATCH" ; then
|
||||
git log -1 --oneline "${commit}"
|
||||
git log --format=' %h %s' "${commit}^1..${commit}^2"
|
||||
fi
|
||||
else
|
||||
git log -1 --oneline "${commit}"
|
||||
fi
|
||||
done | _format_ticketnums
|
@ -31,30 +31,28 @@ __DATE=$(date +'%Y-%m-%d')
|
||||
__LAST_TAG=$(git describe --abbrev=0)
|
||||
[ -z "$__LAST_TAG" ] && { echo 'ERROR: no tag found'; exit 1; }
|
||||
__VERSION_MAJOR=$(grep 'set(NVIM_VERSION_MAJOR' CMakeLists.txt\
|
||||
|$__sed 's/.*NVIM_VERSION_MAJOR ([[:digit:]]).*/\1/')
|
||||
|$__sed 's/.*NVIM_VERSION_MAJOR ([[:digit:]]+).*/\1/')
|
||||
__VERSION_MINOR=$(grep 'set(NVIM_VERSION_MINOR' CMakeLists.txt\
|
||||
|$__sed 's/.*NVIM_VERSION_MINOR ([[:digit:]]).*/\1/')
|
||||
|$__sed 's/.*NVIM_VERSION_MINOR ([[:digit:]]+).*/\1/')
|
||||
__VERSION_PATCH=$(grep 'set(NVIM_VERSION_PATCH' CMakeLists.txt\
|
||||
|$__sed 's/.*NVIM_VERSION_PATCH ([[:digit:]]).*/\1/')
|
||||
|$__sed 's/.*NVIM_VERSION_PATCH ([[:digit:]]+).*/\1/')
|
||||
__VERSION="${__VERSION_MAJOR}.${__VERSION_MINOR}.${__VERSION_PATCH}"
|
||||
__API_LEVEL=$(grep 'set(NVIM_API_LEVEL ' CMakeLists.txt\
|
||||
|$__sed 's/.*NVIM_API_LEVEL ([[:digit:]]).*/\1/')
|
||||
|$__sed 's/.*NVIM_API_LEVEL ([[:digit:]]+).*/\1/')
|
||||
{ [ -z "$__VERSION_MAJOR" ] || [ -z "$__VERSION_MINOR" ] || [ -z "$__VERSION_PATCH" ]; } \
|
||||
&& { echo "ERROR: version parse failed: '${__VERSION}'"; exit 1; }
|
||||
__RELEASE_MSG="NVIM v${__VERSION}
|
||||
|
||||
FEATURES:
|
||||
|
||||
FIXES:
|
||||
|
||||
CHANGES:
|
||||
|
||||
"
|
||||
__BUMP_MSG="version bump"
|
||||
|
||||
echo "Most recent tag: ${__LAST_TAG}"
|
||||
echo "Release version: ${__VERSION}"
|
||||
|
||||
_git_log_pretty() {
|
||||
git cliff --config scripts/cliff.toml --unreleased || echo 'git cliff failed'
|
||||
}
|
||||
|
||||
_do_release_commit() {
|
||||
$__sed -i.bk 's/(NVIM_VERSION_PRERELEASE) "-dev"/\1 ""/' CMakeLists.txt
|
||||
if grep '(NVIM_API_PRERELEASE true)' CMakeLists.txt > /dev/null; then
|
||||
@ -73,7 +71,7 @@ _do_release_commit() {
|
||||
echo "Building changelog since ${__LAST_TAG}..."
|
||||
|
||||
git add CMakeLists.txt
|
||||
(echo "${__RELEASE_MSG}"; ./scripts/git-log-pretty-since.sh "$__LAST_TAG" 'vim-patch:[^[:space:]]') | git commit --edit -F -
|
||||
(echo "${__RELEASE_MSG}"; _git_log_pretty) | git commit --edit -F -
|
||||
fi
|
||||
|
||||
git tag --sign -a v"${__VERSION}" -m "NVIM v${__VERSION}"
|
||||
|
Loading…
Reference in New Issue
Block a user