pub struct Buffer {
pub text: String,
pub cursor: usize,
/* private fields */
}Expand description
Line-edit buffer for input composition. Byte-indexed cursor.
Large pasted blocks are folded into [Pasted #N +M lines] placeholders
stored in text; the original contents live in pastes and are
spliced back in when the line is submitted. This keeps the visible
input short (matching CC’s paste UX) without truncating what the
agent actually sees.
Fields§
§text: String§cursor: usizeImplementations§
Source§impl Buffer
impl Buffer
Sourcepub fn is_in_history(&self) -> bool
pub fn is_in_history(&self) -> bool
True while the user is scrolling input history (Up/Down on an
empty / non-empty buffer). The slash-command menu suppresses
itself in this state so that recalling a previous /session foo
from history doesn’t immediately re-pop the menu and trap Up
inside it. Cleared automatically by Insert / Cancel (typing
or Esc) and by HistoryNext returning past the newest entry
to the user’s stashed draft.
Sourcepub fn history_idx(&self) -> Option<usize>
pub fn history_idx(&self) -> Option<usize>
The index into history of the entry currently being displayed,
or None if the buffer is showing the user’s own draft. Used
by event_loop to look up HistoryEntry::images after every
apply() so pending_recalled_attachments mirrors what the
buffer is showing.
Sourcepub fn insert_paste(&mut self, text: String) -> String
pub fn insert_paste(&mut self, text: String) -> String
Insert a pasted block. Folds into a [Pasted …] placeholder if
the block exceeds the fold threshold, keeping the visible input
terse. Returns the placeholder that was inserted (or the raw
text for small pastes) so callers can advance the cursor.
Single-line long pastes (e.g. a 600-char URL) use a {N} chars
summary — +1 lines would be misleading. Multi-line pastes use
+{M} lines which is what people expect for code blocks / diffs.
Line-ending normalisation: most terminals in bracketed paste
mode emit \r (or \r\n) between lines rather than \n. Without
normalising, a 20-line paste looks like one gigantic line to
str::lines() (returning count 1), and downstream agents may
mis-handle payloads that mix CR-only separators. We fold \r\n
and lone \r to \n at ingress so both the placeholder summary
and the expanded agent payload are in canonical form.
Sourcepub fn cursor_line_up(&mut self) -> bool
pub fn cursor_line_up(&mut self) -> bool
Try to move the cursor up one logical line, preserving the
column (measured in display cells so CJK lines up). Returns
false only when the cursor is already at byte 0 — caller
can then fall through to history navigation. Designed for the
Up keystroke in multi-line composition: pressing Up walks
the cursor through the buffer’s lines first, then snaps to
the start of the first line, and only the next Up after that
surfaces history. Costs one extra keystroke before history
kicks in but rescues anyone who paged Up to fix a typo on
line 1 from losing their draft.
Sourcepub fn cursor_line_down(&mut self) -> bool
pub fn cursor_line_down(&mut self) -> bool
Mirror of [cursor_line_up] for Down. Returns false only
when the cursor is already at text.len() — caller then
falls through to HistoryNext. On the last logical line, Down
first snaps to end-of-buffer; the keystroke after that hands
off to history.
Auto Trait Implementations§
impl Freeze for Buffer
impl RefUnwindSafe for Buffer
impl Send for Buffer
impl Sync for Buffer
impl Unpin for Buffer
impl UnsafeUnpin for Buffer
impl UnwindSafe for Buffer
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> 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 more