pull/13699/merge
Yuki Kobayashi 2025-06-16 12:49:31 -07:00 committed by GitHub
commit d291d2e9cb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 24 additions and 4 deletions

View File

@ -335,17 +335,37 @@ fn handle_close(doc: &Rope, selection: &Selection, pair: &Pair) -> Transaction {
/// handle cases where open and close is the same, or in triples ("""docstring""")
fn handle_same(doc: &Rope, selection: &Selection, pair: &Pair) -> Transaction {
let mut end_ranges = SmallVec::with_capacity(selection.len());
let mut offs = 0;
let transaction = Transaction::change_by_selection(doc, selection, |start_range| {
let cursor = start_range.cursor(doc.slice(..));
let mut len_inserted = 0;
let has_at_least_two_before = cursor >= 2
&& doc.get_char(cursor - 1) == Some(pair.open)
&& doc.get_char(cursor - 2) == Some(pair.open);
let has_at_least_three_before =
has_at_least_two_before && cursor >= 3 && doc.get_char(cursor - 3) == Some(pair.open);
let next_char = doc.get_char(cursor);
let change = if next_char == Some(pair.open) {
// return transaction that moves past close
(cursor, cursor, None) // no-op
// (from, to, replacement)
let change = if next_char == Some(pair.close) {
// moves past close
(cursor, cursor, None) // no-op - don't insert char
} else if has_at_least_three_before {
// don't auto pair more than triple quotes
(cursor, cursor, Some(Tendril::from_iter([pair.close]))) // only insert one char (normal operation)
} else if has_at_least_two_before {
// exactly two before: auto-pair 3 quotes
// `''|` -> `'''|'''`
(
cursor,
cursor,
Some(Tendril::from_iter([
// first is the default keystroke, the rest 3 are auto-pair
pair.close, pair.close, pair.close, pair.close,
])),
)
} else {
let mut pair_str = Tendril::new();
pair_str.push(pair.open);