fix: repeating repeat operator (#4450)
This commit is contained in:
parent
9fae4b8118
commit
65edf9c198
@ -25,7 +25,7 @@
|
||||
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 @@ fn command_mode(&mut self, mode: Mode, cxt: &mut commands::Context, event: KeyEv
|
||||
}
|
||||
// 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);
|
||||
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);
|
||||
doc.restore(view);
|
||||
|
||||
let text = doc.text().slice(..);
|
||||
let cursor = doc.selection(view.id).primary().cursor(text);
|
||||
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 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();
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user