diff options
author | Bruce Hopkins | 2022-11-11 18:50:25 +0000 |
---|---|---|
committer | GitHub | 2022-11-11 18:50:25 +0000 |
commit | bc0a3037eacf172e5919ac8cae5f068c868c3fa3 (patch) | |
tree | 74979d5907d90e3f19aa9f28292dc03ef61d2817 | |
parent | 5b73c8c7248254c905be86e625b25cb5a1d743d0 (diff) |
feat(commands): increment by range (#4418)
-rw-r--r-- | helix-term/src/commands.rs | 23 |
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(); |