aboutsummaryrefslogtreecommitdiff
path: root/helix-core/src
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-05-15 01:26:41 +0000
committerBlaž Hrastnik2021-05-15 01:50:36 +0000
commit0e5b42164628e5d25044cb5fd9592f7222701d6f (patch)
tree8cb1b7600d14dd28a4b13dfe9d74f594006d9cef /helix-core/src
parent4a9d1163e04ba0fc29f8532afd35381b7df55e48 (diff)
When calculating a new selection, we need to take newly inserted text into account.
Diffstat (limited to 'helix-core/src')
-rw-r--r--helix-core/src/auto_pairs.rs24
1 files changed, 20 insertions, 4 deletions
diff --git a/helix-core/src/auto_pairs.rs b/helix-core/src/auto_pairs.rs
index ffd16daf..a04b0d3e 100644
--- a/helix-core/src/auto_pairs.rs
+++ b/helix-core/src/auto_pairs.rs
@@ -65,14 +65,20 @@ fn handle_open(
) -> Transaction {
let mut ranges = SmallVec::with_capacity(selection.len());
+ let mut offs = 0;
+
let mut transaction = Transaction::change_by_selection(doc, selection, |range| {
let pos = range.head;
let next = next_char(doc, pos);
- let head = pos + open.len_utf8();
+ let head = pos + offs + open.len_utf8();
// if selection, retain anchor, if cursor, move over
ranges.push(Range::new(
- if range.is_empty() { head } else { range.anchor },
+ if range.is_empty() {
+ head
+ } else {
+ range.anchor + offs
+ },
head,
));
@@ -88,6 +94,8 @@ fn handle_open(
pair.push_char(open);
pair.push_char(close);
+ offs += 2;
+
(pos, pos, Some(pair))
}
}
@@ -99,14 +107,20 @@ fn handle_open(
fn handle_close(doc: &Rope, selection: &Selection, _open: char, close: char) -> Transaction {
let mut ranges = SmallVec::with_capacity(selection.len());
+ let mut offs = 0;
+
let mut transaction = Transaction::change_by_selection(doc, selection, |range| {
let pos = range.head;
let next = next_char(doc, pos);
- let head = pos + close.len_utf8();
+ let head = pos + offs + close.len_utf8();
// if selection, retain anchor, if cursor, move over
ranges.push(Range::new(
- if range.is_empty() { head } else { range.anchor },
+ if range.is_empty() {
+ head
+ } else {
+ range.anchor + offs
+ },
head,
));
@@ -114,6 +128,8 @@ fn handle_close(doc: &Rope, selection: &Selection, _open: char, close: char) ->
// return transaction that moves past close
(pos, pos, None) // no-op
} else {
+ offs += close.len_utf8();
+
// TODO: else return (use default handler that inserts close)
(pos, pos, Some(Tendril::from_char(close)))
}