As a refinement upon "g:sh_no_error", support not matching
particular classes of syntax errors. Look up syntax rule
names and list them with:
‐-----------------------------------------------------------
let g:sh_no_error_rules = ["shCurlyError", "shParenError"]
‐-----------------------------------------------------------
closes: #20935
Signed-off-by: Aliaksei Budavei <0x000c70@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Doug Kearns [Thu, 13 Aug 2026 18:37:58 +0000 (18:37 +0000)]
runtime(vim): Update base syntax, match user-command args
- Trailing bar and tail comments are not explicitly supported. The
command is matched to EOL.
- In Vim9 script the following always matches as an assignment:
UserCommand = 2
Use a leading colon to force matching the user command:
:UserCommand = 2
- Add highlighting for utility commands VimFold\a, Vim9, and VimL.
fixes: #20854
closes: #21035
Signed-off-by: Doug Kearns <dougkearns@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Wed, 12 Aug 2026 21:45:46 +0000 (21:45 +0000)]
patch 9.2.0956: GTK4: crash when the window is resized while redrawing
Problem: In GTK4, Vim may crash when the window is resized while the
cursor is displayed.
Solution: Remember the number of cells the cursor covers when the cursor
is set, instead of deriving it from the drawing position when
the snapshot is taken (Hirohito Higashi).
fixes: #21037
closes: #21038
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Foxe Chen <chen.foxe@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Wed, 12 Aug 2026 21:40:50 +0000 (21:40 +0000)]
patch 9.2.0955: tests: terminal tests are flaky
Problem: Test_terminal_aucmd_on_close() is flaky on MS-Windows: the
tests that wait for a terminal window to close use a timeout
shorter than the default, which is not enough when starting a
process is slow. When the wait fails the test aborts with
E121 and leaves an autocommand behind for the following tests.
Test_terminal_unwraps() checks the buffer contents without
waiting for the job to finish.
Solution: Use the default timeout of WaitForAssert(), initialize the
variable checked after the wait, and wait for the buffer to
hold the unwrapped line.
closes: #21039
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Wed, 12 Aug 2026 20:21:43 +0000 (20:21 +0000)]
patch 9.2.0954: u_read_undo() can be improved (after 9.2.0935)
Problem: u_read_undo() has comments that do not add anything to what
the code says (afte rv9.2.0935).
Solution: Drop the redundant comments (Hirohito Higashi).
related: #20942
closes: #21028
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Wed, 12 Aug 2026 20:17:36 +0000 (20:17 +0000)]
patch 9.2.0953: insert completion code can be improved
Problem: The duplicate-check hashtab in insexpand.c has comments that
do not add anything to what the code says (after v9.2.0909).
Solution: Drop the redundant comments.
related: #20926
closes: #21027
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Wed, 12 Aug 2026 20:08:18 +0000 (20:08 +0000)]
patch 9.2.0952: locking a container while stringifying can be improved
Problem: The comments on locking a list or dict while stringifying its
items say the same thing three times over, and at more length
than the existing comments on the same construct
(after v9.2.0936).
Solution: Shorten them.
related: #21001
closes: #21029
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Wed, 12 Aug 2026 19:47:43 +0000 (19:47 +0000)]
patch 9.2.0950: transstr() can be improved (after 9.2.0906)
Problem: transstr() has comments that do not add anything to what the
code says, and it casts a length to int only to cast it back to
size_t.
Solution: Drop the comments and keep the length in a size_t
(Hirohito Higashi).
related: #20925
closes: #21026
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0949: GDK_KEY_VoidSymbol might be undefined
Problem: Build fails because GDK_KEY_VoidSymbol is undefined
(Hisashi T Fujinaka, after v9.2.0931)
Solution: Define GDK_KEY_VoidSymbol as GDK_VoidSymbol when not
already defined, before using it for the non-GTK4 case.
Hirohito Higashi [Wed, 12 Aug 2026 19:11:17 +0000 (19:11 +0000)]
patch 9.2.0948: GTK4: mouse move starts Visual selection after a dialog
Problem: In GTK4, when a dialog pops up while a mouse button is pressed,
moving the mouse afterwards starts a Visual selection without
any button being held down.
Solution: Forget about the pressed mouse button when a mouse move reports
that no button is down, since the button release event may have
gone to another widget (Hirohito Higashi).
related: #20907
related: #21014
closes: #21022
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Wed, 12 Aug 2026 19:05:26 +0000 (19:05 +0000)]
patch 9.2.0947: GTK4: screen is cleared when moving the mouse after startup
Problem: In GTK4, moving the mouse over the window right after startup
clears the screen, including the intro message.
Solution: Keep the cached contents of the drawing area in sync with the
size Vim is going to draw (Hirohito Higashi).
fixes: #21016
closes: #21021
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Wed, 12 Aug 2026 18:53:42 +0000 (18:53 +0000)]
patch 9.2.0946: GTK2/3: mouse move starts Visual selection after a dialog
Problem: In GTK2/GTK3, when a dialog pops up while a mouse button is
pressed, moving the mouse afterwards starts a Visual selection
without any button being held down.
Solution: Forget about the pressed mouse button when another widget
shadows the text area with a grab, since the button release
event goes to that widget (Hirohito Higashi).
fixes: #20907
closes: #21014
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Wed, 12 Aug 2026 18:38:28 +0000 (18:38 +0000)]
patch 9.2.0945: sort() with a numeric option can be improved
Problem: The comments on the precomputed sort keys explain the code by
contrasting it with the previous implementation, and one of
them exceeds 80 columns (after v9.2.0937).
Solution: Drop the redundant comments and shorten the union member ones
(Hirohito Higashi).
related: #21003
closes: #21030
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Doug Kearns [Wed, 12 Aug 2026 18:35:51 +0000 (18:35 +0000)]
runtime(algol68): Update syntax, fix syncing
Use "fromstart" syncing.
Pragment regions are delimited by shared start/end tokens which render
other syncing types largely useless. A sync point located in the middle
of a multiline comment cannot distinguish the end token from a start
token and the erroneously created region runs to EOF.
closes: #21032
Signed-off-by: Doug Kearns <dougkearns@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Foxe Chen [Wed, 12 Aug 2026 18:27:13 +0000 (18:27 +0000)]
patch 9.2.0944: test: tests fail when checking for GTK4 feature
Problem: test: tests fail when checking for GTK4 feature
(after v9.2.0942)
Solution: Remove trailing comment, mark a few tests flaky when running
in GTK4 UI, disable error messages when connecting to socket
server, skip Test_win_gotoid_in_mapping in GTK4 UI (Foxe Chen).
closes: #21015
Signed-off-by: Foxe Chen <chen.foxe@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Tue, 11 Aug 2026 19:49:28 +0000 (19:49 +0000)]
CI: Keep the GTK4 job from affecting the other jobs
The GTK4 job added in 9.2.0931 timed out after 30 minutes on every run. The
tests did not hang, they were retried: 82 test functions failed under GTK4
against two in the otherwise identical GTK3 job, and runtest.vim runs a flaky
test up to five times with a sleep in between.
Raising the Test step timeout from 20 to 30 minutes for this made it apply to
every other job as well. Once the columns are no longer lost when a window is
split the job needs about sixteen minutes, so put the limit back to 20.
Twelve tests still fail, among them Test_hlsearch_clipboard and
Test_popup_select, which need a working clipboard; this is the only job that
runs a Wayland compositor. Let the job fail without failing the workflow
until that is sorted out. The Build step stays blocking, so a broken GTK4
build is still reported.
Also drop coverage from the job. The GTK3 job runs the same "make testgui"
with coverage enabled, so the instrumentation only makes this job slower.
closes: #21007
Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Foxe Chen [Tue, 11 Aug 2026 19:42:18 +0000 (19:42 +0000)]
patch 9.2.0943: test: test_hardcopy fails on GTK4 UI
Problem: test: test_hardcopy fails on GTK4 UI, because it opens a
dialog
Solution: Use :hardcopy! to skip the dialog, set GDK_DEBUG=no-portals
environment variable (Foxe Chen)
closes: #21009
Signed-off-by: Foxe Chen <chen.foxe@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Tue, 11 Aug 2026 19:27:07 +0000 (19:27 +0000)]
patch 9.2.0941: tests: clipboard tests fail in the GUI when the terminal has no clipboard
Problem: Tests that need the clipboard in a Vim started with
RunVimInTerminal() are not skipped when only the Vim running the
tests has a clipboard, which is always the case in the GUI.
Solution: Add CheckClipboardInTerminal to ask a Vim started the same way
whether it can use the clipboard. (Hirohito Higashi).
closes: #21008
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Foxe Chen <chen.foxe@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Tue, 11 Aug 2026 19:21:08 +0000 (19:21 +0000)]
patch 9.2.0940: GTK4: columns are lost when a scrollbar appears
Problem: With the GTK4 GUI the shell loses columns every time a window is
split, so that the text area keeps getting narrower.
Solution: Ignore a size allocation that was computed before the size that
was last asked for, instead of computing Rows and Columns from
the old size together with the new base size.
closes: #21006
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Foxe Chen <chen.foxe@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Tue, 11 Aug 2026 19:16:00 +0000 (19:16 +0000)]
patch 9.2.0939: mbyte: wrong cell count for an overlong UTF-8 sequence
Problem: An overlong UTF-8 encoding of an unprintable ASCII character is
displayed as <xx> but counted as two screen cells, so that the
cursor ends up in the wrong position when editing the line.
Solution: Count four cells for an unprintable overlong sequence.
fixes: #20988
closes: #21005
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Tue, 11 Aug 2026 19:10:19 +0000 (19:10 +0000)]
patch 9.2.0938: cursorbind: cursor in the other window is not updated after undo
Problem: In diff mode with 'cursorbind' the cursor in the other window is
not updated after an undo that changes which lines correspond.
Solution: Also check whether the text changed before skipping the update
(Hirohito Higashi).
patch 9.2.0937: sort() with a numeric option converts each item on every comparison
Problem: sort() with "n", "N" or "f" converts an item to its number on
every comparison. For "n" that is a tv2string() plus strtod()
per comparison, so sorting a list of numbers turns each number
into a string and back O(n log n) times, dwarfing the sort.
Solution: Compute the numeric key of each item once, before the sort,
and compare the stored key (Samuel Schlesinger). Only the
builtin numeric compare modes are affected; uniq(), which
passes a bare list item to the compare function, and the
string and user-function paths are unchanged.
Sorting a list of 100000 numbers (min of 3, macOS arm64):
- sort(l, 'n'): 0.205s -> 0.017s
- sort(l, 'N'): 0.017s -> 0.010s
- sort(l, 'f'): 0.014s -> 0.010s
The result is identical, including that a string is still treated as 0
in "n" mode and that "N" keeps full 64-bit precision.
Add Test_sort_numeric_precomputed(): a large shuffled list sorted with
"n", mixed integers and floats, int64 values beyond the exact range of
a double for "N", and uniq() over the non-precomputed path.
closes: #21003
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Samuel Schlesinger <sgschlesinger@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0936: stringifying a list or dict can free the item being iterated
Problem: match(), matchstr(), matchend(), matchlist() and matchstrpos()
over a list, join() of a list, and string() or :echo of a
list or dict stringify each item while iterating over the
container. For an object item this runs the user-defined
string() method, which can remove the item the loop is
standing on, or grow a dict so its hash table is
reallocated, leaving the loop reading freed memory.
Solution: Lock the container while iterating, so a change from the
string() method fails with E741 instead of corrupting the
iterator, the same way filter(), map(), sort() and reduce()
already do. For a dict also hash_lock() it, so growing it
cannot reallocate the hash table, mirroring the dict path of
filter()/map() (Samuel Schlesinger).
find_some_match() in evalfunc.c, list_join_inner() in list.c and
dict2string() in dict.c each iterated a container while calling
echo_string(); list_reduce() was the existing pattern they were
missing.
Add tests: match() and matchstr() over a list, join() and string() of
a list, and string() of a dict, each with an object whose string()
method mutates the container; every one crashes an unpatched Vim.
closes: #21001
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Samuel Schlesinger <sgschlesinger@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0935: reading an undo file is slow with many undo headers
Problem: Reading an undo file resolves every stored sequence number
with a linear scan over all headers, making loading
quadratic in the number of undo states.
Solution: Sort uhp_table on uh_seq once and resolve each reference
with a binary search; the duplicate uh_seq check becomes a
single pass over the sorted table (Samuel Schlesinger).
At the default 'undolevels' of 1000 the quadratic cost is not
measurable; it takes 'undolevels' in the tens of thousands to matter.
Loading an undo file with 20000 states and 50 alternate branches with
:rundo goes from 1.49s to 0.11s (min of 3, macOS arm64), with the
same undotree().
Also make old_idx/new_idx/cur_idx and the loop index "i" long instead
of short/int: they index uhp_table, whose length num_head is a long
read from the file. A short index truncated above 32767 headers,
making the restored b_u_oldhead/b_u_newhead/b_u_curhead pointers
wrong in exactly the many-headers case this change is about.
Add tests: a round-trip test with alternate branches that compares
the entries of the tree and the text at every sequence number, a
corruption test with a duplicated uh_seq, and a test for reading an
undo file with zero headers, which is written when only the line for
the "U" command is saved.
closes: #20942
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Samuel Schlesinger <sgschlesinger@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Maxim Kim [Tue, 11 Aug 2026 18:03:33 +0000 (18:03 +0000)]
patch 9.2.0934: filetype: hlsl files are not recognized
Problem: filetype: hlsl files are not recognized
Solution: Detect *.hlsl files hlsl filetype, include
ftplugin, indent and syntax plugins, update
gvim menu (Maxim Kim)
Note to Neovim devs: runtime files are in vim9script
closes: #20993
Signed-off-by: Maxim Kim <habamax@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0933: u_read_undo() leaks the file name when the undo file owner differs
Problem: When the owner of an undo file differs from the owner of
the text file and the current user, u_read_undo() returns
without freeing the file name it allocated with
u_get_undo_file_name().
Solution: Free the file name before returning (Samuel Schlesinger).
Every other exit of the function frees it under the "theend" label;
this early return sits before the file pointer is initialized, so it
cannot use that label.
closes: #20987
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Samuel Schlesinger <sgschlesinger@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0932: NFA engine fallback can double free the compiled program
Problem: When the automatic regexp engine falls back to the
backtracking engine in vim_regexec_string(), the compiled
program is freed before the replacement is compiled; when
saving the pattern fails from being out of memory the
caller's "regprog" is left pointing to freed memory and
is freed again.
Solution: Free the previous program only after compiling the
replacement succeeded, like vim_regexec_multi() already
does (Samuel Schlesinger).
closes: #20986
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Samuel Schlesinger <sgschlesinger@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Foxe Chen [Mon, 10 Aug 2026 20:08:09 +0000 (20:08 +0000)]
patch 9.2.0931: the GTK4 GUI is still experimental and untested by CI
Problem: the GTK4 GUI is still experimental and untested by CI
Solution: Stabilize the GTK4 code, Fix a few minor issues, include a
GTK4 CI job (Foxe Chen).
closes: #20920
Signed-off-by: Foxe Chen <chen.foxe@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Maxim Kim [Mon, 10 Aug 2026 19:28:53 +0000 (19:28 +0000)]
runtime(colors): update colorschemes
changes:
- habamax, lunaperche, wildcharm: bold PmenuMatch/PmenuMatchSel
- catppuccin: softer VertSplit and PmenuBorder, fix Spell*
- habamax: less contrast for Constant (yellowish instead of red)
- the rest: update PmenuKind/PmenuExtra for non-colored term
closes: #20996
Signed-off-by: Maxim Kim <habamax@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Shane Harper [Mon, 10 Aug 2026 18:47:11 +0000 (18:47 +0000)]
patch 9.2.0929: incorrect completion for 'pumopt' and 'pumborder'
Problem: Incorrect completions are offered for the 'pumopt' and
'pumborder' options.
Solution: Fix expand_set_pumborder() and expand_set_pumopt() to only
offer valid completions (Shane Harper).
The "single", "double" and "round" border styles aren't offered when
they cannot be used: 'encoding' must be "utf-8" and 'ambiwidth' must be
"single" to use them.
"custom:" is now offered instead of "custom".
For 'pumopt', previously sub-option names were incorrectly offered as
the only possible completions for a sub-option value.
No completions are offered for the values of 'pumopt' sub-options that
take a number. Offering all of the integers from 0 to 100 for "opacity:"
wouldn't be useful.
related: #20676
closes: #20910
Signed-off-by: Shane Harper <shane@shaneharper.net> Signed-off-by: Christian Brabandt <cb@256bit.org>
Hirohito Higashi [Mon, 10 Aug 2026 18:31:42 +0000 (18:31 +0000)]
patch 9.2.0928: MinGW: tests hang when Vim is built with coverage enabled
Problem: When building with MinGW and COVERAGE=yes the tests hang: a
command started from Vim never returns, although the child
process has already exited.
Solution: Do not build vimrun.exe with coverage instrumentation.
fixes: #20976
closes: #20991
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Torben Leth [Sat, 8 Aug 2026 17:24:06 +0000 (17:24 +0000)]
patch 9.2.0926: filetype: Business Central files are not recognized
Problem: filetype: Business Central files are not recognized
Solution: Add filetype detection logic for *.al files to detect perl or
use either perl or al filetype (Torben Leth).
Bogdan Barbu [Sat, 8 Aug 2026 17:11:42 +0000 (17:11 +0000)]
runtime(doc): DocBook syntax variable scopes are not clearly documented
Problem: DocBook syntax variable scopes of docbk_type and docbk_ver
are not clearly documented: docbk_type uses the wrong scope
(it should be buffer-local) and docbk_ver also has an
undocumented buffer-local version.
Solution: Correct the docbk_type examples and describe the docbk_ver
precedence.
closes: #20977
Signed-off-by: Bogdan Barbu <l4b.bogdan.barbu@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0925: crash when getcompletiontype() gets a NULL string
Problem: Crash when getcompletiontype()/getcompletion() gets a NULL string
(dvaave2025).
Solution: Do not write the NUL terminator in set_cmd_context() when the
cursor column is at or past the end of the string, since the
string may be a read-only literal.
Vim can be built for Cygwin with the Unix Makefile, but nothing covers it.
The Windows runner builds with MSVC and MinGW only, and the Cirrus CI job
that was removed in 0abffbff ran FreeBSD alone.
Add a GitHub Actions workflow that configures and builds under Cygwin. It
runs once per day instead of per push, and skips the run when nothing was
committed since the previous one, because the Cygwin runner is slow. Only
the tiny test suite, the unit tests and the libvterm tests are run: the
script tests need sockets, PowerShell, network access and POSIX file
permissions, which do not behave the same under Cygwin.
closes: #20970
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0923: tabpage: closing a tab page loses the alternate tab page
Problem: Closing the current tab page resets the alternate tab page, even
when that is another tab page which still exists, so that
CTRL-Tab stops working (igorlfs).
Solution: Restore the last used tab page after entering another one to
close the current one (Hirohito Higashi).
related: #20965
closes: #20973
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0922: Wayland: modeless selection not redrawn
Problem: Modeless mouse selection on Wayland may not redraw while Vim
is waiting for input, causing the selection highlight to lag
behind mouse movement (lilydjwg).
Solution: Flush pending GUI updates while a modeless selection is in
progress (Christoffer Aasted).
* X11 was not affected.
* Tested FEAT_TINY, 'clipboard', 'mouse' settings.
fixes: #20969
closes: #20971
Signed-off-by: Christoffer Aasted <dezzadk@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
neil [Fri, 7 Aug 2026 19:47:24 +0000 (19:47 +0000)]
patch 9.2.0921: test: terminal tests fail on FreeBSD
Problem: terminal test fail on FreeBSD: the shell enables its line
editor when interactive on a terminal, which echoes the typed
command a second time and shifts the output down by one line,
so getline(2) returns "exit" instead of the value.
Solution: Point $ENV to a startup file that turns the line editor off in
Run_shell_in_terminal(). POSIX shells read it at startup and
it produces no output of its own; shells that do not use $ENV
ignore it (neil).
closes: #20972
Signed-off-by: neil <github@neilpang.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Bogdan Barbu [Thu, 6 Aug 2026 20:16:23 +0000 (20:16 +0000)]
patch 9.2.0920: filetype: json-ld files are not recognized
Problem: filetype: json-ld files are not recognized
Solution: Detect *.jsonld files as jsonld filetype, include
filetype, indent and syntax plugins (Bogdan Barbu).
Reference:
https://www.w3.org/TR/json-ld11/
closes: #20954
Signed-off-by: Bogdan Barbu <l4b.bogdan.barbu@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0919: screen: the wrong array is copied into ScreenCols on a resize
Problem: When the screen is resized without clearing, screenalloc() copies
ScreenAttrs[] into the new ScreenCols[] instead of using
ScreenCols[], so the virtual columns are replaced by attribute
values. Since colnr_T is twice the size of sattr_T it also
reads twice the intended number of bytes.
Solution: Copy from ScreenCols[].
closes: #20961
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0918: screen: fill char with a zero low byte is stored as a NUL cell
Problem: Using a multibyte fill character whose lower byte is zero, such
as U+2500 for a popup border or 'fillchars', stores a NUL in
ScreenLines[]. That marks the cell as the right half of a
double-width character, and the GUI reports E340 when the window
is resized (iranoan).
Solution: Store 0x80 instead of the truncated character code, like
fold_line() already does (Hirohito Higashi)
related: vim-jp/issues#1460
closes: #20960
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Doug Kearns [Thu, 6 Aug 2026 19:12:56 +0000 (19:12 +0000)]
patch 9.2.0917: :quitall not allowed in the command-line window
Problem: :quitall not allowed in the command-line window.
Solution: Synchronise the command definition with that of the :qall
alias, adding EX_CMDWIN and EX_LOCK_OK (Doug Kearns).
closes: #20959
Signed-off-by: Doug Kearns <dougkearns@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime(sh): Fix shFunctionTwo and shFunctionFour definitions for Bash
Claim e.g. "function f () { :; }" as shFunctionTwo while
observing that parentheses after the function name are
optional when the "function" word is used and do not delimit
its body if the latter follows them in "{}" (which should
not be taken for granted with limited backtracking).
closes: #20878
Signed-off-by: Aliaksei Budavei <0x000c70@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime(sh): Do not conflate comments and function declarations in Bash
Bash identifiers declared in scripts cannot have a leading
"#" in their names. And neither "namespace" nor "function"
can be followed by a newline before an identifier.
Wei Tang [Thu, 6 Aug 2026 18:32:38 +0000 (18:32 +0000)]
patch 9.2.0916: configure: honor `--disable-hardcopy-pango` with GTK UI
Problem: The configure script enables Pango hardcopy automatically
when the GTK GUI is selected, even when the user explicitly
specified `--disable-hardcopy-pango` (after v9.2.0898).
Solution: Only enable Pango hardcopy by default when the option was not
explicitly specified, verify that pango library is at least v1.44
(Wei Tang, Hirohito Higashi)
patch 9.2.0915: tests: two terminal tests in test_popupwin fail on FreeBSD
Problem: Two terminal tests in test_popupwin fail on FreeBSD, where the
shell echoes the typed character more than once (neil).
Solution: Only assert the start of the terminal line.
fixes: #20955
closes: #20957
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Bogdan Barbu [Wed, 5 Aug 2026 19:14:54 +0000 (19:14 +0000)]
runtime(make): variables in make target lists use wrong highlighting
Problem: Variables in make target lists are highlighted as targets when
the prerequisite list is non-empty.
Solution: Match target lists separately from prerequisite regions so
that contained identifiers are highlighted correctly. Add
regression test.
closes: #20947
Signed-off-by: Bogdan Barbu <l4b.bogdan.barbu@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0914: diff: undo after :diffget into an empty buffer leaves a line behind
Problem: After :diffget into an empty buffer, undo does not restore the
empty buffer, the last line stays behind (Narendran
Gopalakrishnan)
Solution: Include the empty line of the empty buffer in the undo
information, it is deleted once the first line was obtained
(Hirohito Higashi).
fixes: #20950
closes: #20951
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0913: statusline: cell below the vertical separator keeps the old highlight
Problem: When 'statusline' is set, the cell below a vertical separator keeps
the highlight of the previous status line update and only catches
up on the next key press (dougaak).
Solution: Also update that cell when the status line of the current window is
redrawn while showing the ruler (Hirohito Higashi).
related: #20182
fixes: #20948
closes: #20949
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0912: hardcopy: prototypes are hand-written instead of generated
Problem: The prototypes for the pango and PostScript hardcopy functions
are written by hand in hardcopy_pango.h and
hardcopy_postscript.h, instead of being generated into proto/
like for every other source file.
Solution: Generate proto/hardcopy_pango.pro and
proto/hardcopy_postscript.pro, include them from proto.h and
drop the hand-written declarations. hardcopy_pango.h only held
prototypes and is removed; hardcopy_postscript.h keeps its
defines and the mbfont_opts declaration.
closes: #20946
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Wei Tang [Wed, 5 Aug 2026 18:34:20 +0000 (18:34 +0000)]
patch 9.2.0911: makefiles do not build hardcopy_postscript.c
Problem: A recent commit moved the original content of hardcopy.c
into hardcopy_postscript.c, but the makefiles were not
updated to compile and link the new source file, causing
build failures on Windows and other systems (after 9.2.0898).
Solution: Add hardcopy_postscript.c to the makefiles, hardcopy_pango.c
is only built with GTK/cairo/pango (using autoconf), so
the Win32/Amiga/VMS makefiles do not need it (Wei Tang).
related: #20648
closes: #20944
Signed-off-by: Wei Tang <gauchyler@uestc.edu.cn> Signed-off-by: Christian Brabandt <cb@256bit.org>
Doug Kearns [Tue, 4 Aug 2026 21:00:38 +0000 (21:00 +0000)]
patch 9.2.0910: runtime(vim): Update syntax, contain Ex commands
Problem: Vim Syntax Script can be improved
Solution: Rework syntax script, update syntax tests and unit tests
(Doug Kearns).
- Contain Ex commands to valid syntactic contexts.
- Add full address (:range) matching.
- Match :Next, :Print, :X, :global, :&, :~, :>, :<, :# and := commands.
- Match text input commands with folding.
Use :syn-keyword to match all commands except when immediately following
\w range characters where :syn-match is employed.
fixes: #20250 (variables with s_ prefix are wrongly highlighted)
fixes: #17543 (do not highlight vim commands within :runtime)
fixes: #16937 (do not highlight vim commands after packadd)
fixes: #14895 (incorrect highlighting of Vim syntax)
fixes: #14020 (insert commands)
closes: #19331
Signed-off-by: Doug Kearns <dougkearns@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0909: insert completion is slow to collect many matches
Problem: ins_compl_add() checks for a duplicate by scanning the whole
match list, making collection of N matches quadratic.
Solution: Look matches up in a hashtab instead; each entry counts the
matches with that string (Samuel Schlesinger).
closes: #20926
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0908: cannot use a {} block in a nested :autocmd
Problem: At script level a "{" block is only recognized when it is the
whole argument of :autocmd or :command, so an :autocmd that is
the command of another :autocmd cannot use a block. In a :def
function a trailing "{" is accepted instead, and there any
command ending in "{", such as "normal! {", is mistaken for the
start of a block (lacygoill).
Solution: Locate the block by following the argument of the command,
descending into a nested :autocmd or :command, and use that
everywhere a block needs to be recognized (Hirohito Higashi).
fixes: #20918
closes: #20933
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0907: popup: virtual text is not redrawn when a text property changes
Problem: Adding or removing a text property in the buffer of a popup
window does not update the popup on the screen. The old
virtual text stays visible until something else causes a
redraw.
Solution: Also mark popup windows displaying the buffer for redrawing in
redraw_buf_later() (Hirohito Higashi).
fixes: #19297
closes: #20931
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Problem: transstr() appends with STRCAT()/STRLEN() from the start of
the result on every iteration, making it quadratic to the
length of the string.
Solution: Keep a tail pointer and append at it. (Samuel Schlesinger).
closes: #20925
Signed-off-by: Samuel Schlesinger <sgschlesinger@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Foxe Chen [Mon, 3 Aug 2026 20:13:17 +0000 (20:13 +0000)]
patch 9.2.0905: MS-Windows: ghost cursor with ligatures
Problem: With ligatures enabled, a ghost cursor can be left on screen
because the cursor is marked valid before the ligature
cleanup, which redraws the cell with gui_screenchar() and
invalidates the cursor again (ubaldot)
Solution: Set gui.cursor_is_valid only after the ligature redraw is
done, so it isn't cleared afterwards (Foxe Chen).
fixes: #20916
closes: #20924
Signed-off-by: Foxe Chen <chen.foxe@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
zeertzjq [Mon, 3 Aug 2026 20:08:04 +0000 (20:08 +0000)]
patch 9.2.0904: "zb" scrolls incorrectly with cursor just above fold
Problem: "zb" scrolls incorrectly with cursor just above fold.
Solution: Handle boff.lnum being set to the last line of a fold
(zeertzjq).
With the cursor just above fold, botline_forw() moves boff.lnum to the
last line of the fold, but curwin->w_botline is at the first line of the
fold, so the boff.lnum == curwin->w_botline condition never holds.
Instead, check that boff.lnum has just moved to or past w_botline by
comparing its previous value with w_botline.
Also make a similar change to the loff.lnum check above for symmetry.
That one doesn't change behavior, as topline_back() sets loff.lnum to
the first line of a fold.
related: neovim/neovim#41122
closes: #20923
Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0903: Vim9: cannot use an exported function of an autoload import
Problem: Using an exported function of a script imported with "import
autoload" as a value gives E121, unless the script is under an
"autoload" directory.
Solution: When the name is not a script variable also look for an exported
function and push a funcref for it (Hirohito Hirohito).
fixes: #20911
closes: #20922
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0902: Vim9: iterating over a tuple leaks memory
Problem: Looping over a tuple with ":for" copies each item with
copy_tv() but never clears the copy, leaking the value on
every iteration (26MB over 100k iterations of a two-string
tuple). Container items keep an extra reference forever,
also defeating garbage collection.
Solution: Clear the copied typval on both return paths, like the
string branch of next_for_item() already does
(Samuel Schlesinger).
closes: #20914
Supported by AI.
Signed-off-by: Samuel Schlesinger <sgschlesinger@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
The 'smoothscroll' scroll position is kept when a window is squeezed since
patch 9.2.0885, and the Tab size in a line with virtual text above it is
correct since patch 9.2.0896.
closes: #20921
Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0901: textprop: wrong cursor line with truncated virtual text
Problem: The cursor is displayed in the wrong line when virtual text below
an empty line is truncated.
Solution: Do not count an extra column for an empty line that has virtual
text below it, its width already includes filling up the line.
(Hirohito Higashi).
fixes: #12493
closes: #20917
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0900: FocusGained still triggered when closing dialog
Problem: FocusGained still triggered when closing dialog
(after v9.2.0851)
Solution: Track that dialog is active and suppress the FocusGained
autocommand (Christoffer Aasted)
related: #20780
closes: #20894
Signed-off-by: Christoffer Aasted <dezzadk@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Sam Roeca [Sun, 2 Aug 2026 18:41:16 +0000 (18:41 +0000)]
patch 9.2.0899: command output temporary files may collide
Problem: On MS-Windows, get_cmd_output() removes its reserved temporary
file before the shell opens it, allowing another Vim process to
reuse the same name.
Solution: Keep the temporary file reserved until command output handling is
complete (Sam Roeca).
closes: #20915
Signed-off-by: Sam Roeca <samuel.roeca@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Foxe Chen [Sun, 2 Aug 2026 18:27:01 +0000 (18:27 +0000)]
patch 9.2.0898: printing support is lacking
Problem: printing support is lacking
Solution: Improve printing support by making use of pango and cairo
libraries, use a graphical dialog for :hardcopy in the GTK4 ui
(Foxe Chen).
fixes: #8935
closes: #20648
Signed-off-by: Foxe Chen <chen.foxe@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0896: scroll: 'smoothscroll' position is lost when splitting a window
Problem: With 'smoothscroll' the position in a long line is lost when a
window is split and closed again.
Solution: With 'splitkeep' "screen" keep the skipped columns, they are part
of keeping the same screen lines. Otherwise put the cursor in the
row that keeps its relative position, instead of the last row.
closes: #20912
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0896: textprop: wrong Tab size in a line with virtual text above it
Problem: In a line with virtual text above it a Tab does not have the right
size, depending on the width of the window.
Solution: Do not count the columns of the virtual text for the size of the
Tab, neither when drawing nor when computing the column.
fixes: #12232
closes: #20901
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0895: test: Test_aucmd_win_scroll_multibyte() is flaky in the GUI
Problem: The test comparing the top line before and after using the
autocommand window is flaky in the GUI.
Solution: Run the test in a window with a fixed size. In the GUI a
pending resize of the shell is applied at the end of a screen
update, thus the size may change between the two measurements.
related: #20884
closes: #20913
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Doug Kearns [Sat, 1 Aug 2026 13:57:32 +0000 (13:57 +0000)]
patch 9.2.0894: filetype: ed script files not recognised
Problem: filetype: ed script files not recognised.
Solution: Add filetype detection for *.ed files and shebang lines,
include syntax script and syntax tests.
Features of the ed syntax file:
- BSD and GNU extensions are supported
- Andrew L. Moore's ed extensions are not supported
- Rebuild synmenu.vim
closes: #19602
Signed-off-by: Doug Kearns <dougkearns@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0893: MS-Windows: "*.vim" also matches files with a longer extension
Problem: On MS-Windows a pattern like "path/*.vim" also matches files such
as "foo.vim9", because the 8.3 short name "FOO~1.VIM" is used for
matching as well. These files are then sourced.
Solution: Only match against the short name when the pattern contains a '~'
(Hirohito Higashi).
closes: #20899
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime(doc): remove todo entry for test_codestyle errors
The two reported problems are gone: keycode_check.vim has no space before a
tab and setup.vim, now util/setup.vim, has no trailing white space. Since
patch 9.2.0195 the check is not part of the test suite but a separate
"make codestyle" target.
closes: #20900
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0892: highlight: wrong column highlighted with 'cursorcolumn'
Problem: With 'virtualedit' set to "all" and 'cursorcolumn' set, the wrong
column may be highlighted after a command that moved the cursor
into virtual space and back (van-de-bugger).
Solution: Make sure the virtual column is up to date before drawing the
window (Hirohito Higashi).
fixes: #2576
closes: #20902
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Problem: On MS-Windows using ":8" with ":t", ":e" or ":r" in one
fnamemodify() gives a wrong result or an out of memory error.
Solution: Recompute the tail after ":8" replaced the name
(Hirohito Higashi).
related: #20899
closes: #20903
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
patch 9.2.0890: test: test for patch v9.2.0888 can be clarified
Problem: test for patch v9.2.0888 can be clarified
(zeertzjq)
Solution: use <NL> instead of CTRL-J for a NL
The comment says "A NL", using <NL> makes the intent clearer.
related: #20898
closes: #20906
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Hirohito Higashi <h.east.727@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Scott Klein [Sat, 1 Aug 2026 10:44:01 +0000 (10:44 +0000)]
patch 9.2.0889: VMS: spurious "INVALID DECC FEATURE VALUE" message at every startup
Problem: On OpenVMS, Vim prints "INVALID DECC FEATURE VALUE" once per
DECC feature at every startup whenever that feature is already
set to the value Vim wants -- e.g. when DECC$ARGV_PARSE_STYLE,
DECC$EFS_CASE_PRESERVE or DECC$EFS_CHARSET are defined as
logical names. Conversely, a genuinely out-of-range value is
silently ignored, so the diagnostic fires exactly when it
should not and never when it should (after v9.1.1591)
Solution: Add braces so that the "else" binds to the range check rather
than to the inner "if", matching the existing indentation and
the evident intent (Scott Klein).
related: #17810
closes: #20904
Supported by AI.
Signed-off-by: Scott Klein <kleinmatic@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>