summaryrefslogtreecommitdiff
path: root/helix-term/src/ui
diff options
context:
space:
mode:
authorMichaƂ Zabielski2022-10-26 02:15:46 +0000
committerGitHub2022-10-26 02:15:46 +0000
commit65edf9c19880fe4fd068db6d86c4c2830c8a91f6 (patch)
tree65e8efa117784314f2dfe3ae5cd127efed7db2ce /helix-term/src/ui
parent9fae4b81189e9ba02718595a09840535f6fb558b (diff)
fix: repeating repeat operator (#4450)
Diffstat (limited to 'helix-term/src/ui')
-rw-r--r--helix-term/src/ui/editor.rs61
1 files changed, 32 insertions, 29 deletions
diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs
index b1bb02c7..72c9d15e 100644
--- a/helix-term/src/ui/editor.rs
+++ b/helix-term/src/ui/editor.rs
@@ -25,7 +25,7 @@ use helix_view::{
keyboard::{KeyCode, KeyModifiers},
Document, Editor, Theme, View,
};
-use std::{borrow::Cow, cmp::min, path::PathBuf};
+use std::{borrow::Cow, cmp::min, num::NonZeroUsize, path::PathBuf};
use tui::buffer::Buffer as Surface;
@@ -1009,37 +1009,40 @@ impl EditorView {
}
// special handling for repeat operator
(key!('.'), _) if self.keymaps.pending().is_empty() => {
- // first execute whatever put us into insert mode
- self.last_insert.0.execute(cxt);
- // then replay the inputs
- for key in self.last_insert.1.clone() {
- match key {
- InsertEvent::Key(key) => self.insert_mode(cxt, key),
- InsertEvent::CompletionApply(compl) => {
- let (view, doc) = current!(cxt.editor);
-
- doc.restore(view);
-
- let text = doc.text().slice(..);
- let cursor = doc.selection(view.id).primary().cursor(text);
-
- let shift_position =
- |pos: usize| -> usize { pos + cursor - compl.trigger_offset };
-
- let tx = Transaction::change(
- doc.text(),
- compl.changes.iter().cloned().map(|(start, end, t)| {
- (shift_position(start), shift_position(end), t)
- }),
- );
- apply_transaction(&tx, doc, view);
- }
- InsertEvent::TriggerCompletion => {
- let (_, doc) = current!(cxt.editor);
- doc.savepoint();
+ for _ in 0..cxt.editor.count.map_or(1, NonZeroUsize::into) {
+ // first execute whatever put us into insert mode
+ self.last_insert.0.execute(cxt);
+ // then replay the inputs
+ for key in self.last_insert.1.clone() {
+ match key {
+ InsertEvent::Key(key) => self.insert_mode(cxt, key),
+ InsertEvent::CompletionApply(compl) => {
+ let (view, doc) = current!(cxt.editor);
+
+ doc.restore(view);
+
+ let text = doc.text().slice(..);
+ let cursor = doc.selection(view.id).primary().cursor(text);
+
+ let shift_position =
+ |pos: usize| -> usize { pos + cursor - compl.trigger_offset };
+
+ let tx = Transaction::change(
+ doc.text(),
+ compl.changes.iter().cloned().map(|(start, end, t)| {
+ (shift_position(start), shift_position(end), t)
+ }),
+ );
+ apply_transaction(&tx, doc, view);
+ }
+ InsertEvent::TriggerCompletion => {
+ let (_, doc) = current!(cxt.editor);
+ doc.savepoint();
+ }
}
}
}
+ cxt.editor.count = None;
}
_ => {
// set the count