@@ -2632,6 +2632,18 @@ pub mod insert {
2632 pub type Hook = fn(&Rope, &Selection, char) -> Option<Transaction>;
2632 pub type Hook = fn(&Rope, &Selection, char) -> Option<Transaction>;
2633 pub type PostHook = fn(&mut Context, char);
2633 pub type PostHook = fn(&mut Context, char);
2635+ /// Exclude the cursor in range.
2636+ fn exclude_cursor(text: RopeSlice, range: Range, cursor: Range) -> Range {
2637+ if range.to() == cursor.to() {
2640+ graphemes::prev_grapheme_boundary(text, cursor.to()),
2635 // It trigger completion when idle timer reaches deadline
2647 // It trigger completion when idle timer reaches deadline
2636 // Only trigger completion if the word under cursor is longer than n characters
2648 // Only trigger completion if the word under cursor is longer than n characters
2637 pub fn idle_completion(cx: &mut Context) {
2649 pub fn idle_completion(cx: &mut Context) {
@@ -2948,10 +2960,11 @@ pub mod insert {
2948 let (view, doc) = current!(cx.editor);
2960 let (view, doc) = current!(cx.editor);
2949 let text = doc.text().slice(..);
2961 let text = doc.text().slice(..);
2951− let selection = doc
2963+ let selection = doc.selection(view.id).clone().transform(|range| {
2952− .selection(view.id)
2964+ let cursor = Range::point(range.cursor(text));
2954− .transform(|range| movement::move_prev_word_start(text, range, count));
2965+ let next = movement::move_prev_word_start(text, cursor, count);
2966+ exclude_cursor(text, next, range)
2955 delete_selection_insert_mode(doc, view, &selection);
2968 delete_selection_insert_mode(doc, view, &selection);