IdeaVim took Shift+Enter in the AIR prompt, so AIR's new line action never
ran and Insert mode couldn't break a line. Instead of special-casing single
keys, hand any key bound to an `Air.Chat.Prompt.*` action in the active
keymap to AIR, which also covers Enter, Ctrl+Enter and user rebindings.
Rider gets the state of a backend action (e.g. MoveElementRight or ReformatCode for C#) from the backend only for a real hotkey: when the last shortcut seen by the key dispatcher belongs to the action, it wraps the action into a composite that asks the backend. The synchronous tryToExecute goes through the same hotkey update but never gets there. After `:action` the last shortcut is Enter, so the action isn't wrapped, and after an `<Action>` mapping it is wrapped, but tryToExecuteNow updates the original action instead of the wrapped one. Either way only the frontend answers, it reports the action as disabled, and tryToExecute rejects it. The asynchronous tryToExecute updates the action the way a menu does, with an asynchronous request to the backend, so it gets the real state without blocking the EDT. The action then runs later, so executeAction can't tell whether it succeeded, but the backend's changes arrive later anyway.
The new Rider tests also cover the action cases fixed earlier (VIM-3376, VIM-3826, VIM-3861, VIM-3881) that had no Rider test. ReformatCode from a mapping no longer freezes Rider, so its disabled test is replaced by RiderReformatCodeTest, which runs in its own Rider in case it does again.
For a hotkey, Rider replaces its backend actions with a single RiderBackendCompositeAction, so IdeaVim's action listener sees the composite and not e.g. CommentByLineComment. The composite doesn't implement PossiblyDelegatingToBackendAction, so IdeaVim normalized the caret right away, before the backend applied the comment. The frontend took that caret move for a user change made while the request was pending and replayed it on top of the backend's changes, which put the caret back on the line just commented. The unit test didn't catch it because it simulates an action with the interface. The composite is internal to Rider and not available at compile time, so it's recognized by its class name, the same way the interface is.
Add changelog entries for the surround tag prompt (VIM-2796), incsearch in non-search prompts (VIM-4346) and k scrolling with sticky lines (VIM-4329), and create whatsnew-tbr.html from the release section.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sticky lines panel's height depends on the scroll position, so an exact middle doesn't always exist, and the old tolerance range let the previous position count as centred after every other k; instead, try the middle for each panel height we find and keep the closest position, staying put on a tie unless the caret moved to another line, so moves always scroll but typing never scrolls back and forth.
ShiftLeftVisualAction had no coverage for the blockwise branch of
indentRange, while ShiftRight already tests it. Cover a block starting
at column 0 with a whitespace-only line shorter than the indent, and a
block starting mid-line where some lines are shorter than the block
column and must be left untouched.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>