Add source caret and block indentation keyboard editing

This commit is contained in:
2026-09-22 11:50:45 -07:00
parent 136ed6e586
commit 3733a657bb
9 changed files with 435 additions and 6 deletions
@@ -1,10 +1,12 @@
//! Effective selected-byte ranges for a committed departure from a source view.
//! Effective selected-byte ranges for committed source departures and edits.
//!
//! Iced's `Cursor` omits cosmic-text's Word/Line selection kind. Saving its raw
//! endpoints can therefore save an empty range for a visibly selected word/line.
//! Capture only after navigation admission and destination validation succeed,
//! immediately before replacing/leaving the live editor. Never use this to inspect
//! pending queries, failed/no-op navigation, or restore focus to the same editor.
//! Departure capture requires navigation admission and destination validation,
//! immediately before replacing/leaving the live editor. Edit capture requires
//! an admitted edit with a nonempty patch plan. Neither is a passive query:
//! never use these to inspect pending queries, failed/no-op navigation, or restore
//! focus to the same editor.
use iced::advanced::{graphics, text};
use iced::widget::text_editor::{Action, Content, Cursor, Motion, Position};
@@ -21,6 +23,23 @@ use iced::widget::text_editor::{Action, Content, Cursor, Motion, Position};
/// selection joins editor lines with LF regardless of physical CRLF/LF endings.
/// Only the selected text is temporarily copied; retained state is one Cursor.
pub fn capture<R>(content: &mut Content<R>) -> Cursor
where
R: text::Renderer<Editor = graphics::text::Editor>,
{
effective_range(content)
}
/// Capture immediately before a committed indentation edit. Like departure,
/// this converts Word/Line selections to their effective directional byte range.
/// The caller restores the transformed range after editing the same Content.
pub fn capture_for_edit<R>(content: &mut Content<R>) -> Cursor
where
R: text::Renderer<Editor = graphics::text::Editor>,
{
effective_range(content)
}
fn effective_range<R>(content: &mut Content<R>) -> Cursor
where
R: text::Renderer<Editor = graphics::text::Editor>,
{