mirror of https://github.com/helix-editor/helix
Merge 52696de6de
into fed3edcab7
commit
d291d2e9cb
|
@ -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""")
|
/// handle cases where open and close is the same, or in triples ("""docstring""")
|
||||||
fn handle_same(doc: &Rope, selection: &Selection, pair: &Pair) -> Transaction {
|
fn handle_same(doc: &Rope, selection: &Selection, pair: &Pair) -> Transaction {
|
||||||
let mut end_ranges = SmallVec::with_capacity(selection.len());
|
let mut end_ranges = SmallVec::with_capacity(selection.len());
|
||||||
|
|
||||||
let mut offs = 0;
|
let mut offs = 0;
|
||||||
|
|
||||||
let transaction = Transaction::change_by_selection(doc, selection, |start_range| {
|
let transaction = Transaction::change_by_selection(doc, selection, |start_range| {
|
||||||
let cursor = start_range.cursor(doc.slice(..));
|
let cursor = start_range.cursor(doc.slice(..));
|
||||||
let mut len_inserted = 0;
|
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 next_char = doc.get_char(cursor);
|
||||||
|
|
||||||
let change = if next_char == Some(pair.open) {
|
// (from, to, replacement)
|
||||||
// return transaction that moves past close
|
let change = if next_char == Some(pair.close) {
|
||||||
(cursor, cursor, None) // no-op
|
// 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 {
|
} else {
|
||||||
let mut pair_str = Tendril::new();
|
let mut pair_str = Tendril::new();
|
||||||
pair_str.push(pair.open);
|
pair_str.push(pair.open);
|
||||||
|
|
Loading…
Reference in New Issue