This fixes #6440. The previous approach was calling select-next-match in a loop, which leaves optimizations on the table when you already know that you want to select all of the matches. So what we did here is to optimize the code for the "give me all matches" case: 1. Find all results in the current buffer 2. Build up *all* selections 3. Sort selections & throw away overlapping ones (keep oldest) 4. Unfold if necessary 5. Render selections On my M3 Max searching for `<span` in the test file [1] from the ticket, it previously took: ~1.07s now takes: ~4ms [1]: https://github.com/standardebooks/edgar-allan-poe_poetry/blob/master/src/epub/text/poetry.xhtml Co-authored-by: Antonio <antonio@zed.dev>
214 lines
4.8 KiB
Rust
214 lines
4.8 KiB
Rust
//! This module contains all actions supported by [`Editor`].
|
|
use super::*;
|
|
|
|
#[derive(PartialEq, Clone, Deserialize, Default)]
|
|
pub struct SelectNext {
|
|
#[serde(default)]
|
|
pub replace_newest: bool,
|
|
}
|
|
|
|
#[derive(PartialEq, Clone, Deserialize, Default)]
|
|
pub struct SelectPrevious {
|
|
#[serde(default)]
|
|
pub replace_newest: bool,
|
|
}
|
|
|
|
#[derive(PartialEq, Clone, Deserialize, Default)]
|
|
pub struct SelectToBeginningOfLine {
|
|
#[serde(default)]
|
|
pub(super) stop_at_soft_wraps: bool,
|
|
}
|
|
|
|
#[derive(PartialEq, Clone, Deserialize, Default)]
|
|
pub struct MovePageUp {
|
|
#[serde(default)]
|
|
pub(super) center_cursor: bool,
|
|
}
|
|
|
|
#[derive(PartialEq, Clone, Deserialize, Default)]
|
|
pub struct MovePageDown {
|
|
#[serde(default)]
|
|
pub(super) center_cursor: bool,
|
|
}
|
|
|
|
#[derive(PartialEq, Clone, Deserialize, Default)]
|
|
pub struct SelectToEndOfLine {
|
|
#[serde(default)]
|
|
pub(super) stop_at_soft_wraps: bool,
|
|
}
|
|
|
|
#[derive(PartialEq, Clone, Deserialize, Default)]
|
|
pub struct ToggleCodeActions {
|
|
#[serde(default)]
|
|
pub deployed_from_indicator: bool,
|
|
}
|
|
|
|
#[derive(PartialEq, Clone, Deserialize, Default)]
|
|
pub struct ConfirmCompletion {
|
|
#[serde(default)]
|
|
pub item_ix: Option<usize>,
|
|
}
|
|
|
|
#[derive(PartialEq, Clone, Deserialize, Default)]
|
|
pub struct ConfirmCodeAction {
|
|
#[serde(default)]
|
|
pub item_ix: Option<usize>,
|
|
}
|
|
|
|
#[derive(PartialEq, Clone, Deserialize, Default)]
|
|
pub struct ToggleComments {
|
|
#[serde(default)]
|
|
pub advance_downwards: bool,
|
|
}
|
|
|
|
#[derive(PartialEq, Clone, Deserialize, Default)]
|
|
pub struct FoldAt {
|
|
pub buffer_row: u32,
|
|
}
|
|
|
|
#[derive(PartialEq, Clone, Deserialize, Default)]
|
|
pub struct UnfoldAt {
|
|
pub buffer_row: u32,
|
|
}
|
|
impl_actions!(
|
|
editor,
|
|
[
|
|
SelectNext,
|
|
SelectPrevious,
|
|
SelectToBeginningOfLine,
|
|
MovePageUp,
|
|
MovePageDown,
|
|
SelectToEndOfLine,
|
|
ToggleCodeActions,
|
|
ConfirmCompletion,
|
|
ConfirmCodeAction,
|
|
ToggleComments,
|
|
FoldAt,
|
|
UnfoldAt
|
|
]
|
|
);
|
|
|
|
gpui::actions!(
|
|
editor,
|
|
[
|
|
AddSelectionAbove,
|
|
AddSelectionBelow,
|
|
Backspace,
|
|
Cancel,
|
|
ConfirmRename,
|
|
ContextMenuFirst,
|
|
ContextMenuLast,
|
|
ContextMenuNext,
|
|
ContextMenuPrev,
|
|
ConvertToKebabCase,
|
|
ConvertToLowerCamelCase,
|
|
ConvertToLowerCase,
|
|
ConvertToSnakeCase,
|
|
ConvertToTitleCase,
|
|
ConvertToUpperCamelCase,
|
|
ConvertToUpperCase,
|
|
Copy,
|
|
CopyHighlightJson,
|
|
CopyPath,
|
|
CopyRelativePath,
|
|
Cut,
|
|
CutToEndOfLine,
|
|
Delete,
|
|
DeleteLine,
|
|
DeleteToBeginningOfLine,
|
|
DeleteToEndOfLine,
|
|
DeleteToNextSubwordEnd,
|
|
DeleteToNextWordEnd,
|
|
DeleteToPreviousSubwordStart,
|
|
DeleteToPreviousWordStart,
|
|
DisplayCursorNames,
|
|
DuplicateLine,
|
|
ExpandMacroRecursively,
|
|
FindAllReferences,
|
|
Fold,
|
|
FoldSelectedRanges,
|
|
Format,
|
|
GoToDefinition,
|
|
GoToDefinitionSplit,
|
|
GoToDiagnostic,
|
|
GoToHunk,
|
|
GoToPrevDiagnostic,
|
|
GoToPrevHunk,
|
|
GoToTypeDefinition,
|
|
GoToTypeDefinitionSplit,
|
|
HalfPageDown,
|
|
HalfPageUp,
|
|
Hover,
|
|
Indent,
|
|
JoinLines,
|
|
LineDown,
|
|
LineUp,
|
|
MoveDown,
|
|
MoveLeft,
|
|
MoveLineDown,
|
|
MoveLineUp,
|
|
MoveRight,
|
|
MoveToBeginning,
|
|
MoveToBeginningOfLine,
|
|
MoveToEnclosingBracket,
|
|
MoveToEnd,
|
|
MoveToEndOfLine,
|
|
MoveToEndOfParagraph,
|
|
MoveToNextSubwordEnd,
|
|
MoveToNextWordEnd,
|
|
MoveToPreviousSubwordStart,
|
|
MoveToPreviousWordStart,
|
|
MoveToStartOfParagraph,
|
|
MoveUp,
|
|
Newline,
|
|
NewlineAbove,
|
|
NewlineBelow,
|
|
NextScreen,
|
|
OpenExcerpts,
|
|
Outdent,
|
|
PageDown,
|
|
PageUp,
|
|
Paste,
|
|
Redo,
|
|
RedoSelection,
|
|
Rename,
|
|
RestartLanguageServer,
|
|
RevealInFinder,
|
|
ReverseLines,
|
|
ScrollCursorBottom,
|
|
ScrollCursorCenter,
|
|
ScrollCursorTop,
|
|
SelectAll,
|
|
SelectAllMatches,
|
|
SelectDown,
|
|
SelectLargerSyntaxNode,
|
|
SelectLeft,
|
|
SelectLine,
|
|
SelectRight,
|
|
SelectSmallerSyntaxNode,
|
|
SelectToBeginning,
|
|
SelectToEnd,
|
|
SelectToEndOfParagraph,
|
|
SelectToNextSubwordEnd,
|
|
SelectToNextWordEnd,
|
|
SelectToPreviousSubwordStart,
|
|
SelectToPreviousWordStart,
|
|
SelectToStartOfParagraph,
|
|
SelectUp,
|
|
ShowCharacterPalette,
|
|
ShowCompletions,
|
|
ShuffleLines,
|
|
SortLinesCaseInsensitive,
|
|
SortLinesCaseSensitive,
|
|
SplitSelectionIntoLines,
|
|
Tab,
|
|
TabPrev,
|
|
ToggleInlayHints,
|
|
ToggleSoftWrap,
|
|
Transpose,
|
|
Undo,
|
|
UndoSelection,
|
|
UnfoldLines,
|
|
]
|
|
);
|