aboutsummaryrefslogtreecommitdiff
path: root/test/functional/ui/messages2_spec.lua
Commit message (Collapse)AuthorAge
* fix(ui2): use global value of 'fillchars' #42397Evgeni Chasnovski4 days
| | | | | | | | 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'.
* fix(ui): ext_messages/ui2: stale 'rulerformat' "[+]" after :write #42315Justin M. Keyes8 days
| | | | | | | | | | | | | | 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()`.
* fix(search): correct patlen calculation for semicolon search (#42150)Qiming zhao2026-09-30
| | | | | | | | | | | | | | | | | Problem: When repeating search using a semicolon (e.g. `/pat1/;/pat2`), `pat` advances past both the semicolon and the delimiter ('/' or '?'), consuming 2 characters, but `patlen` was only decremented by 1. Consequently, `patlen` in the subsequent search is 1 byte too long and includes the trailing NUL byte, corrupting `msgbuf` and causing ui2's search_count handler to fail with 'attempt to concatenate a nil value'. Solution: Decrement `patlen` by 2 when skipping ';' and delimiter. Also ensure ui2 safely guards search_count messages when extracting the search stat. Fixes #41929 AI-assisted
* vim-patch:9.2.1114: Visual selection is not highlighted at the cursor ↵Takumi Katase2026-09-27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | position #42105 vim-patch:9.2.1114: Visual selection is not highlighted at the cursor position Problem: In a terminal the character under the cursor is normally not shown as part of the visual selection. Solution: Don't set "noinvcur" in win_line() (Shane Harper). The problem did not occur in the GUI, only in a terminal. The name "noinvcur" ("don't invert the cursor") was misleading: the variable did not affect the cursor, but whether the character under the cursor could be displayed as part of the visual selection. The "noinvcur" handling may have been meant to help during a visual selection when Visual is shown in reverse video and the terminal draws the cursor by inverting the character under it, as otherwise the character under the cursor would not look highlighted like the rest of the selection. But Vim cannot know in general how a terminal draws the cursor, and when either the cursor is not drawn by inverting the character under it or Visual is not shown in reverse video, the handling just left a character of the visual selection unhighlighted. closes: vim/vim#21317 https://github.com/vim/vim/commit/d10aab4ba6602f8f2f2576d2d62ceb63869db6fb Co-authored-by: Shane Harper <shane@shaneharper.net> AI-assisted
* fix(ui2): dialog messages offset by the pager line count #41839Justin M. Keyes2026-09-11
| | | | | | | | | | | | | | | | Problem: expand_msg() derives its start row from the pager buffer even when the target is the cmd or dialog buffer, so the copied lines are appended instead of replacing, and the copied extmarks are placed at pager rows in a smaller buffer: "Invalid 'end_col': out of range", thrown inside a UI event handler. Solution: Offset only when appending to a visible pager, and read the line count after msg_clear(), whose autocmds may write to the pager. Copy marks with `strict = false`, since the rows and columns are recomputed for a different buffer and should clamp rather than raise. AI-assisted
* fix(ui2): :quit on unsaved buffer shows hit-enter prompt #41575Tomasz N2026-09-09
| | | | | | | | | Problem: "Press any key" modal prompt is shown when `:quit` from unsaved buffer, even if ui2 is enabled (which should never show hit-enter prompt). Solution: Skip `wait_return` for `ext_messages` UIs.
* fix(ui2): mouse movement dismisses expanded messages #41732Volodymyr Chernetskyi2026-09-06
| | | | | | | | | | | | | Problem: cmd_on_key() tests the key it was handed against the literal string '<MouseMove>', but at that point "typed" still holds raw key bytes. Thus the comparison never holds and the branch its own comment describes is dead. Moving the mouse over an expanded cmdline collapses it. Solution: Translate the key once, up front, so every comparison in the function sees the same form. AI-assisted
* feat(ui2): highlight the [+x] spill indicator with MoreMsg #41679Volodymyr Chernetskyi2026-09-04
| | | | | | | | | | | | | Problem: The "spill" indicator that ui2 appends when messages overflow the available height is drawn with whatever highlight the message tail happens to have, so it is indistinguishable from the message text. Solution: Give the [+x] chunks an explicit `MoreMsg` highlight, and only fall back to the message tail highlight for chunks that don't carry one of their own. AI-assisted
* feat(ui2): scroll the dialog window with the mouse wheel #41682Volodymyr Chernetskyi2026-09-04
| | | | | | | | | | | | Problem: The ui2 dialog implements paging for the arrow keys, Home/End and the page keys, but not for the mouse wheel. When `mouse` contains `"c"`, turning the wheel does nothing at all. Solution: Handle <ScrollWheelUp>/<ScrollWheelDown>, scrolling by the `mousescroll` `"ver"` amount. AI-assisted
* feat(multicursor): MC HAMMER #41587Justin M. Keyes2026-09-01
| | | | | | | | | | | | | | | | | | | | | Other (squashed) commits: fix(tui): emit ui_send output atomically with the frame Problem: tui_ui_send() writes directly to the TTY, bypassing the output buffer. Sequences sent via nvim_ui_send() (e.g. kitty multiple-cursors, or visual-dot-repeat) always arrive in a separate TTY write from the frame they were computed for. This manifests as "tearing", or e.g. in the case of multicursor the terminal renders text with stale cursor overlays. Solution: - tui_ui_send(): while a frame is being assembled (pending invalid regions or buffered output), buffer instead of writing directly. - Out-of-frame sends (tty queries, clear-on-disable) still write immediately. - mcursor.lua: emit the terminal-cursor update at the end of the redraw cycle (`on_end`, when screen positions are final) instead of vim.schedule().
* fix(ui2): don't draw MsgSeparator if cmdheight=0 #41531not_compiled2026-08-29
| | | | | | | | | Problem: When 'cmdheight' is 0, the MsgSeparator can obscure the statusline when a message is displayed, making its contents disappear until the next redraw. Solution: Skip the separator when 'cmdheight=0' available.
* fix(ui2): cmdwin is not special #41508Justin M. Keyes2026-08-26
| | | | | | | | | | | | | | | | | | | | Problem: Unreliable ui2 test: FAILED …/ui/messages2_spec.lua @ 277: messages2 multiline messages and pager …/ui/messages2_spec.lua:277: Row 1 did not match. Expected: ... |*{1::}echo "foo" | echo "bar\nbaz\n"->repeat(&lines) | |*{1::}messages | |*{1::}^ | ... Actual: ... |*{9:vim.schedule callback: ...ork/neovim/neovim/runt [+7]}| Solution: ui2 is doing contortions to handle the old cmdwin behavior; stop doing that, it's no longer necessary since b2bf7bcfb151.
* feat(ui2): lift ui2 options into 'messagesopt' (part 1) #41474Justin M. Keyes2026-08-25
| | | | | | | | | | | | | | | | | | | Problem: In order for ui2 to graduate to the main "messages ui" its configuration needs to graduate into actual options. Solution: Migrate some of its config to 'messagesopt': - "maxheight" (note: currently this is an integer treated as a "percentage"; if we want to support a row count we could allow values with units, like `"42%"`) - "pager" - "timeout" Also improves error messages: messagesopt=hit-enter,history:500,bogus E474: Unknown item 'bogus' messagesopt=hit-enter,history:500,progress:x E474: 'progress' must be one of: , c messagesopt=hit-enter,history:abc E474: 'history' requires a number
* fix(ui2): pager_char does not match keycode aliases #41468Justin M. Keyes2026-08-24
| | | | | | | | Problem: `pager_char` compares the `keytrans()` result exactly. E.g. `pager_char = "<cr>"` does not work, it expects `<CR>` (uppercase). Solution: Normalize `pager_char` in enable().
* fix(ui2): dismiss msgs after mapped motions #41450not_compiled2026-08-23
| | | | | | | | | | Problem: Mapped keys can produce on_key callbacks with an empty `typed` value. so mapped motions such as `j -> gj` are not recognized as typed input and do not dismiss messages Solution: Track whether an empty `typed` callback follows typed input, allowing mapped motions to dismiss messages like directly typed motions.
* fix(ui2): offset extmarks copied to pager by srow #41425Sean Dewar2026-08-22
| | | | | | | | Problem: wrong end_row when copying extmarks to the pager buffer when expanding a message. Results in incorrect highlights or errors such as "invalid `end_col` out of range". Solution: don't forget to offset end_row by srow, as is already done for the copied lines and extmark rows.
* feat(ui2): drop default enter-pager-via-CR mapping #40993Rob Pilling2026-08-17
|
* fix(messages): `inputlist()` offers the mouse when it cannot be used (#41280)Barrett Ruth2026-08-14
| | | | | | | | | | Problem: `inputlist()` advertises "click with the mouse" purely because it implements click selection, so under the default `'mouse'` of "nvi" it offers a click that command-line mode never receives. Solution: Only offer the mouse when `'mouse'` covers command-line mode, the same condition `:help inputlist()` already documents.
* fix(ui2): pager handling #41179Justin M. Keyes2026-08-05
| | | | | | | | - Avoid shared state. Pass `focus` to set_pos()/expand_msg() instead of a shared `pager_focus` flag: the flag is only cleared when set_pos() actually enters the pager, so ":messages" from inside the pager left it set. - pager_shown(): the pager window is invalid after leaving it with "q". - Reuse pager_shown() in expand_msg().
* fix(ui2): do not steal focus when consecutive cmds emit messages #41062Erdiansyah2026-08-05
| | | | | | | | | | Problem: A message emitted while a previous expanded message is still visible opens the pager and enters it, moving focus away from the buffer window without an explicit request (#41061). Solution: Only enter the pager when it was explicitly requested ("g<", :messages, or entered from the expanded cmdline). An unfocused pager is dismissed by the cmdline key handler, which stays armed across the cmdline and no longer dismisses on non-typed keys (#39221).
* fix(statusline): don't clobber global statusline during autocmd #41169Tanishq2026-08-05
| | | | | | | | | | | | | | | | | Problem: With `laststatus=3`, a pager float shares the main grid's statusline row. Setting a diagnostic fires `DiagnosticChanged`, whose handler calls `nvim__redraw({ statusline = true })`. Analysis: Inside the autocmd, `curwin` is temporarily switched to the tiled window showing that buffer, so `win_redr_status()` paints its statusline over the pager's `[Pager]` statusline on the shared row. After the autocmd, `curwin` is restored but the pager statusline is never repainted. Solution: Use `ctx_saved_curwin()` decide whether to draw the global statusline, matching `win_redr_stl_expr()` and `update_screen()`. No behavior change if no buffer-context switch is active.
* test(harness): migrate away from magic globalsJustin M. Keyes2026-07-21
| | | | | | | | | | | | | | | | | | | | | Problem: The magic globals `it`, `describe`, etc., are more trouble than they are worth. - Hooking into `after_each` requires `getfenv()` hacks. - They confuse luals/emmylua, because the top-level `.luarc.json` isn't merged with `test/.luarc.json` (apparently a luals limitation?) - They totally defeat discoverability because the user just has to "know" about the various magic symbols. So they harm DX, which means they serve no purpose at all. Solution: - Expose the test API from `testutil`, so tests can call `t.it()`, `t.describe()`, etc., in the conventional way. - Drop `getfenv()` hacks. - Drop the `setfenv()` injection in `load_chunk`. - Drop `test/_meta.lua`.
* fix(ui2): preserve Visual mode messages #40828Barrett Ruth2026-07-20
| | | | | | | | | Problem: The existing `showmode` overlay can immediately cover messages emitted while Visual mode is active, including the `g CTRL-G` word count. Solution: Protect Visual mode messages with the existing message delay and temporarily hide the previous last-line overlay until it is restored.
* fix(ui): combine float border with window background #40796Artem Krinitsyn2026-07-19
| | | | | | | | | | Problem: Float border highlight groups (FloatBorder, FloatTitle and FloatFooter) fall back to Normal background highlight if no background color set. Solution: Combine border colors with window-local Normal highlight. Fix #38330
* fix(ui2): avoid ModeChanged in message window #40788Barrett Ruth2026-07-18
|
* fix(ui2): fix ruler on repeated messagesSébastien Hoffmann2026-07-11
| | | | | | | | | | Problem: a long message is cropped to keep the ruler visible. But when the message is repeated, it can be written over the ruler, while the repetition indicator "(1)" is still placed just before the ruler, which ends up somewhere inside the message. Solution: currently, long messages are only cropped when setting the 'last' virttext. Make sure this happens after a repeated long message.
* fix(ui2): correctly crop message at multibyte/multicell characterSébastien Hoffmann2026-07-11
|
* fix(ui2): clear showcmd virt_text together with search countSébastien Hoffmann2026-07-11
| | | | | | | | | | Problem: when the search count is displayed, the showcmd virt_text is set to 11 empty spaces to ensure a consistent distance between search count and ruler, or screen edge in case of noruler. But when the search count is removed to make place for a message, the empty dummy showcmd remains and unnecessarily erases part of the message. Solution: properly remove showcmd together with search count.
* fix(ui2)!: consistent ruler width inside/outside statuslineSébastien Hoffmann2026-07-11
| | | | | | | | | | | | | | | | | | | | | | Problem: before ui2, the ruler in the last line had a one cell safety margin on the right because writing in the last column of the last line "scrolls the screen up on some terminals," according to code comments. When the ruler is included in the statusline, it aligns on the left with the normal ruler, but goes all the way to the screen edge on the right, and is therefore one cell longer. Since ui2 doesn't have that padding cell, they don't align anymore. Also, in the future, when the C implementation of the ruler will be replaced with a default expression that will be included in the default statusline (currently `%-14.(%l,%c%V%) %P`), the width will naturally be the same in both places, and the unit tests will need adapting anyway. Solution: when ui2 is active, increase the ruler width by 1. BREAKING CHANGE: the default ruler in ui2 is now 1 cell wider. ref https://github.com/neovim/neovim/issues/40247
* fix(cmdwin): space in cmdwin-char 'statuscolumn'Justin M. Keyes2026-06-26
| | | | | To match the old behavior, the cmdwin-char should not be followed by a space char.
* feat(cmdwin): implement cmdwin as a normal buf+winJustin M. Keyes2026-06-25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: cmdwin (the `:q` cmdline buffer) has various limitations which require special-casing all over the codebase. Besides complicating the code, it also breaks async plugins if they try to create buffers/windows after some work is done, if the user happens to open cmdwin at the wrong the moment: Lua callback: …/guh.nvim/lua/guh/util.lua:531: E11: Invalid in command-line window; <CR> executes, CTRL-C quits stack traceback: [C]: in function 'nvim_buf_delete' …/guh.nvim/lua/guh/util.lua:531: in function <…/guh.nvim/lua/guh/util.lua:526> Solution: Just say no to "inception". Reimplement cmdwin as a normal buffer+window. All of the cmdwin contortions (in both core, and innocent plugins) exist literally only to support "inception": recursive cmdwin-in-cmdline-things, like `<c-r>=`, `/`, search-during-substitute, `:input()`, etc. So we just won't support that (though I have a potential plan for that later, which I call "modal parking lot"). The benefit is that plugins, and core, no longer have to care about cmdwin. BONUS: - mouse-drag on vertical separators works (it only worked for horizontal/statusline before) - inccommand-in-cmdwin now works correctly, for free (thus don't need #40077). POTENTIAL FOLLOWUPS - Drop `CHECK_CMDWIN` ("E11: Invalid in command-line window"), allow chaos. - Unify `BUFLOCK_OK` / `LOCK_OK` ? DESIGN: - Eliminate lots of C globals, `EX_CMDWIN`, etc. - `text_locked()` no longer reports true for cmdwin. - cmdwin = a normal window with 'winfixbuf', 'bufhidden=wipe', 'buftype=nofile'. Invariants come from those options rather than special cases throughout the codebase. - `nv_record` for q:/q//q? calls Lua `nlua_call_vimfn("vim._core.cmdwin", …)`. No `K_CMDWIN` / cmdline-reader detour. - `cedit_key` (`c_CTRL-F`) schedules a deferred event that calls `vim._core.cmdwin.open(type, content, pos)` and returns `Ctrl_C` so the in-flight cmdline cancels. Reader state is not serialized; instead the captured `(type, line, col)` is replayed via `nvim_feedkeys(type..line.."<CR>", "nt", …)` after user confirms. - On confirm/cancel: `<CR>` / `<C-C>` calls into Lua which closes the window and re-feeds the cmdline. BREAKING CHANGES: - Expression-register cmdline (`<C-R>=` from insert-mode) no longer supports cmdwin. Same applies to `input()` / `inputlist()` (already covered by `text_locked`). - Usage of cmdwin in macros/mappings will probably break (assuming they ever worked).
* fix(ui2): clear search_count after clearing the screenLuuk van Baal2026-06-22
| | | | | | | Problem: Clearing the screen doesn't clear the "last" virtual text. Dupe counter virtual text is not increased beyond 1. Solution: Clear "last" virtual text when clearing the screen. Restore assignment lost in a previous commit.
* fix(messages): no prompt/newlines for ext_messages filter command #39786)Tomasz N2026-06-03
| | | | | | Problem: Redundant newlines and "Press any key" prompt with ext_messages for Visual filter command. Solution: Remove newlines and prompt with ext_messages.
* fix(ui2): unable to configure window height of absolute 1 #39781luukvbaal2026-05-14
| | | | | | | | | | | | Problem: - Configuring the height of one of the message targets to 1 is recognized as 100% of 'lines'. - Cmdline is expanded for message exceeding 'cmdheight' even if the configured height is smaller than or equal to 'cmdheight'. Solution: - Recognize a height of 1 as absolute; a decimal number smaller than 1 is taken as a fraction of 'lines' (replace 1 with 0.999 for the old behavior). - Don't expand the cmdline if the configured height doesn't allow it.
* fix(grid): keep grid sizes updated during redraw #39757luukvbaal2026-05-13
| | | | Problem: Assert tripped when window is resized during update_screen(). Solution: Re-allocate grid when resizing happens during update_screen().
* fix(messages): fast context for for nvim_echo({kind}) callback #39755luukvbaal2026-05-12
| | | | | | | | Problem: vim.ui_attach() callback for nvim_echo() call that spoofs an internal message kind is executed in fast context. Solution: Set msg_show callback |api-fast| context dynamically at external message callsites, and for internal list_cmd", "progress" and "shell*" messages.
* fix(ui2): unable to route by message ID #39734luukvbaal2026-05-11
| | | | | | | | | | | | | | | | | | | | | Problem: - "bufwrite" message identifier is encoded in the message ID of a "progress" kind message (since ff68fd6b); UI2 does not allow routing by message ID. - No documented way to set a default message target for all but a few kinds (without copying all of |ui-messages| kinds to cfg.msg.targets). - A user adding a message route for the documented empty "" kind can result in unexpected behavior. - Showing duplicate message (x) indicator in msg and cmd targets simultaneously is unsupported. - Manually triggering CursorMoved autocommand to add matchparen highlighting in the cmdline. Solution: - Match cfg.msg.targets keys as Lua pattern to a message ID. - Recognize "default" as key in cfg.msg.targets, drop the undocumented cfg.msg.target field. - Don't try to get configured target for "" message kind/trigger. - Maintain msg indicator virtual text for the cmd and msg target. - Add matchparen highlighting by directly calling the Lua module (possible since b813c7e0).
* fix(ui2): entering the pager fails if `<ESC>` is remapped to `:fclose` (#39462)Tomasz N2026-05-06
| | | | Problem: Entering the pager fails if <ESC> is remapped to :fclose by user. Solution: Avoid executing mappings with nvim_feedkeys() that closes expanded cmdline.
* fix(ui2): don't dismiss expanded messages for non-typed key #39247luukvbaal2026-04-20
| | | | | | | | | Problem: Invalid check for non-typed key to dismiss expanded cmdline. Unable to delay the timer that removes a message from the msg window. Solution: Check for empty string instead of nil to determine whether a key is typed. Restart the timer if it expires while the user is in the msg window. Allow entering the msg window with a mouse click.
* fix(ui2): ensure msg window is visible after closing tabLuuk van Baal2026-04-20
| | | | | | | | | | Problem: After closing a tabpage while the msg window is showing a message, it is hidden while the msg window still contains a message. Solution: Unhide the msg window after entering a tabpage and it still contains a message. Co-authored-by: Linykq <yukunlin590@gmail.com>
* feat(options): add 'winpinned' to pin a window #39157luukvbaal2026-04-19
| | | | | | | | | | | | | | Problem: - Unable to "pin" a window to prevent closing without specifically being targeted. - :fclose closes hidden windows (even before visible windows). Solution: - Add 'winpinned' window-local option. When set, window is skipped by :fclose and :only. Pin the ui2 cmdline window (which should always be visible), so that it is not closed by :only/fclose. - Skip over hidden (and pinned) windows with :fclose. Co-authored-by: glepnir <glephunter@gmail.com>
* fix(ui2): dialog paging is inconsistent #39128luukvbaal2026-04-16
| | | | | | | | | | | | | | Problem: - Paging keys in the dialog window consume input when the user may not expect it. The dismissable title hint intended to mitigate that results in having to press Escape twice to abandon the prompt. - Mimicked "msgsep" float border is taking up unnecessary space when window takes up the entire screen. Solution: - Use (conventional, albeit less convenient) keys intended for scrolling to page the dialog window: <(Mousewheel/Page)Up/Down>, <Home/End>. - Only set the float top border when separation is actually necessary, i.e. window does not reach the first row.
* fix(message): flush messages before "empty" msg_show #38854luukvbaal2026-04-07
| | | | | | Problem: When emitting a msg_show event with the "empty" kind, there may still be messages waiting to be emitted, which are then dropped as a result of recursion protection. Solution: Flush messages before emitting "empty" message show.
* fix(ui2): update spill indicator when appending to expanded cmdline #38715luukvbaal2026-04-05
| | | | | | Problem: When messages are appended to an already expanded cmdline, the spilled lines indicator is not updated. Solution: Remove early return for updating virtual text while cmdline is expanded, guard updating "msg" virt_text at callsite instead.
* fix(ui2): flicker when entering pager from expanded cmdline #38639luukvbaal2026-03-31
| | | | | | | | | | | Problem: 'showcmd' causes flickering when pressing "g<" to enter the pager when the cmdline is expanded for messages. Initial keypress for an incomplete mapping is not giving 'showcmd' feedback while cmdline is expanded for messages (which is only dismissed upon the vim.on_key callback after 'timeoutlen'). Solution: Delay dismissing expanded cmdline when vim.on_key() callback receives "g". Place 'showcmd' "last" virtual text during expanded cmdline.
* fix(ui2): ENTER may focus pager in insert/terminal mode #38497phanium2026-03-26
| | | | | | | fix(ui2): prevent <CR> from focusing pager in insert/terminal mode Problem: <CR> in insert/terminal mode can focus pager unexpectedly. Solution: Don't enter the pager when <CR> is pressed during expanded cmdline in insert/terminal mode.
* fix(ui2): no paging in dialog below expanded cmdline #38489luukvbaal2026-03-26
| | | | | | | | | | | Problem: When entering the cmdline below expanded messages, those messag