Problem: a horizontal separator may be added to a window that doesn't need one
if there is no room when moving a different window.
Solution: only restore a hsep in winframe_restore when the global statusline is
enabled.
Problem:
All of Nvim’s threads are clamped to the Default QoS class. This means
that Nvim is forced to compete for CPU time with compilers and other
batch work, and is even prioritized beneath user-initiated work in GUI
apps like e.g. file imports. This significantly harms responsiveness.
Solution:
Tell the kernel that the Nvim process takes part in rendering a UI.
Implementation:
Remove the process-wide QoS clamp. This doesn’t directly do anything to
the main thread, but rather has the side-effect of letting the main
thread run at its actual QoS (User Interactive QoS).
Problem:
insert-mode ctrl-r input is treated like raw user input, which is almost
never useful. This means any newlines in the input are affected by
autoindent, etc., which is:
- slow
- usually breaks the formatting of the input
Solution:
- ctrl-r should be treated like a paste, not user-input.
- does not affect `<c-r>=`, so `<c-r>=@x` can still be used to get the
old behavior.
Co-authored-by: Justin M. Keyes <justinkz@gmail.com>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
Problem:
The default progress message doesn't account for
message-status. Also, the title and percent sections don't get written
to history. And progress percent is hard to find with variable length messages.
Solution:
Apply highlighting on Title based on status. And sync the formated msg
in history too. Also updates the default progress message format to
{title}: {percent}% msg
Problem:
The callback passed to `vim.wait` cannot return results directly, it
must set upvalues or globals.
local rv1, rv2, rv3
local ok = vim.wait(200, function()
rv1, rv2, rv3 = 'a', 42, { ok = { 'yes' } }
return true
end)
Solution:
Let the callback return values after the first "status" result.
local ok, rv1, rv2, rv3 = vim.wait(200, function()
return true, 'a', 42, { ok = { 'yes' } }
end)
vim-patch:8.1.1083: MS-Windows: hang when opening a file on network share
vim-patch:8.1.1527: when moving popup window over the cmdline it is not redrawn
vim-patch:8.1.1550: when a popup has left padding text may be cut off
vim-patch:8.1.1562: popup window not always redrawn after popup_setoptions()
vim-patch:8.1.1575: callbacks may be garbage collected
vim-patch:8.1.1596: when resizing the screen may draw popup in wrong position
vim-patch:8.1.1602: popup window cannot overflow on the left or right
vim-patch:8.1.1615: crash when passing buffer number to popup_create()
vim-patch:8.1.1617: no test for popup window with mask and position fixed
vim-patch:8.1.1620: no test for popup window with border and mask
vim-patch:8.1.1622: wrong width if displaying a lot of lines in a popup window
vim-patch:8.1.1636: crash when popup has fitting scrollbar
vim-patch:8.1.1646: build failure
vim-patch:8.1.1649: Illegal memory access when closing popup window
vim-patch:8.1.1656: popup window width is wrong when using Tabs
vim-patch:8.1.1665: crash when popup window with mask is below the screen
vim-patch:8.1.1666: click in popup window scrollbar with border doesn't scroll
vim-patch:8.1.1676: "maxwidth" of popup window does not always work properly
vim-patch:8.1.1678: using popup_menu() does not scroll to show the selected line
vim-patch:8.1.1707: Coverity warns for possibly using a NULL pointer
vim-patch:8.1.1709: Coverity warns for possibly using a NULL pointer
vim-patch:8.1.1719: popup too wide when 'showbreak' is set
vim-patch:8.1.1733: the man ftplugin leaves an empty buffer behind
vim-patch:8.1.1753: use of popup window mask is inefficient
vim-patch:8.1.1754: build failure
vim-patch:8.1.1755: leaking memory when using a popup window mask
vim-patch:8.1.1768: man plugin changes setting in current window
vim-patch:8.1.1773: the preview popup window may be too far to the right
vim-patch:8.1.1778: not showing the popup window right border is confusing
vim-patch:8.1.1779: not showing the popup window right border is confusing
vim-patch:8.1.1786: double click in popup scrollbar starts selection
vim-patch:8.1.1789: cannot see file name of preview popup window
vim-patch:8.1.1814: a long title in a popup window overflows
vim-patch:8.1.1845: may use NULL pointer when running out of memory
vim-patch:8.1.1850: focus may remain in popup window
vim-patch:8.1.1874: modeless selection in popup window overlaps scrollbar
vim-patch:8.1.1902: cannot have an info popup without a border
vim-patch:8.1.1907: wrong position for info popup with scrollbar on the left
vim-patch:8.1.1917: non-current window is not redrawn when moving popup
vim-patch:8.1.1918: redrawing popups is inefficient
vim-patch:8.1.1929: no tests for text property popup window
vim-patch:8.1.1934: not enough tests for text property popup window
vim-patch:8.1.1936: not enough tests for text property popup window
vim-patch:8.1.1945: popup window "firstline" cannot be reset
vim-patch:8.1.1959: when using "firstline" in popup window text may jump
vim-patch:8.1.1963: popup window filter may be called recursively
vim-patch:8.1.1997: no redraw after a popup window filter is invoked
vim-patch:8.1.1998: redraw even when no popup window filter was invoked
vim-patch:8.1.2009: cursorline highlighting not updated in popup window
vim-patch:8.1.2032: scrollbar thumb wrong in popup window
vim-patch:8.1.2109: popup_getoptions() hangs with tab-local popup
vim-patch:8.1.2110: CTRL-C closes two popups instead of one
vim-patch:8.1.2114: when a popup is closed with CTRL-C the callback aborts
vim-patch:8.1.2164: stuck when using "j" in a popupwin with popup_filter_menu
vim-patch:8.1.2210: using negative offset for popup_create() does not work
vim-patch:8.1.2213: popup_textprop tests fail
vim-patch:8.1.2240: popup window width changes when scrolling
vim-patch:8.1.2277: terminal window is not updated when info popup changes
vim-patch:8.1.2286: using border highlight in popup window leaks memory
vim-patch:8.1.2287: using EndOfBuffer highlight in popup does not look good
vim-patch:8.1.2288: not using all space when popup with "topleft" flips to above
vim-patch:8.1.2300: redraw breaks going through list of popup windows
vim-patch:8.1.2307: positioning popup doesn't work for buffer-local textprop
vim-patch:8.1.2334: possible NULL pointer dereference in popup_locate()
vim-patch:8.1.2420: crash when calling popup_close() in win_execute()
vim-patch:8.2.0826: Vim9: crash in :defcompile
vim-patch:8.2.1207: Vim9: crash in expr test when run in the GUI
vim-patch:8.2.2018: Vim9: script variable not found from lambda
vim-patch:9.0.0133: virtual text after line moves to joined line
Problem: Resizing hashtable is inefficient.
Solution: Avoid resizing when the final size is predictable.
7b73d7ebf7
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Problem: Crash when exiting early. (Ralf Schandl)
Solution: Only pop/push the title when it was set. (closesvim/vim#4334)
e5c83286bb
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Problem: Decoding of mouse click escape sequence is not tested.
Solution: Add a test for xterm and SGR using low-level input. Make
low-level input execution with feedkeys() work.
905dd905de
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Problem:
`msg_show` has "progress" info (title, status, percent) which is not presented
by default.
Solution:
Format TUI messages as `{title}: {msg}...{percent}%`. This also gets sent to UI.
- With specific formatting sent to UI we can remove the `progress` item from
`msg_show` event. It can be added if needed in the future. Also, having
a default presentation makes the feature more useful.
- For `vim._extui` we just need to implement the replace-msg-with-same-id
behavior.
- If any UI/plugin wants to do anything fancier, they can handle the `Progress`
event.
Problem: a pattern that involves a backref on a different line does not
match when 'ignorecase' is set (QiWei, after v9.1.0645)
Solution: Use MB_STRNICMP when ignorecase is set, fix tests to close
swapfiles
related: vim/vim#14756fixes: vim/vim#17470closes: vim/vim#18104bf82e58a70
Co-authored-by: Christian Brabandt <cb@256bit.org>
Problem: potential buffer overrun in bufwrite.c
Solution: Use a temporary variable (John Marriott)
In my Windows 11 Pro 64-bit build MAXPATHL is 1024 and IOSIZE is 1025.
In my Archlinux Linux 64-bit build MAXPATHL is 4096 and IOSIZE is 1025.
In funuction buf_write():
There is a check (line 713) that makes sure the length of fname is less
than MAXPATHL. There is a call to STRCPY() (line 1208) which copies the
string at fname into IObuff (which has size IOSIZE). For Unix builds
fname is set to sfname which may or may not be shorter. However, if
sfname is NULL sfname is set to fname.
Therefore, in builds where MAXPATHL > IOSIZE (eg in my linux build), it
is theoretically possible for the STRCPY() call to exceed the bounds of
IObuff.
This PR addresses this by copying fname into a local variable that has
the same maximum size as fname.
In addition:
Given that the filename is unconditionally overwritten in the for loop,
only copy the directory portion of fname. Move variable i closer to
where it is used.
closes: vim/vim#18095a19b019b87
Co-authored-by: John Marriott <basilisk@internode.on.net>
Problem: CmdlineChanged not triggered by <Del>
Solution: Use STRCMP() instead of STRNCMP()
(Shougo Matsushita)
closes: vim/vim#18101540480697d
Co-authored-by: Shougo Matsushita <Shougo.Matsu@gmail.com>
Problem:
Nvim does not have a core concept for indicating "progress" of
long-running tasks. The LspProgress event is specific to LSP.
Solution:
- `nvim_echo` can emit `kind="progress"` messages.
- Emits a `Progress` event.
- Includes new fields (id, status, percent) in the `msg_show` ui-event.
- The UI is expected to overwrite any message having the same id.
- Messages have a globally unique ID.
- `nvim_echo` returns the message ID.
- `nvim_echo(… {id=…})` updates existing messages.
Example:
local grp = vim.api.nvim_create_augroup("Msg", {clear = true})
vim.api.nvim_create_autocmd('Progress', {
pattern={"term"},
group = grp,
callback = function(ev)
print(string.format('event fired: %s', vim.inspect(ev))..'\n')
end
})
-- require('vim._extui').enable({enable=true, msg={target='msg', timeout=1000}})
vim.api.nvim_echo({{'searching'}}, true, {kind='progress', percent=80, status='running', title="terminal(ripgrep)"})
local id = vim.api.nvim_echo({{'searching'}}, true, {kind='progress', status='running', percent=10, title="terminal(ripgrep)"})
vim.api.nvim_echo({}, true, {id = id, kind='progress', percent=20, status = 'running', title='find tests'})
vim.api.nvim_echo({}, true, {id = id, kind='progress', status='running', percent=70})
vim.api.nvim_echo({{'complete'}}, true, {id = id, kind='progress', status='success', percent=100, title="find tests"})
Followups:
- Integrate with 'statusline' by listening to the Progress autocmd event.
- Integrate progress ui-event with `vim._extui`.
Problem: various functions may return incorrect window numbers for unfocusable
or hidden windows.
Solution: fix the checks. Make sure current windows in non-current tabpages have
a window number.
Fixes#35453
Problem: TextChangedT fires depending on whether Nvim needs to update_screen
while in terminal mode. This makes little sense as redraws can be completely
unrelated to the terminal. Also, TextChanged could be fired from changes in
terminal mode after returning to normal mode.
Solution: trigger it when b:changedtick changes, like other such events. Happens
when invalid cells are refreshed, though is no longer affected by cursor
changes. Don't fire TextChanged from changes in terminal mode after leaving.
Unlike the other TextChanged* events, I've elected to not have it be influenced
by typeahead. Plus, unlike when leaving insert mode when no TextChangedI events
are defined, I don't trigger TextChanged when returning to normal mode from
changes in terminal mode (is that a Vim bug?)
Curiously, Vim's TextChangedT is different; it's tied to its terminal cursor
redraws, which triggers pretty eagerly (but is unaffected by unrelated redraws)
- usually *twice* when data is sent to the terminal (regardless of whether it
causes any visible changes, like incomplete escape codes; wasn't true for Nvim).
Not clear to me how this event was actually intended to work, but this seems to
make the most sense to me.
Problem: w_wrow/col calculation in terminal_check_cursor is wrong when the
terminal is smaller than the window. Common when there's a larger window open
with the same terminal, or just after a resize (as refresh_size is deferred).
Solution: don't calculate it; validate_cursor will correct it later if it's
out-of-date.
Note that the toplines set for the terminal (also before this PR) assume
'nowrap' (which is set by default for terminal windows), and that no weird stuff
like filler lines are around. That means, for example, it's possible for the
cursor to be moved off-screen if there's wrapped lines. If this happens, it's
likely update_topline will move the cursor back on screen via validate_cursor or
similar, but maybe this should be handled more elegantly in the future?
Problem: autocommands can cause various problems in terminal mode, which can
lead to crashes, for example.
Solution: fix found issues. Move some checks to terminal_check and guard against
autocommands messing with things. Trigger TermEnter/Leave after terminal mode
has changed/restored most state. Wipeout the correct buffer if TermLeave
switches buffers and fix a UAF if it or WinScrolled/Resized frees the terminal
prematurely.
These changes also allow us to remove the buffer restrictions on TextChangedT;
they were inadequate in stopping some issues, and WinScrolled/Resized was
lacking them anyway.
Problem: when creating a new tabpage with a terminal window, terminal size is
not updated if there is no statusline.
Solution: do not rely on last_status to implicitly call terminal_check_size as a
side effect of making room for a statusline; call it directly.
Problem: topline of a focused terminal window may not tail to terminal output if
events scroll the window.
Solution: set the topline in terminal_check_cursor.
Problem: missing redraws when restoring saved cursorline/column, plus missing
statusline and mode redraws when not updating the screen in terminal mode.
Solution: schedule the redraws in a similar manner to other modes and remove
some now unnecessary redrawing logic. Redraw if cursorline-related options
change from entering terminal mode. This fixes test failures in later commits.
WTF: TextChangedT triggers based on must_redraw, which is... fun...? Try to
preserve its behaviour as much as we can for now.
Problem: in terminal mode, adjust_topline moves curwin's cursor to the last row
so set_topline tails the non-scrollback area. This may result in the observed
cursor position remaining tailed in events within the focused terminal, rather
than reflecting the actual cursor position.
Solution: use the focused terminal's actual cursor position immediately, rather
than relying on the next terminal_check_cursor call in terminal_check to set it.
Note: Maybe also possible for terminal mode cursor position to be stale
(reporting the normal mode position) when switching buffers in events to another
terminal until the next terminal_check call? (or until refresh_terminal is
called for it) Maybe not worth fixing that, though.
Problem: Text properties crossing lines not handled correctly.
Solution: When joining lines merge text properties if possible.
(Axel Forsman, closesvim/vim#5839, closesvim/vim#5683)
87be9be1db
Port docs from patch v8.1.0688.
Rewrite docs for ml_replace_buf_len().
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Problem: FEAT_TEXT_PROP is a confusing name.
Solution: Use FEAT_PROP_POPUP. (Naruhiko Nishino, closesvim/vim#5291)
05ad5ff0ab
textprop,popuwin remain N/A features.
getchar.c has the relevant code changes.
Port runtest.vim changes from patch v8.1.1561.
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Problem: When appending a line text property flags are not added.
Solution: Add text properties to a newly added line.
b56ac049ea
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Problem: When deleting a line text property flags are not adjusted.
Solution: Adjust text property flags in preceding and following lines.
c1a9bc1a72
"textprop" feature remains N/A.
Porting to sync ml_delete_int() with Vim 8.2.0845 and later.
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Problem: Cannot attach properties to text.
Solution: First part of adding text properties.
98aefe7c32
"textprop" feature remains N/A.
Porting for ml_replace_len().
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Problem:
No way to know the html page with the docs of a tag when you only have
the tag name.
Solution:
Generate a helptags.json that maps tags to their locations.
Generate a helptag.html page that redirects to the HTML page of the given tag.
Co-authored-by: Justin M. Keyes <justinkz@gmail.com>
vim-patch:8.2.0082: when reusing a buffer listeners are not cleared
vim-patch:8.2.0446: listener with undo of deleting all lines not tested
vim-patch:8.2.1092: not checking if saving for undo succeeds
vim-patch:8.2.3174: Vim9: "legacy undo" finds "undo" variable
vim-patch:8.2.3426: crash when deleting a listener in a listener callback
vim-patch:8.2.4142: build failure with normal features without persistent undo
vim-patch:9.0.0361: removing a listener may result in a memory leak