aboutsummaryrefslogtreecommitdiff
path: root/helix-term
diff options
context:
space:
mode:
authorBruce Hopkins2022-11-11 18:50:25 +0000
committerGitHub2022-11-11 18:50:25 +0000
commitbc0a3037eacf172e5919ac8cae5f068c868c3fa3 (patch)
tree74979d5907d90e3f19aa9f28292dc03ef61d2817 /helix-term
parent5b73c8c7248254c905be86e625b25cb5a1d743d0 (diff)
feat(commands): increment by range (#4418)
Diffstat (limited to 'helix-term')
-rw-r--r--helix-term/src/commands.rs23
1 files changed, 20 insertions, 3 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 7e4969c1..71356d08 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -4863,14 +4863,18 @@ fn add_newline_impl(cx: &mut Context, open: Open) {
apply_transaction(&transaction, doc, view);
}
+enum IncrementDirection {
+ Increase,
+ Decrease,
+}
/// Increment object under cursor by count.
fn increment(cx: &mut Context) {
- increment_impl(cx, cx.count() as i64);
+ increment_impl(cx, IncrementDirection::Increase);
}
/// Decrement object under cursor by count.
fn decrement(cx: &mut Context) {
- increment_impl(cx, -(cx.count() as i64));
+ increment_impl(cx, IncrementDirection::Decrease);
}
/// This function differs from find_next_char_impl in that it stops searching at the newline, but also
@@ -4894,7 +4898,7 @@ fn find_next_char_until_newline<M: CharMatcher>(
}
/// Decrement object under cursor by `amount`.
-fn increment_impl(cx: &mut Context, amount: i64) {
+fn increment_impl(cx: &mut Context, increment_direction: IncrementDirection) {
// TODO: when incrementing or decrementing a number that gets a new digit or lose one, the
// selection is updated improperly.
find_char_impl(
@@ -4906,6 +4910,17 @@ fn increment_impl(cx: &mut Context, amount: i64) {
1,
);
+ // Increase by 1 if `IncrementDirection` is `Increase`
+ // Decrease by 1 if `IncrementDirection` is `Decrease`
+ let sign = match increment_direction {
+ IncrementDirection::Increase => 1,
+ IncrementDirection::Decrease => -1,
+ };
+ let mut amount = sign * cx.count() as i64;
+
+ // If the register is `#` then increase or decrease the `amount` by 1 per element
+ let increase_by = if cx.register == Some('#') { sign } else { 0 };
+
let (view, doc) = current!(cx.editor);
let selection = doc.selection(view.id);
let text = doc.text().slice(..);
@@ -4925,6 +4940,8 @@ fn increment_impl(cx: &mut Context, amount: i64) {
let (range, new_text) = incrementor.increment(amount);
+ amount += increase_by;
+
Some((range.from(), range.to(), Some(new_text)))
})
.collect();