pub struct RopeBuffer { /* private fields */ }Expand description
The open note’s text, cursor, selection and history.
Implementations§
Source§impl RopeBuffer
impl RopeBuffer
pub fn new(text: Text) -> Self
pub fn text(&self) -> &Text
pub fn snapshot(&self) -> Snapshot
Sourcepub fn rows(&self) -> Vec<String>
pub fn rows(&self) -> Vec<String>
Every row, materialised.
Not a cache: nothing is maintained between calls, so the cost lands on the caller that wants a vector rather than on every edit. That is the whole difference from the shim this replaced.
Sourcepub fn joined_rows(&self, first: usize, last: usize) -> String
pub fn joined_rows(&self, first: usize, last: usize) -> String
Rows first..=last, joined with newlines.
pub fn cursor(&self) -> (usize, usize)
pub fn is_empty(&self) -> bool
pub fn selection_range(&self) -> Option<((usize, usize), (usize, usize))>
pub fn yank_text(&self) -> String
pub fn set_yank_text(&mut self, text: impl Into<String>)
pub fn search_pattern(&self) -> Option<&Regex>
pub fn take_outcome(&mut self) -> EditOutcome
Sourcepub fn edit<R>(&mut self, f: impl FnOnce(&mut Self) -> R) -> R
pub fn edit<R>(&mut self, f: impl FnOnce(&mut Self) -> R) -> R
Run f as one undo group.
Every mutation inside lands in a single history entry, however many primitives it takes. Nested calls belong to the outermost group, so a compound action built from the single-mutation helpers is still one undo.
Sourcepub fn continue_group(&mut self)
pub fn continue_group(&mut self)
The next mutation joins the previous group instead of starting one.
The policy is the backend’s, because only it knows what the user was doing
— mid-word against after a pause, inside an Insert session against having
left it. This is the mechanism; typing_run and the vim engine are the two
callers that hold an opinion.
pub fn insert_str(&mut self, s: impl AsRef<str>) -> bool
pub fn insert_char(&mut self, c: char)
pub fn insert_newline(&mut self)
Sourcepub fn delete_str(&mut self, clusters: usize) -> bool
pub fn delete_str(&mut self, clusters: usize) -> bool
Delete clusters grapheme clusters forward, a line break counting as one.
Clusters and not scalars, because a delete may not leave half a character
behind: forward_by steps whole clusters, so a caller counting scalars
over a flag or a ZWJ emoji spends the difference on the text after it.
Sourcepub fn delete_char(&mut self) -> bool
pub fn delete_char(&mut self) -> bool
Backspace.
Sourcepub fn delete_next_char(&mut self) -> bool
pub fn delete_next_char(&mut self) -> bool
Forward delete.
pub fn delete_word(&mut self) -> bool
pub fn delete_next_word(&mut self) -> bool
pub fn cut(&mut self) -> bool
Sourcepub fn copy(&mut self)
pub fn copy(&mut self)
Copying reads: it leaves the selection where it is, and an empty one leaves the register alone rather than emptying it.
pub fn paste(&mut self) -> bool
pub fn undo(&mut self) -> bool
pub fn redo(&mut self) -> bool
Sourcepub fn cluster_at(&self, row: usize, col: usize) -> (usize, usize)
pub fn cluster_at(&self, row: usize, col: usize) -> (usize, usize)
The character at column col of row, as its start and end columns.
One character on screen can be several chars in the buffer — ❤️ is
two, a decomposed é is e plus U+0301 — so “the char under the
cursor” is a grapheme cluster, and only its edges are positions the
buffer accepts. A column inside a cluster belongs to that cluster; one at
or past the row’s end gives the row’s end twice.
The edges are the text’s own (motion::next_cluster), so this can
never call a column an edge that the buffer would then refuse.
Sourcepub fn clusters_through(&self, row: usize, from: usize, to: usize) -> usize
pub fn clusters_through(&self, row: usize, from: usize, to: usize) -> usize
How many characters (grapheme clusters) columns from..=to of row
span. At least one.
One segmentation pass over the row — the same Unicode rule the text
applies, over the same row, so the two agree on every edge inside it.
Stepping motion::next_cluster per character instead is correct but
re-checks context at every step, which on a paragraph-long row is a
visible stall.
Sourcepub fn col_after_clusters(&self, row: usize, col: usize, n: usize) -> usize
pub fn col_after_clusters(&self, row: usize, col: usize, n: usize) -> usize
The column n characters right of the character at col on row,
stopping at the row’s last character. One pass, as
Self::clusters_through.
Sourcepub fn set_mark(&mut self, name: char, (row, col): (usize, usize)) -> bool
pub fn set_mark(&mut self, name: char, (row, col): (usize, usize)) -> bool
Put mark name at (row, col). false, setting nothing, when the
buffer has no such position.
From here on the mark follows the text it points at: rows added or removed above it carry it along, text typed before it on its row pushes it right, and deleting the text under it collapses it to where the deletion began. Undo and redo put it back where it was before and after each change. The edit buffer owns the marks, beside the cursor and the history that saves them.
Sourcepub fn mark(&self, name: char) -> Option<(usize, usize)>
pub fn mark(&self, name: char) -> Option<(usize, usize)>
Where mark name points now, if it is set.
Sourcepub fn move_cursor(&mut self, movement: CursorMove)
pub fn move_cursor(&mut self, movement: CursorMove)
Move the cursor, extending a live selection.
Directional movement keeps the anchor deliberately: that is how vim’s Visual mode extends.
Sourcepub fn jump_to(&mut self, row: usize, col: usize) -> bool
pub fn jump_to(&mut self, row: usize, col: usize) -> bool
Move the cursor to (row, col), refusing a position the buffer cannot
address rather than landing somewhere else.
Sourcepub fn move_to(&mut self, to: Position)
pub fn move_to(&mut self, to: Position)
Move to a position the caller worked out itself — a visual-line motion, which needs a layout the buffer does not have.
pub fn start_selection(&mut self)
pub fn cancel_selection(&mut self)
pub fn select_all(&mut self)
pub fn set_selection( &mut self, start: (usize, usize), end: (usize, usize), ) -> bool
Sourcepub fn text_between(
&self,
start: (usize, usize),
end: (usize, usize),
) -> Option<String>
pub fn text_between( &self, start: (usize, usize), end: (usize, usize), ) -> Option<String>
The text between two (row, col) pairs, in either order; None when the
range is empty or names a position the buffer cannot address.
Sourcepub fn selection_text(&self) -> Option<String>
pub fn selection_text(&self) -> Option<String>
The selected text, or None when nothing — or nothing of width — is
selected.
Sourcepub fn indent_rows(&mut self, rows: RangeInclusive<usize>, dedent: bool) -> bool
pub fn indent_rows(&mut self, rows: RangeInclusive<usize>, dedent: bool) -> bool
Indent or dedent rows by one indent step, as one undo group —
and one transaction.
Indenting puts indent_width spaces at the start of every row — always
spaces, never a tab. Dedenting takes up to one step of leading spaces,
or the run up to and including a first tab, which counts as a whole
step: " \tfoo" loses both spaces and the tab and stops there.
The cursor keeps the character it sat on — its column moves by its own
row’s change, so >> on the n of one leaves it on n, neovim’s
rule — and a selection is put back the same way, endpoint by endpoint.
Both fall out of the engine’s own mapping across the transaction, so the
history entry holds the cursor’s real before and after, and an undo or
redo lands where the user was. Rows past the end are ignored. Reports
whether any text changed; a dedent that finds nothing to remove changes
nothing and says so.
pub fn set_search_pattern(&mut self, pattern: &str) -> Result<(), Error>
Sourcepub fn search_forward(&mut self, match_cursor: bool) -> bool
pub fn search_forward(&mut self, match_cursor: bool) -> bool
Move the cursor to the next match. Never extends a selection.
Sourcepub fn search_back(&mut self, match_cursor: bool) -> bool
pub fn search_back(&mut self, match_cursor: bool) -> bool
Move the cursor to the previous match. Never extends a selection.
Sourcepub fn search_repeat(&mut self, backward: bool) -> bool
pub fn search_repeat(&mut self, backward: bool) -> bool
Repeat the persisted pattern (vim n / N).
Trait Implementations§
Source§impl Debug for RopeBuffer
impl Debug for RopeBuffer
Auto Trait Implementations§
impl Freeze for RopeBuffer
impl RefUnwindSafe for RopeBuffer
impl Send for RopeBuffer
impl Sync for RopeBuffer
impl Unpin for RopeBuffer
impl UnsafeUnpin for RopeBuffer
impl UnwindSafe for RopeBuffer
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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