Commit Graph

5122 Commits

Author SHA1 Message Date
bfredl
442f297c63 refactor(build): remove INCLUDE_GENERATED_DECLARATIONS guards
These are not needed after #35129 but making uncrustify still play nice
with them was a bit tricky.

Unfortunately `uncrustify --update-config-with-doc` breaks strings
with backslashes. This issue has been reported upstream,
and in the meanwhile auto-update on every single run has been disabled.
2025-08-14 09:34:38 +02:00
zeertzjq
6f0ef8a5f2 vim-patch:c93a2b3: runtime(doc): Adapt fuzzy doc to reflect 'fzy' algorithm
closes: vim/vim#17988

c93a2b3327

Co-authored-by: Girish Palya <girishji@gmail.com>
2025-08-14 06:48:31 +08:00
zeertzjq
869000e7ce vim-patch:9.1.1627: fuzzy matching can be improved
Problem:  fuzzy-matching can be improved
Solution: Implement a better fuzzy matching algorithm
          (Girish Palya)

Replace fuzzy matching algorithm with improved fzy-based implementation

The
[current](https://www.forrestthewoods.com/blog/reverse_engineering_sublime_texts_fuzzy_match/)
fuzzy matching algorithm has several accuracy issues:

* It struggles with CamelCase
* It fails to prioritize matches at the beginning of strings, often
  ranking middle matches higher.

After evaluating alternatives (see my comments
[here](https://github.com/vim/vim/issues/17531#issuecomment-3112046897)
and
[here](https://github.com/vim/vim/issues/17531#issuecomment-3121593900)),
I chose to adopt the [fzy](https://github.com/jhawthorn/fzy) algorithm,
which:

* Resolves the aforementioned issues.
* Performs better.

Implementation details

This version is based on the original fzy
[algorithm](https://github.com/jhawthorn/fzy/blob/master/src/match.c),
with one key enhancement: **multibyte character support**.

* The original implementation supports only ASCII.
* This patch replaces ascii lookup tables with function calls, making it
  compatible with multibyte character sets.
* Core logic (`match_row()` and `match_positions()`) remains faithful to
  the original, but now operates on codepoints rather than single-byte
  characters.

Performance

Tested against a dataset of **90,000 Linux kernel filenames**. Results
(in milliseconds) show a **\~2x performance improvement** over the
current fuzzy matching algorithm.

```
Search String            Current Algo    FZY Algo
-------------------------------------------------
init                          131.759    66.916
main                          83.688     40.861
sig                           98.348     39.699
index                         109.222    30.738
ab                            72.222     44.357
cd                            83.036     54.739
a                             58.94      62.242
b                             43.612     43.442
c                             64.39      67.442
k                             40.585     36.371
z                             34.708     22.781
w                             38.033     30.109
cpa                           82.596     38.116
arz                           84.251     23.964
zzzz                          35.823     22.75
dimag                         110.686    29.646
xa                            43.188     29.199
nha                           73.953     31.001
nedax                         94.775     29.568
dbue                          79.846     25.902
fp                            46.826     31.641
tr                            90.951     55.883
kw                            38.875     23.194
rp                            101.575    55.775
kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 48.519     30.921
```

```vim
vim9script

var haystack = readfile('/Users/gp/linux.files')

var needles = ['init', 'main', 'sig', 'index', 'ab', 'cd', 'a', 'b',
'c', 'k',
    'z', 'w', 'cpa', 'arz', 'zzzz', 'dimag', 'xa', 'nha', 'nedax',
'dbue',
    'fp', 'tr', 'kw', 'rp', 'kkkkkkkkkkkkkkkkkkkkkkkkkkkkk']
for needle in needles
    var start = reltime()
    var tmp = matchfuzzy(haystack, needle)
    echom $'{needle}' (start->reltime()->reltimefloat() * 1000)
endfor
```

Additional changes

* Removed the "camelcase" option from both matchfuzzy() and
  matchfuzzypos(), as it's now obsolete with the improved algorithm.

related: neovim/neovim#34101
fixes vim/vim#17531
closes: vim/vim#17900

7e0df5eee9

Co-authored-by: Girish Palya <girishji@gmail.com>
2025-08-14 06:48:30 +08:00
Justin M. Keyes
3c7b698d61 Merge #35270 vim.pack: more control over "load" behavior 2025-08-11 18:20:25 -04:00
skewb1k
7cc07e8383 feat(lsp): support signature help noActiveParameterSupport #34838 2025-08-11 14:31:57 -07:00
Maria José Solano
f7802dd5d5 fix(lsp): deprecate vim.lsp.set_log_level, vim.lsp.get_log_path #35274 2025-08-11 13:51:40 -07:00
Riley Bruins
09f2c8d8ed docs(lsp): specify formatting_options type (#35302) 2025-08-11 14:36:35 -04:00
Maria José Solano
e94d8f03b9 fix(lsp): check for lens range in vim.lsp.codelens.run() (#35294) 2025-08-11 12:37:32 -04:00
zeertzjq
03c953008c vim-patch:32d6bd6: runtime(doc): remove dead links (#35297)
related: vim/vim#17879

32d6bd6df2

N/A patch:
vim-patch:8b18345: runtime(doc): Fix 2 minor issues after 32d6bd6df

Co-authored-by: Damien Lejay <damien@lejay.be>
2025-08-11 00:04:30 +00:00
zeertzjq
22d90217c6 vim-patch:partial:fc3c204: runtime(doc): Fix style and typos in builtin.txt and usr_41.txt (#35286)
- Reformat parts to fit into 80 column window.
- Fix example with mandatory call with a range.
  https://github.com/vim/vim/discussions/17950#discussioncomment-14055687
- Remove some duplicate information

closes: vim/vim#17949

fc3c204bbe

Function list changes only.

Co-authored-by: veotos <veotos@users.noreply.github.com>
2025-08-10 08:23:48 +00:00
Evgeni Chasnovski
acff86601e feat(pack): allow skip install confirmation in add()
Problem: No way to skip install confirmation in `add()`. Having install
  confirmation by default is a more secure design. However, users are
  usually aware of the fact that plugin will be installed and there is
  currently no way to skip confirmation.

  Plus it can introduce inconvenience on the clean config initialization
  if it is modularized with many `vim.pack.add()` calls (leads to
  confirming installation many times in a row).

Solution: Add `opts.confirm` option that can skip install confirmation.
2025-08-09 17:54:39 +03:00
Evgeni Chasnovski
dd828690c7 feat(pack): allow function opts.load in add()
Problem: No way to have full control over how plugin is loaded.
  Although `:packadd!` has small side effects (only adds plugin
  directory to 'runtimepath'; and maybe its 'after/' subdirectory), it
  still has side effects. For example, 'plugin/' directories are still
  loaded during startup (as part of `:h load-plugins`).

Solution: Allow function `opts.load` that has full control over how
  plugin is loaded.
2025-08-09 17:36:15 +03:00
Evgeni Chasnovski
b337c6e0fc fix(pack): update add() to have default load=false during startup
Problem: the `load=true` in `vim.pack.add()` means that `:packadd` is
  executed even during startup. This leads to force source of 'plugin/',
  which breaks the intended loading order (`:h load-plugins`) and
  results into sourcing them twice. This also makes it ignore
  `--noplugin` argument.

  Using `:packadd!` during startup is more appropriate, while `:packadd`
  afterwards is still more favorable to actually force 'plugin/' source
  (as there is no pre-defined mechanism that will load them later).

Solution: have `load=false` default during startup, `true` - afterwards.
2025-08-09 17:36:15 +03:00
zeertzjq
acc55f6fed vim-patch:7132935: runtime(java): Manage byte limits for variable-width lookbehind assertions
Raise the byte limits from 80 to 120 for "javaFuncDef" and
"java*CommentTitle"; and support selecting other arbitrary
values with
------------------------------------------------------------
	let g:java_lookbehind_byte_counts = {
		\ 'javaMarkdownCommentTitle': 240,
	\ }
------------------------------------------------------------

for related groups of syntax definitions, referring to their
names with dictionary keys.

Over-80-Byte-Limit Lookbehind Examples:
https://raw.githubusercontent.com/openjdk/jdk/refs/tags/jdk-24%2B36/src/java.base/share/classes/sun/security/x509/NamedX509Key.java [Lines 43 & 44]
https://raw.githubusercontent.com/openjdk/jdk/refs/tags/jdk-24%2B36/src/jdk.compiler/share/classes/com/sun/tools/javac/util/GraphUtils.java [Line 154]

closes: vim/vim#17921

7132935413

Co-authored-by: Aliaksei Budavei <0x000c70@gmail.com>
2025-08-09 21:03:56 +08:00
Gregory Anders
a0d94ac469 docs(lsp): add reference to progress indicator protocol (#35215) 2025-08-08 09:59:14 -05:00
zeertzjq
798cb0f19a vim-patch:9.1.1605: cannot specify scope for chdir() (#35239)
Problem:  Cannot specify scope for chdir()
Solution: Add optional scope argument (kuuote)

closes: vim/vim#17888

8a65a49d50

Co-authored-by: kuuote <znmxodq1@gmail.com>
2025-08-08 13:50:41 +00:00
zeertzjq
75d38bb844 vim-patch:d82c918: runtime(doc): Improve doc for cmdline-autocomplete (#35235)
Maybe this was unnecessary, but saw this:
https://github.com/vim/vim/issues/17854

d82c918e2f

Co-authored-by: Girish Palya <girishji@gmail.com>
2025-08-08 21:01:54 +08:00
zeertzjq
52c2519095 vim-patch:9.1.1600: using diff anchors with hidden buffers fails silently (#35218)
Problem:  diff: using diff anchors with hidden buffers fails silently
Solution: Give specific error message for diff anchors when using hidden
          buffers (Yee Cheng Chin).

Diff anchors currently will fail to parse if a buffer used for diff'ing
is hidden. Previously it would just fail as the code assumes it would
not happen normally, but this is actually possible to do if `closeoff`
and `hideoff` are not set in diffopt. Git's default diff tool "vimdiff3"
also takes advantage of this.

This fix this properly would require the `{address}` parser to be
smarter about whether a particular address relies on window position or
not (e.g. the `'.` address requires an active window, but `'a` or `1234`
do not). Since hidden diff buffers seem relatively niche, just provide a
better error message / documentation for now. This could be improved
later if there's a demand for it.

related: vim/vim#17615
closes: vim/vim#17904

cad3b2421d

Co-authored-by: Yee Cheng Chin <ychin.git@gmail.com>
2025-08-07 15:56:10 +00:00
zeertzjq
7dbf347dda vim-patch:9c4de84: runtime(doc): Update ft-vim-syntax documentation (#35212)
g:vimsyn_folding and g:vimsyn_embed regexps need to match case.

closes: vim/vim#17914

9c4de84b2d

Co-authored-by: veotos <veotos@users.noreply.github.com>
2025-08-07 22:31:18 +08:00
zeertzjq
654cde369d vim-patch:f7deb81: runtime(doc): fix typo at :h cmdline-autocompletion
The '?' needs to be escaped, because the autocommand is using
file-patterns (glob like) and not a regex). See :h file-pattern

closes: vim/vim#17890

f7deb815b0

Co-authored-by: Girish Palya <girishji@gmail.com>
2025-08-07 06:33:51 +08:00
zeertzjq
cc25cd2cb7 vim-patch:bb0860a: runtime(doc): tweak option name notation further
related: vim/vim#17857
closes: vim/vim#17917

bb0860abc9

Co-authored-by: Hirohito Higashi <h.east.727@gmail.com>
2025-08-07 06:33:21 +08:00
zeertzjq
b4c092a092 Merge pull request #35187 from zeertzjq/vim-85cd509
vim-patch: doc updates
2025-08-06 20:51:14 +08:00
Gregory Anders
851a622806 docs(lsp): include snippet to display progress using native indicator (#35176) 2025-08-06 07:31:02 -05:00
zeertzjq
5b3606b2c4 vim-patch:067adc1: runtime(doc): add back bars for the '' mark
this was erroneously changed in commit
85cd509885a05c3a6bb029fb378b1295f107f8f6

related: vim/vim#17857

067adc1ff2
2025-08-06 20:25:29 +08:00
zeertzjq
60dca47ae4 vim-patch:85cd509: runtime(doc): Use correct option-name tags
closes: vim/vim#17857

85cd509885

Omit 'completepopup' and v:colornames.

Co-authored-by: Hirohito Higashi <h.east.727@gmail.com>
2025-08-06 20:25:29 +08:00
zeertzjq
a3921d2be6 vim-patch:3769100: runtime(doc): fix mismatch between 'backspace' and |i_backspacing| (#35185)
closes: vim/vim#17867

3769100a8e

Co-authored-by: Emilien Breton <bricktech2000@gmail.com>
2025-08-06 11:41:43 +00:00
zeertzjq
72d3ffd716 vim-patch:a7a2a2b: runtime(doc): Tweak documentation style (#35184)
closes: vim/vim#17862

a7a2a2b5ae

Co-authored-by: Hirohito Higashi <h.east.727@gmail.com>
2025-08-06 10:52:53 +00:00
Maria José Solano
54bfd0de4f docs(lsp): mention default enablement of document colors (#35153) 2025-08-03 15:03:14 -07:00
Yi Ming
7ed8cbd095 feat(lua): vim.list.bisect() #35108 2025-08-03 07:45:49 -07:00
skewb1k
40aef0d02e fix(lsp): decode 'null' in server responses as vim.NIL #34849
Problem:
Previously, 'null' value in LSP responses were decoded as 'nil'.
This caused ambiguity for fields typed as '? | null' and led to
loss of explicit 'null' values, particularly in 'data' parameters.

Solution:
Decode all JSON 'null' values as 'vim.NIL' and adjust handling
where needed. This better aligns with the LSP specification,
where 'null' and absent fields are distinct, and 'null' should
not be used to represent missing values.

This also enables proper validation of response messages to
ensure that exactly one of 'result' or 'error' is present, as
required by the JSON-RPC specification.
2025-08-03 07:42:44 -07:00
bfredl
9910445125 fix(options): make 'cdhome' take effect on any platform
Platform specific options are cringe and should either be fixed or
deleted.

In this case, the platform difference can trivially be implemented
using a conditional default value. If the user overrides the value,
then it is because the user wants that value, regardless of the
corporation who manufactured the OS that the user is running.

Possible alternative: delete the option by making it always on.
2025-08-03 09:42:35 +02:00
Sathya Pramodh
78f4994627 feat: ":restart [cmd]" can run commands #35045
Problem:
Not easy for a user to tell ":restart" to "run this command(s) after restarting".

Solution:
All ":restart" args following the optional +cmd arg are treated as a big cmdline that is passed as a "-c" CLI arg when restarting nvim.
2025-08-02 22:50:45 -07:00
Justin M. Keyes
39e402caa5 docs: reorder sections #35140
Problem:
Generated docs sections are ordered randomly. This matters when showing
an outline or table of contents (e.g. `gO`).

Solution:
Specify which sections have an intentional ordering; sort the rest by
name.
2025-08-03 05:03:09 +00:00
zeertzjq
f7af0cff35 vim-patch:9.1.1590: cannot perform autocompletion (#35141)
Problem:  cannot perform autocompletion
Solution: Add the 'autocomplete' option value
          (Girish Palya)

This change introduces the 'autocomplete' ('ac') boolean option to
enable automatic popup menu completion during insert mode. When enabled,
Vim shows a completion menu as you type, similar to pressing |i\_CTRL-N|
manually. The items are collected from sources defined in the
'complete' option.

To ensure responsiveness, this feature uses a time-sliced strategy:

- Sources earlier in the 'complete' list are given more time.
- If a source exceeds its allocated timeout, it is interrupted.
- The next source is then started with a reduced timeout (exponentially
  decayed).
- A small minimum ensures every source still gets a brief chance to
  contribute.

The feature is fully compatible with other |i_CTRL-X| completion modes,
which can temporarily suspend automatic completion when triggered.

See :help 'autocomplete' and :help ins-autocompletion for more details.

To try it out, use :set ac

You should see a popup menu appear automatically with suggestions. This
works seamlessly across:

- Large files (multi-gigabyte size)
- Massive codebases (:argadd thousands of .c or .h files)
- Large dictionaries via the `k` option
- Slow or blocking LSP servers or user-defined 'completefunc'

Despite potential slowness in sources, the menu remains fast,
responsive, and useful.

Compatibility: This mode is fully compatible with existing completion
methods. You can still invoke any CTRL-X based completion (e.g.,
CTRL-X CTRL-F for filenames) at any time (CTRL-X temporarily
suspends 'autocomplete'). To specifically use i_CTRL-N, dismiss the
current popup by pressing CTRL-E first.

---

How it works

To keep completion snappy under all conditions, autocompletion uses a
decaying time-sliced algorithm:

- Starts with an initial timeout (80ms).
- If a source does not complete within the timeout, it's interrupted and
  the timeout is halved for the next source.
- This continues recursively until a minimum timeout (5ms) is reached.
- All sources are given a chance, but slower ones are de-prioritized
  quickly.

Most of the time, matches are computed well within the initial window.

---

Implementation details

- Completion logic is mostly triggered in `edit.c` and handled in
  insexpand.c.

- Uses existing inc_compl_check_keys() mechanism, so no new polling
  hooks are needed.

- The completion system already checks for user input periodically; it
  now also checks for timer expiry.

---

Design notes

- The menu doesn't continuously update after it's shown to prevent
  visual distraction (due to resizing) and ensure the internal list
  stays synchronized with the displayed menu.

- The 'complete' option determines priority—sources listed earlier get
  more time.

- The exponential time-decay mechanism prevents indefinite collection,
  contributing to low CPU usage and a minimal memory footprint.

- Timeout values are intentionally not configurable—this system is
  optimized to "just work" out of the box. If autocompletion feels slow,
  it typically indicates a deeper performance bottleneck (e.g., a slow
  custom function not using `complete_check()`) rather than a
  configuration issue.

---

Performance

Based on testing, the total roundtrip time for completion is generally
under 200ms. For common usage, it often responds in under 50ms on an
average laptop, which falls within the "feels instantaneous" category
(sub-100ms) for perceived user experience.

| Upper Bound (ms) | Perceived UX
|----------------- |-------------
| <100 ms          | Excellent; instantaneous
| <200 ms          | Good; snappy
| >300 ms          | Noticeable lag
| >500 ms          | Sluggish/Broken

---

Why this belongs in core:

- Minimal and focused implementation, tightly integrated with existing
  Insert-mode completion logic.
- Zero reliance on autocommands and external scripting.
- Makes full use of Vim’s highly composable 'complete' infrastructure
  while avoiding the complexity of plugin-based solutions.
- Gives users C native autocompletion with excellent responsiveness and
  no configuration overhead.
- Adds a key UX functionality in a simple, performant, and Vim-like way.

closes: vim/vim#17812

af9a7a04f1

Co-authored-by: Girish Palya <girishji@gmail.com>
2025-08-03 11:48:42 +08:00
Justin M. Keyes
93f5bd0caf Merge #35052 test(pack): vim.pack 2025-08-02 19:35:42 -04:00
Phạm Bình An
3f416ef524 build: bump lua-bitop to 1.0.3 #35063
Source: https://bitop.luajit.org/download.html
2025-08-02 15:58:11 -07:00
Evgeni Chasnovski
ed73ed8283 fix(pack): ensure explicit default version in events (where possible)
Problem: Both `PackChangedPre` and `PackChanged` contain |event-data|
  with plugin's `spec`. It looks like a good idea to have all its
  triggers contain the same format across all kinds ("install",
  "update", "delete"). There are several choices:
    - Have it be as verbatim as supplied to `vim.pack.add()`, i.e. can
      be either string or table. A bit too ambiguous.
    - Have it be table with `src` and `name` inferred. This requires
      less work for "install", but more work for "update" and "delete"
      (since they use `vim.pack.get()` which already infers default
      `version`).
    - Have it be table with *all* defaults made explicit. This looks
      like the best approach, but requires extra care to only infer
      default `version` when needed (i.e. avoid inferring during regular
      load) because it is costly in terms of startup time.
      This might also introduce inconsistency when dealing with
      lockfile(s) as information there should be as close to what user
      supplied as possible. Address that when dealing with lockfile.

Solution: Ensure explicit `version` in all events where possible.
2025-08-02 15:00:42 +03:00
Anton Kastritskii
b79ff967ac feat(statusline): vim.diagnostic.status() #33723
Problem:
Not easy to get a status string for diagnostics.

Solution:
- Add vim.diagnostic.status().
- Add it to the default 'statusline'.
2025-07-29 18:53:57 -07:00
Justin M. Keyes
c81dc320b0 docs: vim.pack 2025-07-28 22:00:25 -04:00
Justin M. Keyes
56a4ef3c21 docs: lsp, ui events, dev guidance, osc7
fix #34981
2025-07-28 22:00:25 -04:00
nyngwang
dc67ba948e feat(exrc): user must view and explicitly run ":trust" #35069
Problem:
It's relatively easy to mispress key `a` to (a)llow arbitrary execution
of 'exrc' files. #35050

Solution:
- For exrc files (not directories), remove "allow" menu item.
  Require the user to "view" and then explicitly `:trust` the file.
2025-07-28 13:11:58 -07:00
Lewis Russell
cf9b36f3d9 feat(lua): add vim.list.unique()
Problem:
No way to deduplicate values in a list in-place

Solution:
Add `vim.list.unique()`
2025-07-28 09:34:06 +01:00
Siddhant Agarwal
5151f635ca feat: serverlist({peer=true}) returns peer addresses #34806
Problem:
serverlist() only lists servers that were started by the current Nvim.

Solution:
Look for other Nvim servers in stdpath("run").
2025-07-27 21:40:04 -07:00
Maria José Solano
d08b265111 feat(lsp): enable document_color by default #35086 2025-07-27 17:11:28 -07:00
Yochem van Rosmalen
35af766de6 refactor(lua): use vim.system #34707 2025-07-23 20:03:30 -07:00
Sathya Pramodh
54b8c99e51 feat: ":restart +cmd" #34788
Problem:
":restart" always executes ":qall" to exit the server.

Solution:
Support ":restart +cmd" so the user can control the command
used to exit the server.

Co-authored-by: Justin M. Keyes <justinkz@gmail.com>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
2025-07-23 19:45:31 -07:00
zeertzjq
e28aee0c72 vim-patch:774fe9d: runtime(doc): remove mention of ftp.vim.org
fixes: vim/vim#17819

774fe9d8fc

Co-authored-by: Christian Brabandt <cb@256bit.org>
2025-07-23 06:28:35 +08:00
zeertzjq
d6704148bc vim-patch:5711d76: runtime(doc): Tweak documentation style
closes: vim/vim#17824

5711d76818

Co-authored-by: Hirohito Higashi <h.east.727@gmail.com>
2025-07-23 06:28:35 +08:00
zeertzjq
c93091395b vim-patch:61cec2e: runtime(doc): Fix typo in :help help-summary
fixes: vim/vim#17816
closes: vim/vim#17823

61cec2e761

Co-authored-by: Doug Kearns <dougkearns@gmail.com>
Co-authored-by: Alain Mosnier <alain@wanamoon.net>
2025-07-23 06:28:35 +08:00
Phạm Bình An
d591275db7 docs: update usr_02.txt #35031
Problem:
- There is reference to gVim in the usr_02.txt file, even though Nvim
  has no built-in GUI.
- `:h help-summary` has a section about optional features (e.g.
  `+conceal`) even though such thing does not exist in Nvim (`:h
  +conceal` will give E149 error).

Solution:
- Remove reference to gVim.
- Replace the section about optional features with a section about Lua.
2025-07-22 15:27:36 -07:00