Skip to content

Commit

Permalink
fix: repeating repeat operator (helix-editor#4450)
Browse files Browse the repository at this point in the history
  • Loading branch information
kosciej authored and Frederik Vestre committed Feb 6, 2023
1 parent 93d5773 commit beb536d
Showing 1 changed file with 32 additions and 29 deletions.
61 changes: 32 additions & 29 deletions helix-term/src/ui/editor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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
Expand Down

0 comments on commit beb536d

Please sign in to comment.