summaryrefslogtreecommitdiffstatshomepage
path: root/runtime/lua/vim/_extui/messages.lua
AgeCommit message (Collapse)AuthorFiles
2026-02-05refactor: rename _extui => _core.ui2 #37692luukvbaal1
Problem: _extui module name is confusing and should eventually end up in _core/. Solution: Move it there and name it ui2.
2026-02-04fix(ui2): only copy highlight marks when expanding cmdline #37709luukvbaal1
Problem: Error copying over multi-line message span marks to expanded cmdline. Solution: Only copy over the highlight marks as intended.
2026-02-04feat(ui2): replace message by its ID #37672luukvbaal1
Problem: UI2 does not implement the msg_show event msg_id parameter. Solution: Store message IDs currently shown in the cmd/msg buffers. Set extmarks spanning the message which are used to replace a still visible message when a new message with the same ID is received.
2026-02-03fix(ui2): wildmenu hidden behind dialog window #37684luukvbaal1
Problem: The wildmenu is hidden behind the dialog window with "list" in 'wildmode'. Global ('laststatus' set to 3) statusline is hidden behind the pager window. Solution: Check wildmenumode() to adjust the dialog position when necessary. Ensure pager is positioned above the global statusline with 'laststus' set to 3.
2026-02-02fix(ui2): callbacks reference stale message-window handles #37673luukvbaal1
Problem: Scheduled callbacks reference potentially outdated window handles e.g. after switching tabpage. Solution: Use ext.wins which stores the updated window handles.
2026-01-26fix(ui): only internal messages are unsafe #37462luukvbaal1
Problem: Fast context for msg_show event inhibits vim.ui_attach from displaying a stream of messages from a single command. Solution: Remove fast context from msg_show events emitted as a result of explicit API/command calls. The fast context was originally introduced to prevent issues with internal messages.
2025-11-08fix(ui): cmdline_show is not fired after clearing the screen (#36451)luukvbaal1
Problem: Resize events during startup may clear an active external cmdline, which is then not redrawn. UI2 VimResized autocommand does not work. UI2 message appearance may be altered by inherited window options. The message separator uses the wrong fillchar. Solution: Unset cmdline_was_last_redrawn when clearing the screen, such that cmdline_show is re-emitted. Ensure set_pos function is called without arguments. Ensure such options are unset. Use 'fillchars'->msgsep.
2025-10-10fix(ui2): don't scroll beyond eob in dialog window #36116luukvbaal1
Problem: Forward page scrolling reveals eob lines in the dialog window. Solution: Check if the end of the buffer is visible before scrolling down.
2025-08-21feat(extui): support paging in the dialog window (#35310)luukvbaal1
Problem: Unable to see e.g. `inputlist()` prompts that exceed the dialog window height. Multi-line prompts are not handled properly, and tracking is insufficient for messages in cmdline_block mode. Solution: Add vim.on_key handler while the dialog window is open that forwards paging keys to the window. Properly render multi-line prompts. Keep track of both the start and end of the current cmdline prompt. Append messages after the current prompt in cmdline_block mode.
2025-08-11fix(extui): ensure temporary cmdline config is not restored #35301luukvbaal1
Problem: Temporary cmdline config is saved to be restored later. Solution: Close the cmdline window so that it is recreated with the appropriate config.
2025-07-29fix(extui): ensure windows are valid in scheduled on_key (#35106)luukvbaal1
2025-07-24fix(extui): attempt to perform arithmetic on field 'last_emsg' (#35047)phanium1
Co-authored-by: Luuk van Baal <luukvbaal@gmail.com>
2025-07-22feat(ui2): more predictable routing #35028luukvbaal1
Problem: Routing based on message kinds can be perceived as unpredictable. Solution: Implement phase 1 of #34281, always showing the full message in a window dismissed on any user input when it does not fit in the 'cmdheight'. Also show spill "[+n]" indicator if needed.
2025-07-12fix(extui): disable cmdline highlighter when showing a message (#34887)luukvbaal1
Problem: When message is moved from message window to cmdline, the cmdline highlighter is not disabled. Solution: Disable the highlighter (and only scroll to bottom when message was moved to pager).
2025-07-10test(ui/{cmdline,message}2_spec): reduce flakiness/runtime #34875luukvbaal1
Problem: Storing the configured 'cmdheight' value is scheduled and may happen after cmdline2_spec already entered block_mode. Excessive wait time for expected screen state due to delayed ruler after an error message. Solution: Only schedule storing the user configured 'cmdheight' if v:vim_did_enter is unset. Use regular message instead of error.
2025-07-09feat(extui): use winborder for msg window #34859Sebastian Lyng Johansen1
Problem: The message window is essentially a regular floating window but does not use 'winborder'. Still some "scratch" buffer options unset after it was removed from its window. Solution: Do not set the border when opening the window message. Forego passing `scratch = true` when opening a buffer, set the options manually when necessary. Co-authored-by: Luuk van Baal <luukvbaal@gmail.com>
2025-07-09feat(extui): show dismissed message in cmdline (#34745)luukvbaal1
Problem: An accidental key press can dismiss a routed message to be shown in full before the user was able to read it. 'verbose' message routing based on an outdated condition results in "last_set" messages being separated from its message pair. Solution: Show a message to be shown in full in the cmdline window instead of the pager. Keep it there and update the spill indicator when the message is dismissed. Remove the 'verbose' message routing.
2025-06-27feat(extui): don't enter pager for routed message #34679luukvbaal1
Problem: Messages routed to the pager to be shown in full, enter the pager automatically, yielding another "press-q-prompt". Solution: Only enter the pager when requested explicitly. Otherwise, close the pager on the next typed mapping, unless that mapping entered the pager.
2025-06-27perf(extui): delay creating windows, buffers and parser (#34665)luukvbaal1
Problem: vim._extui unconditionally creates windows, buffers and the Vimscript cmdline highlighter when it is first loaded. Solution: Schedule first creation of the window so that first redraw happens sooner (still need to create at least the cmdline window asap as it can have a different highlight through hl-MsgArea; thus further delaying until the first event that needs a particular target seems redundant). Load the cmdline highlighter on the first cmdline_show event.
2025-06-26feat(ui): emit "msg_clear" event after clearing the screen (#34035)luukvbaal1
Problem: ext_messages cannot tell when the screen was cleared, which is needed to clear visible messages. An empty message is also never emitted, but clears messages from the message grid. Solution: Repurpose the "msg_clear" event to be emitted when the screen was cleared. Emit an empty message with the `empty` kind to hint to a UI to clear the cmdline area.
2025-06-15fix(messages): add append parameter to history entries (#34467)luukvbaal1
Problem: The "append" parameter added in abb40ece is missing from history entries, resulting in different message formatting for "g<". Solution: Add "append" field to message history entries. Co-authored-by: phanium <91544758+phanen@users.noreply.github.com>
2025-06-15fix(extui): clear cmdline buffer for first message (#34490)luukvbaal1
Problem: Cmdline buffer is not cleared for a new message (since c973c7ae), resulting in an incorrect spill indicator. When the cmdline buffer is cleared, "msg_row" is not invalidated, resulting in an error. The extui module is untested. Return value of `vim.ui_attach()->callback` is undocumented. Solution: Clear the cmdline buffer for the first message in an event loop iteration. Ensure msg_row passed as end_row does not exceed buffer length. Add `messages_spec2.lua` to test the extui module, keeping in mind that test coverage will greatly increase if this UI is made the default. As such, only tests for specific extui functionality unlikely to be covered by tests leveraging the current message grid. Document the return value of `vim.ui_attach()->callback`, it seems to make sense, and is also used to suppress remote UI events in `messages_spec2.lua`.
2025-06-13docs(extui): rename box->msg, more->pager, prompt->dialogLuuk van Baal1
Includes breaking changes to the `opts` layout. "box" doesn't really describe anything other than a floating window so was an unwanted synonym.
2025-06-13fix(extui): only append messages exceeding 'cmdheight' to "more"Luuk van Baal1
Problem: 8defe1a declared the "more" window the most convenient place to route messages to if it is already open for msg.pos == 'cmd'. In usage, this doesn't appear to be the case. Appending messages as added in that commit is still useful, but should only be done for messages that spill 'cmdheight'. Solution: Only append messages exceeding 'cmdheight' to the more window. To do this, instead of immediately writing to the more buffer, write to the cmd buffer and calculate its height. Then copy the text and its highlights to the more buffer.
2025-06-06fix(extui): use visible to determine active "more" (#34327)luukvbaal1
Problem: Current window is checked to determine whether "more" window is open. Making it the current window is scheduled in case the cmdwin is open so this can be too late. "cmdline_hide" may be emitted when the topline is temporarily invalid (after incsearch->restore_viewstate()). Solution: Use the window visibility to determine an active "more" window instead. Don't nvim__redraw->flush the "cmdline_hide" event (a normal will already happen).
2025-06-04fix(extui): copy window config to new tabpage (#34308)luukvbaal1
Problem: When opening a new tabpage, extui windows are initialized with their default config. Window visiblity/dimensions on other tabpages may get out of sync with their buffer content. Solution: Copy the config of the window to the new tabpage. No longer keep track of the various windows on each tabpage. Close windows on inactive tabpages instead (moving them could be more efficient but is currently not supported in the API).
2025-06-02fix(extui): properly setup "more" window for changed bufferLuuk van Baal1
Problem: Buffer setup after moving the message buffer to the "more" window after ff95d7ff is incomplete. Solution: Adjust and invoke tab_check_wins() to do the setup instead.
2025-06-02fix(extui): reposition "more" window after entering cmdwinLuuk van Baal1
Problem: Closing the "more" window for an entered cmdwin in ff95d7ff9 still requires special casing to properly handle "more" visibility. Solution: Reposition the "more" window instead; anchoring it to the cmdwin.
2025-06-01fix(extui): adjust "more" window routing (#34251)luukvbaal1
Problem: Message lines from multiple message events that end up spilling 'cmdheight' end up spread out over the cmdline and "more" window. Messages emitted as feedback to a typed :command (rather than its sole purpose like :echo/:=) are routed to the more window. The more window isn't closed when entering the cmdwin, and doesn't allow `vim.hl.on_yank()`. Solution: When first opening the "more" window for spilled messages, move the message buffer to the more window. Restrict routing of typed commands to echo kinds. Ignore all events but WinLeave and TextYankPost.
2025-05-27feat(extui): route to "more" window if it is open (#34190)luukvbaal1
Problem: An already open "more" window is the most convenient place to route messages to with `cfg.msg.pos == 'cmd'`. Instead we route to the cmdline (unless that message also exceeds 'cmdheight'). Solution: Route to "more" window while it is open and scroll to bottom to show the newest message. This is more convenient and more efficient due to not writing to the target buffer first (which is done to calculate the height of the message). (Ensure message highlights are deleted when text is replaced.)
2025-05-26fix(extui): write each message chunk pattern separately (#34188)luukvbaal1
Problem: Bulking message lines to write in a single API call is complicated and still not correct w.r.t. overwriting highlights. Solution: Write each chunk pattern separately with it's highlight such that it will be spliced correctly for message chunks that contain a carriage return. Go with correctness over performance until this proves to be too inefficient. Also add an identifying name to the various extui buffers.
2025-05-24fix(extui): using tracked message column in cleared buffer (#34154)luukvbaal1
Problem: Using tracked message column as column in cleared buffer. Solution: Ensure column does not exceed current line length. Further work to ensure carriage return and cmdline block mode work properly.
2025-05-24fix(extui): append consecutive :echon messagesLuuk van Baal1
Problem: Consecutive `:echon` messages are printed on separate lines. Solution: Implement the new msg_show->append parameter.
2025-05-21fix(extui): reset message state after "search_cmd" message (#34119)luukvbaal1
Problem: A "search_cmd" message alters the message state (since 8e8f4523), unnecessarily affecting logic for messages that follow. Solution: Reset the appropriate variables after a "search_cmd" message. Don't show "search_cmd" message with zero 'cmdheight'.
2025-05-17fix(extui): translate <Tab> in cmdline text (#34055)luukvbaal1
Problem: <Tab> is not translated on the cmdline, and exposes a wrong assumption in search messages that may contain multiple chunks. Solution: Translate unprintable characters in the cmdline content. Extract the 'search_count' from the last chunk and route 'search_cmd' to cmdline to handle multiple chunks.
2025-05-15fix(extui): better message highlighting after carriage return (#34034)luukvbaal1
Problem: Incorrect message highlighting for highlighted message chunks containing carriage returns. Solution: Add a highlight for each substring ending in a newline or carriage return separately.
2025-05-14revert: show "g<" hint when message spills 'cmdheight'Luuk van Baal1
Problem: Hint message to press "g<" for message that spills 'cmdheight' is too intrusive. Solution: Remove the hint message. Document the meaning of the spill indicator instead.
2025-05-14fix(extui): handle carriage return in messagesLuuk van Baal1
Problem: Carriage return should place the "write cursor" at the start of a line. Solution: Construct the to be printed line by iterating over carriage returns.
2025-05-13fix(extui): adjust which messages are sent to "more" windowLuuk van Baal1
Problem: Decision whether message is sent to "more" window is based on the number of newlines present in a message, rather than the actual text height. With the "box" target, messages that come from a cmdline entered command are not always routed to the more window. Solution: Still write the message to the target buffer, and calculate the actual text height. Postpone updating several state variables until after the decision to re-route is made. With the "box" target, only consider the text height of the message if it is not a message from a cmdline entered command.
2025-05-13feat(extui): show "g<" hint when message spills 'cmdheight'Luuk van Baal1
Problem: Extui shows a spill indicator to hint to the user to press "g<" to show the output of the last command. The user may be unaware of this mapping. Solution: Route a hint message to the message "box" window.
2025-05-09fix(extui): close cmdwin to enter "more" window (#33860)luukvbaal1
Problem: Cannot enter "more" window while cmdwin is open since it is a regular window and changing windows is disallowed. Solution: Close cmdwin to enter the "more" window. Minor regression w.r.t. the current message grid. Resolving that will require somehow bypassing textlock for the "more" window.
2025-05-09fix(extui): route interactive messages to more-window (#33885)luukvbaal1
Problem: Extui does not route messages emitted as a result of a typed command to the "more" window. Command message leading shell messages is missing a kind. Messages not routed to 'cmdheight' area after it was 0. Solution: Route messages that were emitted in the same event loop as an entered command to the "more" window. Also append multiple messages in an already open more-window. Assign it the `shell_cmd` kind. Change message position when 'cmdheight' changes from 0.
2025-05-07fix(extui): "box" window width calculated on last line (#33881)luukvbaal1
Problem: The "box" window width is calculated on the last line when applying "last" virt_text. There may be longer lines part of the same message. Solution: Don't decrease box width if the calculated width is smaller. Minor unrelated changes. Co-authored-by: Eike <eike.rackwitz@mail.de>
2025-05-04fix(extui): message may overwrite active cmdline #33846luukvbaal1
Problem: Active cmdline may be overwritten by a message. Solution: Check if cmdline is active before writing message.
2025-05-04fix(extui): hide inactive "more" window (#33831)luukvbaal1
Problem: More-window is left visible after leaving it. Cursor may be hidden behind it and it is hard to re-enter afterwards. Solution: Close the more-window when another window is entered.
2025-05-02fix(extui): cmdline visibility, cmdheight cursor position (#33774)luukvbaal1
Problem: The cmdline popupmenu is hidden behind extui windows. 'showmode' message is drawn over the cmdline. Changing the 'cmdheight' to accommodate space for the text in the cmdline may change the current cursor position. Solution: Ensure kZIndexMessages < zindex < kZIndexCmdlinePopupMenu. Clear the 'showmode' message when the cmdline level is negative. Temporarily set 'splitkeep' = "screen" when changing the 'cmdheight'.
2025-05-02feat(ui): ext_cmdline/messages for the TUI #27855luukvbaal1
Problem: We have an unmaintained Vimscript parser and cmdline highlighting mechanism, with which it is hard to leverage the treesitter highlighter. Long messages result in a hit-enter-prompt. Solution: Implement a vim.ui_attach() UI, that replaces the message grid (orphaning some 3000+ LOC core C code). Introduce an experimental vim._extui module, because removing the message grid at the same time is too risky. The new UI leverages the bundled treesitter highlighter and parser for Vimscript, as well as the matchparen plugin, to highlight the cmdline. Messages are truncated in the cmdline area, or placed in a floating message box in the bottom right corner. Special ("list_cmd") messages and the message history are shown in a, "more prompt" (now a fully interactive regular window). Various default UI elements ('showcmd', 'ruler') are also placed in the cmdline area, as virtual text. `require('vim._extui').enable({})` enables the experimental UI. `{ msg.pos = 'box' }` or `:set cmdheight=0` enables the message box variant. Followup: - Come to a consensus for how best to represent messages (by default). - Start removing message grid when this is deemed a successful replacement. When that is finished, make this new UI the default and update a lot of tests.