pub enum Event {
Show 37 variants
Insert {
position: usize,
text: String,
cursor_id: CursorId,
},
Delete {
range: Range<usize>,
deleted_text: String,
cursor_id: CursorId,
},
MoveCursor {
cursor_id: CursorId,
old_position: usize,
new_position: usize,
old_anchor: Option<usize>,
new_anchor: Option<usize>,
old_sticky_column: usize,
new_sticky_column: usize,
},
AddCursor {
cursor_id: CursorId,
position: usize,
anchor: Option<usize>,
},
RemoveCursor {
cursor_id: CursorId,
position: usize,
anchor: Option<usize>,
},
Scroll {
line_offset: isize,
},
SetViewport {
top_line: usize,
},
Recenter,
SetAnchor {
cursor_id: CursorId,
position: usize,
},
ClearAnchor {
cursor_id: CursorId,
},
ChangeMode {
mode: String,
},
AddOverlay {
namespace: Option<OverlayNamespace>,
range: Range<usize>,
face: OverlayFace,
priority: i32,
message: Option<String>,
extend_to_line_end: bool,
url: Option<String>,
},
RemoveOverlay {
handle: OverlayHandle,
},
RemoveOverlaysInRange {
range: Range<usize>,
},
ClearNamespace {
namespace: OverlayNamespace,
},
ClearOverlays,
ShowPopup {
popup: PopupData,
},
HidePopup,
ClearPopups,
PopupSelectNext,
PopupSelectPrev,
PopupPageDown,
PopupPageUp,
AddMarginAnnotation {
line: usize,
position: MarginPositionData,
content: MarginContentData,
annotation_id: Option<String>,
},
RemoveMarginAnnotation {
annotation_id: String,
},
RemoveMarginAnnotationsAtLine {
line: usize,
position: MarginPositionData,
},
ClearMarginPosition {
position: MarginPositionData,
},
ClearMargins,
SetLineNumbers {
enabled: bool,
},
SplitPane {
direction: SplitDirection,
new_buffer_id: BufferId,
ratio: f32,
},
CloseSplit {
split_id: SplitId,
},
SetActiveSplit {
split_id: SplitId,
},
AdjustSplitRatio {
split_id: SplitId,
delta: f32,
},
NextSplit,
PrevSplit,
Batch {
events: Vec<Event>,
description: String,
},
BulkEdit {
old_snapshot: Option<Arc<BufferSnapshot>>,
new_snapshot: Option<Arc<BufferSnapshot>>,
old_cursors: Vec<(CursorId, usize, Option<usize>)>,
new_cursors: Vec<(CursorId, usize, Option<usize>)>,
description: String,
edits: Vec<(usize, usize, usize)>,
displaced_markers: Vec<(u64, usize)>,
},
}Expand description
Core event types representing all possible state changes
Variants§
Insert
Insert text at a position
Delete
Delete a range of text
MoveCursor
Move a cursor to a new position
Fields
AddCursor
Add a new cursor
RemoveCursor
Remove a cursor (stores cursor state for undo)
Scroll
Scroll the viewport
SetViewport
Set viewport to specific position
Recenter
Center the viewport on the cursor
SetAnchor
Set the anchor (selection start) for a cursor
ClearAnchor
Clear the anchor and reset deselect_on_move for a cursor Used to cancel Emacs mark mode
ChangeMode
Change mode (if implementing modal editing)
AddOverlay
Add an overlay (for decorations like underlines, highlights)
RemoveOverlay
Remove overlay by handle
Fields
handle: OverlayHandleRemoveOverlaysInRange
Remove all overlays in a range
ClearNamespace
Clear all overlays in a namespace
Fields
namespace: OverlayNamespaceClearOverlays
Clear all overlays
ShowPopup
Show a popup
HidePopup
Hide the topmost popup
ClearPopups
Clear all popups
PopupSelectNext
Navigate popup selection (for list popups)
PopupSelectPrev
PopupPageDown
PopupPageUp
AddMarginAnnotation
Margin events Add a margin annotation
RemoveMarginAnnotation
Remove margin annotation by ID
RemoveMarginAnnotationsAtLine
Remove all margin annotations at a specific line
ClearMarginPosition
Clear all margin annotations in a position
Fields
position: MarginPositionDataClearMargins
Clear all margin annotations
SetLineNumbers
Enable/disable line numbers
SplitPane
Split view events Split the active pane
CloseSplit
Close a split pane
SetActiveSplit
Set the active split pane
AdjustSplitRatio
Adjust the split ratio
NextSplit
Navigate to next split
PrevSplit
Navigate to previous split
Batch
Batch of events that should be undone/redone atomically Used for multi-cursor operations where all cursors perform the same action
BulkEdit
Efficient bulk edit that stores tree snapshots for O(1) undo/redo Used for multi-cursor operations, toggle comment, indent/dedent, etc. This avoids O(n²) complexity by applying all edits in a single tree pass.
Key insight: PieceTree uses Arc
Fields
old_snapshot: Option<Arc<BufferSnapshot>>Buffer state before the edit (for undo)
new_snapshot: Option<Arc<BufferSnapshot>>Buffer state after the edit (for redo)
edits: Vec<(usize, usize, usize)>Edit operations as (position, delete_len, insert_len), sorted descending by position. Used to replay marker adjustments on undo/redo:
- On redo: replayed as-is (same adjustments as the forward path)
- On undo: inverse() swaps del_len/ins_len (reverse adjustments)
displaced_markers: Vec<(u64, usize)>Marker positions displaced by deletions: (marker_id_raw, original_byte_position). On undo, after marker adjustments, these markers are restored to their original positions. This fixes the limitation where markers inside a deleted range collapse and can’t be precisely restored by undo.
Implementations§
Source§impl Event
impl Event
Sourcepub fn inverse(&self) -> Option<Self>
pub fn inverse(&self) -> Option<Self>
Returns the inverse event for undo functionality Uses UNDO_SENTINEL cursor_id to avoid moving the cursor during undo
Sourcepub fn modifies_buffer(&self) -> bool
pub fn modifies_buffer(&self) -> bool
Returns true if this event modifies the buffer content
Sourcepub fn is_write_action(&self) -> bool
pub fn is_write_action(&self) -> bool
Returns true if this event is a write action (modifies state in a way that should be undoable) Returns false for readonly actions like cursor movement, scrolling, viewport changes, etc.
Write actions include:
- Buffer modifications (Insert, Delete)
- Cursor structure changes (AddCursor, RemoveCursor)
- Batches containing write actions
Readonly actions include:
- Cursor movement (MoveCursor)
- Scrolling and viewport changes (Scroll, SetViewport)
- UI events (overlays, popups, margins, mode changes, etc.)
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Event
impl<'de> Deserialize<'de> for Event
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl EventHooks for Event
impl EventHooks for Event
Auto Trait Implementations§
impl Freeze for Event
impl RefUnwindSafe for Event
impl Send for Event
impl Sync for Event
impl Unpin for Event
impl UnsafeUnpin for Event
impl UnwindSafe for Event
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more