| Commit message (Collapse) | Author | Age |
| | |
|
| |
|
|
| |
Now it shows something like `5 lines yanked into "~my.extreg`
|
| | |
|
| | |
|
| |
|
|
| |
Alias semantis are identical to using the full extreg name.
|
| | |
|
| | |
|
| |
|
|
| |
Added a big test suite for extregs
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Implements "extended registers"
Extended registers provide access to a separate namespace of registers
backed by custom lua callback functions.
A new special register ("~) is introduced, which prompts the user for
the name of an extregistr to yank or paste from.
This enables file-backed or cloud-synced or other arbitrary register
behavior.
One can now use:
`"~file_extreg<cr>yy`
to yank into the "file_extreg" register.
AI-assisted: Qwen3-Coder
|
| |
|
|
|
|
|
|
| |
Problem:
By default, 'termpastefilter' removes TAB chars when pasting to a :terminal.
Very annoying, and does not improve "security".
Solution:
Drop "HT" from the 'termpastefilter' default.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Problem:
A number in 'iskeyword', 'isfname' or 'isident' that overflows (e.g. via
a modeline) hits abort() or an assert in getdigits_int().
Solution:
Parse the numbers non-strictly so an out-of-range value gives E474.
Fixes #42409
AI-assisted
|
| |
|
|
|
|
|
|
|
|
| |
Problem:
TM_DIRECTORY expands to the directory's basename, losing its parent path.
Solution:
Remove the tail modifier when expanding the current file's directory.
Extend the existing known-variable test to check the full directory path.
AI-assisted
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Problem: watchdirs() keeps its state in large nested callbacks in
_watch.lua, which makes its directory tracking logic harder to change.
Solution: Move the backend into its own module and store its state in a
WatchDirs instance. Split setup, event handling and cleanup into
methods. Extend the existing test to cover cancellation while a
directory stat is pending.
AI-assisted
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Problem: The list returned by 'quickfixtextfunc' is never
unreferenced, so it is not freed until garbage collection.
Solution: Unreference the list after filling the quickfix buffer
(Volodymyr Chernetskyi).
closes: vim/vim#21437
https://github.com/vim/vim/commit/84d86c65d3bc612320c3d38c2fc987c5cdd81ae9
Co-authored-by: Volodymyr Chernetskyi <19735328+chernetskyi@users.noreply.github.com>
|
| |\
| |
| | |
vim-patch:9.2.{1196,1199}
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Problem: Case-folded regexp matches can end inside a UTF-8 character
when the input is longer than the literal pattern.
Solution: Return the input byte length after a successful comparison
even when it exceeds the pattern byte length, and test literal
replacements and backreferences (Volodymyr Chernetskyi).
related: vim/vim#14756
related: vim/vim#21212
closes: vim/vim#21439
https://github.com/vim/vim/commit/c9a9517ce8498256b50576e8291709083b607d70
Co-authored-by: Volodymyr Chernetskyi <19735328+chernetskyi@users.noreply.github.com>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
case-folded widths
Problem: NFA literal matches miss characters with different case-folded
widths, including when retrying after a failed suffix match.
Solution: Advance past the actual input character in both paths and test
string and buffer searches (Volodymyr Chernetskyi).
related: vim/vim#14294
closes: vim/vim#21438
https://github.com/vim/vim/commit/b3affdd29ea4b1017f5c870824a9e4576731fa95
Co-authored-by: Volodymyr Chernetskyi <19735328+chernetskyi@users.noreply.github.com>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Problem:
After edits move diagnostic ranges, counted jumps resume searching from
their original positions. This can revisit the same diagnostic and hang
the default first/last diagnostic mappings.
Solution:
Advance the search origin using the diagnostic's current logical position.
Test forward and backward counted jumps after inserting or deleting a
line, including jumps to the last or first diagnostic without wrapping.
AI-assisted
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Problem:
Accepting an item from another completion source raises an error when its
user_data.nvim table does not contain LSP metadata.
Solution:
Retrieve and guard the nested LSP metadata before accessing its fields.
Cover acceptance of a foreign completion item without LSP metadata.
AI-assisted
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Problem:
An empty snippet insertText falls back to the label during selection, but
acceptance clears that label and expands an empty string.
Solution:
Require nonempty insertText before expanding a snippet without textEdit.
Extend the omnifunc acceptance fixture with an empty snippet insertion.
AI-assisted
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Problem:
A completion list default edit range can replace the explicit range of an
InsertReplaceEdit, filtering out valid items or changing their replacement.
Solution:
Only synthesize a default text edit when the completion item has none.
Extend the existing itemDefaults test for explicit edits with both range variants.
AI-assisted
|
| |/
|
|
|
|
|
|
|
|
|
|
| |
Problem:
Snippet completion words and previews prefer insertText even when textEdit
is present, although the actual expansion uses textEdit.newText.
Solution:
Use the text edit before the fallback insertion text in both selectors.
Extend the existing precedence test to check the snippet word and preview.
AI-assisted
|
| |
|
|
|
|
|
|
| |
Problem: Custom ui2 window tracks 'fillchars' option to adjust to the
change of `msgsep` flag. However, 'fillchars' is `:h global-local`
window option. If it is set locally to the window, ui2 reacts to its
`msgsep` value and keeps using it afterwards even in other windows.
Solution: Use and react to only global value of 'fillchars'.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Problem: Highlight inspection is limited to a single position, and its
result types do not document the fields shared by different highlight
sources.
Solution: Accept end_row/end_col in vim.inspect_pos to inspect a range.
Keep range ends exclusive and retain the existing single-position
behavior.
Support Ex line ranges in :Inspect, including Visual selections.
Document named result types, expose shared highlight fields, and keep
the existing extmark details and buffer field for compatibility.
AI-assisted
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Problem:
When starting Nvim with both `--clean` and `--noplugin` (in either
order), `--noplugin` is silently ignored and built-in runtime plugins
are loaded anyway. `command_line_scan()` sets `p_lpl = false` for
`--noplugin`, and `--clean` sets `params.use_vimrc = "NONE"` and
`params.clean = true`, which later overwrites `p_lpl` back to `true` via
`p_lpl = vimrc_none ? params.clean : p_lpl`.
Solution:
Only reset `p_lpl = false` when `vimrc_none && !params.clean`,
preserving `p_lpl = false` if `--noplugin` was passed.
AI-assisted
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Problem:
Provider checks start and wait for a job, then execute the same command
again to obtain its output. The returned output can disagree with the
first process's exit status, and the second execution has no timeout.
Solution:
Return the first job's captured output. Bind the output callbacks to
their state and preserve line breaks between callback data entries.
Cover invocation count, multiline stdout, and merged stderr.
AI-assisted
|
| |
|
|
|
|
|
|
|
| |
Problem: Cannot complete the command after ++once or ++nested for
:autocmd.
Solution: Skip over these flags in set_context_in_autocmd() (glepnir).
closes: vim/vim#21429
https://github.com/vim/vim/commit/cf57ec0db8a9bc9926c7ede86a8586f057545723
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Problem: nvim_set_option_value() dry runs skip checks in did_set_*
callbacks. This logic also prepares values needed to apply the option,
such as tab widths or a compiled regexp. Moving the checks into
validation callbacks needs a way to save that work for did_set_*.
Solution: Store prepared values in optset_T so did_set_* can consume
them after the option is stored. Dry runs perform the same validation,
then free the prepared values without changing live state.
This extends dry-run validation for:
- 'cedit': reject invalid command-line window keys.
- 'completeitemalign': require each completion column exactly once.
- 'cursorlineopt': reject empty values and conflicting line modes.
- 'encoding': accept only UTF-8 and its aliases.
- 'fileencoding': reject lists and local changes with 'nomodifiable'.
- 'messagesopt': require mandatory fields and enforce numeric limits.
- 'spellcapcheck': return regexp errors, including under :silent!.
- 'spellsuggest': reject conflicting suggestion modes.
- 'varsofttabstop' and 'vartabstop': reject invalid tab widths.
- 'wildmode': reject more than four completion stages.
'makeencoding' also uses the shared encoding preparation.
Separating value preparation exposed a bug in 'vartabstop' and
'varsofttabstop': failed assignments could discard local tab widths, and
global assignments could overwrite them. Fix this by preparing new
widths separately and applying them only after a valid local assignment.
AI-assisted
|
| |
|
|
|
|
|
|
|
|
|
|
| |
vim.diagnostic.Opts.VirtualText has a `source` option to prefix
diagnostic messages with their source (`'if_many'` or always), but the
newer virtual_lines handler never got the same option, even though the
shared helpers it needs (diagnostic_shared.prefix_source/count_sources)
are already render-target-agnostic and used by virtual_text as-is.
Add the same `source` field to vim.diagnostic.Opts.VirtualLines and
apply it in the virtual_lines handler right after message formatting,
mirroring virtual_text's own ordering (format first, then prefix the
source onto the already-formatted message).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
vim-patch:9.2.1191: crash with "//e" when only a substitute pattern exists
Problem: Crash when using "//e" or "//" while there is a substitute
pattern but no previous search pattern (after v9.2.0374).
Solution: Use the previous pattern selected for an empty pattern
(Jonas Ornfelt).
related: vim/vim#19998
closes: vim/vim#21533
AI-assisted
https://github.com/vim/vim/commit/c58607c9a0579de0da909fc46f68144a01378af1
|
| |
|
|
|
|
|
|
|
|
|
| |
via filename
While at it, also fix E716 when calling gnat.Get_Command('Find')
by renaming the key from 'Find_Program' to the expected 'Find_Command'.
https://github.com/vim/vim/commit/26d8c851889df19e93dde2a3572e1e356b3a84e3
Co-authored-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
|
| |
|
|
|
|
| |
https://github.com/vim/vim/commit/abb6f3ea4cf61ec1b5702a6fbb6be2594549fb16
Co-authored-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
#42352
Problem:
- nvim_buf_call() aborts (assert) when called from an expression evaluated
for a window in another tabpage ('foldexpr', 'statusline'), because
`curwin` is not in `curtab`.
- After it returns, `curwin` is wrong if it switched windows.
- `vim._with{win=…, keepcwd=true}` does not undo `:lcd` if `win` is in
another tabpage.
Solution:
- Allow `curwin` outside `curtab`, and restore if it was outside
`curtab` at `ctx_switch()`.
- Find the target window in any tabpage when restoring its dirs.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Problem:
`nvim_set_option_value('fo', {'c','r','o'}, {operation='remove'})` does
nothing on "jcqrol": the items are joined into one `:set-=` value, which
only matches a contiguous substring. Removing map keys, e.g. {'eol','space'}
from 'listchars', never matches. `vim.opt:remove{…}` inherits this.
(Regression from f34ee3da80e8; 429338e74bf4 fixed the case where the
flags are adjacent and in order.)
Solution:
Remove each item separately.
|
| |
|
|
|
|
|
|
|
| |
Problem:
If a job exits with cursor at last row, the `[Process exited]` message
covers the text of that row.
Solution:
Start a new line before showing the message, like the old
`\r\n[Process exited]` did.
|
| |
|
|
|
|
|
|
|
|
|
| |
Problem: Fuzzy completion sort order is unstable for equal scores.
Solution: Remember the list position when a match is first scored and
use it to break ties (glepnir).
closes: vim/vim#21443
https://github.com/vim/vim/commit/8c735cae9e589d1e587127386d6bf6869caed93b
Co-authored-by: glepnir <glephunter@gmail.com>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Problem:
After clearing cursors, "]C" "[C" do nothing, although the previous
cursor positions ("gQ") may still be useful as marks.
Solution:
If multicursor is not active, "]C" "[C" iterate the
"nvim.multicursor.last" extmarks. They also work as an operator motion
("d]C"), since there is no cascade.
AI-assisted
|
| |
|
|
|
|
|
|
|
| |
Problem: :detach! changes the channel's detach property without emitting
ChanInfo, so plugins watching channel updates cannot react to changes.
Solution: Schedule ChanInfo after setting detach=true. Add a test
covering emit on :detach!.
AI-assisted
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Problem:
`g@<C-v>j` and `y<C-v>j` set '] one char short of the block corner, so
'operatorfunc' cannot get the block. With 'virtualedit' "block", "y"
also yanks a short last line one column narrow.
Solution:
- Decide `inclusive` from the motion's own type, before get_op_vcol()
makes it blockwise (like Vim).
- Never exclude the end of a block from '] (`g@<C-v>l`): a block
includes its corner.
Co-authored-by: IcyJerry <263879414+Icyjerry@users.noreply.github.com>
Co-authored-by: Nagato Yuzuru <nagato@yuzuru.me>
|
| | |
|
| |
|
|
|
|
|
|
| |
Problem:
nvim_parse_cmd("'btab", {}) and typing ":'btab" crash, parse_cmdline()
continues with a NULL eap->cmd after an invalid :tab address.
Solution:
Fail if parse_command_modifiers() set an error.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Problem: [security]: possible code injection via rubycomplete
(tnshima)
Solution: Do not use eval() for arbitrary buffer text
Github Security Advisory:
https://github.com/vim/vim/security/advisories/GHSA-4xgr-vqh2-xfx8
https://github.com/vim/vim/commit/05d704d2856dbb75e95bd33cf222c2e6264fff8b
Co-authored-by: Christian Brabandt <cb@256bit.org>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Problem:
With 'ruler' in the cmdline ('laststatus=0') and ext_messages (ui2), a
'rulerformat' "%m" does not update the "[+]" indicator after ":write",
until a cursor-move.
Analysis:
`redraw_buf_status_later()` only marks windows with a statusline or
winbar. The symptom is hidden by the legacy message grid because the
write message overwrites the cmdline, which redraws the ruler.
Solution:
Also mark the cmdline 'ruler', like `status_redraw_buf()`.
|
| |
|
|
|
|
|
|
|
|
| |
Problem:
A Visual-mode mapping that reads input (`getchar()`) does not include
that input when cascading to other cursors (they only see ESC). OTOH,
Normal-mode mappings do replay the input.
Solution:
Append the payload to the Visual session's Lua-mapping subatom, and to the
session-ending command (`:<C-u>…` mapping).
|
| |
|
|
|
|
|
|
|
|
|
| |
Problem:
- `v:cascading` is false during the Insert-mode live-preview.
- `vim.on_key()` sees the internal keys of the Visual-selection preview
and "zq" steps.
Solution:
- Set `v:cascading` during the Insert-mode preview.
- Don't send internal keys to `on_key` callbacks.
- Use `v:cascading` as the source of truth for `mc_replaying()`.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Problem: Fixed-size windows are resized when sharing free space to a
group of windows.
Solution: When resizing a group of windows, skip windows with a fixed
size if possible (Aryan).
fixes: vim/vim#21478
closes: vim/vim#21479
https://github.com/vim/vim/commit/354c4c0d04c3524b74f8ce6175efebda6cfa4c67
Co-authored-by: Aryan <ether9095cable@gmail.com>
|
| |
|
|
|
|
|
|
| |
Problem:
After `/\%Vfoo<CR>`, `zqn` places no cursors. `mc_zq_target()` clears
`'< '>` before `gn` (to detect a failed match), so `\%V` never matches.
Solution:
Keep the user's `'< '>` during `gn`; detect failure by its beep.
|
| |
|
|
|
| |
Problem: No way to check if cascade is in action.
Solution: Add `v:cascading` variable.
|