Like vim.notify(), but only displays the notification once.
This function prints a warning message to the user only once per Nvim
session. This is useful for things we want the user to see without being
overwhelmed with warning messages (for example, the deprecation messages
in LSP diagnostics).
Other refs to 05.3 don't need to be updated as they refer to the simple mappings
section anyway. Seems they weren't updated when the defaults.vim section was
added as 05.3 instead.
(cherry picked from commit 11e64f26a5)
Bug Fixes
* api: allow nvim_buf_set_extmark to accept end_row key #166861b54344
* diagnostic: assert that diagnostics have line number and column #166879dae939
* diagnostic: clamp diagnostics on negative line numbers #16497096f841
* diagnostic: escape special chars in file names #16588beac24d
* diagnostic: respect "if_many" source option for virtual text #16697060eeaa
* diagnostic: set effective buffer number for DiagnosticChanged autocmd #1648584784a8
* diagnostic: set effective buffer number in autocmd (again) #1659008ddfa9, closes#16474
* lua: do not cast offset to char_u 93f1ec0
* lsp: avoid attaching to unloaded buffers #167260088994
* lsp: call config on_exit handler before context is cleared #16781571609f
* lsp: fix `nil`-index behavior for UTF-8 in `_str_*index_enc` methods #1678503bd914
* lsp: handle offset encoding #167837b60ec7
* lsp: progress handlers should return vim.NIL on error #16476fb11ef0
* options: disallow empty 'fdc' and 'scl' #1677637a00be
* quickfix: avoid O(N^2) when filling from string typval #16663aa0ddc6
* screenpos, float: add top and left border adjustment 8f68548
* terminal: fix resize crash with pending scrollback #16665ae249d8
* ui: close floating window on BufLeave event #16664785bace
* uri: change scheme pattern to not include the comma character #167980e96f7d
Features
* lsp,diagnostic: open folds in jump-related functions #16784ee9e342
* lsp: add buf_detach_client #16741ec101b9
* lsp: use `vim.ui.select` for selecting lsp client #1678214357c8
* runtime: new checkhealth filetype #1670809306f0
Previously, the `_str_utfindex_enc` and `_str_byteindex_enc` helper functions would return `nil` when `offset_encoding == "utf-8"` and `index == nil`. Clearly, this doesn't reflect the expected behavior of the functions they're wrapping which would return the length of the line in this case. This should fix behavior with servers that use UTF-8 `offset_encoding` when applying text edits, formatting a range, and doing range code actions (though this isn't tested currently).
(cherry picked from commit 5f4c501cf1)
Co-authored-by: Rishikesh Vaishnav <rishhvaishnav@gmail.com>
The on_exit handler provided to the client configuration is called after
the client's context is cleared (e.g. which buffers the client was
attached to). Calling the handler sooner allows these handlers to access
the client object and do their own cleanup with the full context.
(cherry picked from commit 5ab49430ee)
Co-authored-by: Gregory Anders <greg@gpanders.com>
Empty string values for these options aren't actually allowed, but
check_opt_strings allows empty string options.
It so happens that 'scl' handles empty string like "auto", but empty 'fdc'
causes glitchiness (win_fdccol_count returns an incorrect value).
Just disallow empty string values for these options completely.
This allows the user to detach an active buffer from the language
client. If no clients remain attached to a buffer, the on_lines callback
is used to cancel nvim_buf_attach.
(cherry picked from commit 6db2155032)
Co-authored-by: Michael Lingelbach <m.j.lbach@gmail.com>
Closes#16624
Fixes two issues with aligning the start position and end position to
codepoints when calculating the start and end range.
When aligning the start position:
* use aligned byte index to calculate character index rather than
the unadjusted byte
When aligning the end position:
* do not adjust the end byte if it falls on a UTF-8 codepoint
* align byte to the first byte of the next codepoint rather than the
last byte of the current codepoint
* compute character character end range on the aligned byte index
This commit also adds additional test coverage, including multibyte operations
that previously failed before this commit.
Closes https://github.com/neovim/neovim/issues/16562https://github.com/neovim/neovim/issues/16249https://github.com/neovim/neovim/issues/16297
* buf_attach_client can be called on an unloaded buffer
* on_attach will prematurely fail, while the language server client
tracks this buffer as attached
* The language server client will track this buffer as attached despite
textDocument/didChange notifications not being sent to the server
* Instead, check if the buffer is loaded and return early, warning via
the lsp logger that buf_attach_client was called on an invalid buffer
(cherry picked from commit 6d63cb8f6a)
Co-authored-by: Michael Lingelbach <m.j.lbach@gmail.com>
Although this can already be done using `BUSTED_ARGS`, it complements
our existing shortcut of `TEST_FILTER.`
[skip ci]
(cherry picked from commit 267ec67fab)
The `prefix_source` function only evaluates the sources from the
diagnostics passed to it; however, because each namespace draws its own
virtual text, its diagnostics will never contain more than a single
source (by definition). This requires changing the semantics of what
"if_many" means from "multiple sources in a single 'batch' of
diagnostics" to "multiple sources of all diagnostics within a buffer".
Line number and column are required and much of the diagnostic API
assumes that these are both present. When one of the two is missing,
cryptic errors pop up in other parts of the diagnostic subsystem.
Instead, assert that diagnostics are well formed when they are entered
into the cache, which provides a clearer error.
nvim_buf_get_extmark uses "end_row" rather than "end_line" in its
'details' dict, which means callers must modify the key names if they
want to re-use the information. Allow nvim_buf_set_extmark to take
"end_row" as an alias to "end_line" to make this more compatible.
See [1].
[1]: https://github.com/neovim/neovim/pull/15011#discussion_r665336968
* str_utf_start/end both cast the offset into the utf string
to a char_u, a pointer + long is well-defined and the cast is
unnecessary. This previously resulted in issues for offsets greater than
256.
(cherry picked from commit 1a887293ef)
Problem: Using freed memory in :psearch. (houyunsong)
Solution: Check the current window is still valid. Fix flaky test.
92bb83e41c
Test_cursorhold_insert timer's 100ms delay was already LoadAdjusted, but change
to 200ms (still LoadAdjust) to match Vim anyway.
(cherry picked from commit dac52e6d04)
Problem: using freed memory with autocmd from fuzzer. (Dhiraj Mishra,
Dominique Pelle)
Solution: Avoid using "wp" after autocommands. (closesvim/vim#5041)
ec66c41d84
Nvim doesn't use Vim's terminal implementation.
Despite this, Nvim has its own *exclusive* way of crashing here.
Requires 'winwidth' > winwidth() and 'nowinfixwidth' to crash; adjust
the test ('nowfw' is the default, but ensure its disabled anyway).
(cherry picked from commit c366c944c2)
refresh_scrollback assumes pending scrollback rows exist only if the
terminal window height decreased (or the screen was full).
However, after accumulating scrollback, it's possible in some cases for
the terminal height to increase before refresh_scrollback is called via
invalidation (especially when the terminal buffer isn't initially
displayed in a window before nvim_open_term), which may crash.
As we'll have enough room for some scrollback rows, just append them to
the top of the buffer until it fills the window, then continue with the
previous logic for any remaining scrollback rows if necessary.
When buffer is visible in two splits simultaneously, BufHidden event is
not triggered, causing the floating window to remain on screen after
switching to another buffer.
Remove BufHidden event from close_events defaults, and close the window
if we changed the buffer to something other than the buffer that spawned
the floating window or the floating window buffer itself.
When filling a quickfix/loclist from a string-typed VimL variable, the
complexity is O(N^2) in the number of lines in the variable.
The problem is caused by using `xstrlcpy(3)` to copy the characters from
the current position up to the next newline into the quickfix/loclist
buffer in a loop.
strlcpy(3) returns the length of `src`, so by necessity it has to
compute `strlen(src)`. This means scanning the full rest of the typval
on every iteration while only copying a small fraction (up to the next
'\n').
This is not a problem whenever the srclen-to-copylen ratio is close to
1, which it usually is. But not in this case. Since we already
calculated exactly how many bytes we want to copy, we should be using
memcpy(3).
This problem is not present in Vim, as it uses `vim_strncpy`, a
`strncpy(3)`-alike, which stops at either `\0` or `n`, whichever comes
first.
The quickfix/loclist window can be filled using a:
1. File (used by commands like :grep/:make/... to source directly
from their errorfile)
2. Buffer (used by :cbuffer and its variants)
3. Typval
a. String (used by :cexpr and its variants)
b. List of strings (used by setqflist(), setloclist(), :cepxr and its
variants)
This commit optimizes case (3a), especially when the typval is a long
string.
The pathological path is triggered by (e.g.) :grep enhancements as found
in https://gist.github.com/romainl/56f0c28ef953ffc157f36cc495947ab3:
function! Grep(...)
return system(join([&grepprg] + a:000), ' '))
endfunction
:cgetexpr Grep('foo')
It would've been better for Neovim to use `systemlist` here, before this
commit.