@@ -187,6 +187,7 @@ impl Command {
187187 copy_selection_on_prev_line, "Copy selection on previous line",
188188 move_next_word_start, "Move to beginning of next word",
189189 move_prev_word_start, "Move to beginning of previous word",
190+ move_prev_word_end, "Move to end of previous word",
190191 move_next_word_end, "Move to end of next word",
191192 move_next_long_word_start, "Move to beginning of next long word",
192193 move_prev_long_word_start, "Move to beginning of previous long word",
@@ -284,6 +285,9 @@ impl Command {
284285 delete_char_backward, "Delete previous char",
285286 delete_char_forward, "Delete next char",
286287 delete_word_backward, "Delete previous word",
288+ delete_word_forward, "Delete next word",
289+ kill_to_line_start, "Delete content till the start of the line",
290+ kill_to_line_end, "Delete content till the end of the line",
287291 undo, "Undo change",
288292 redo, "Redo change",
289293 earlier, "Move backward in history",
@@ -330,6 +334,7 @@ impl Command {
330334 wclose, "Close window",
331335 wonly, "Current window only",
332336 select_register, "Select register",
337+ insert_register, "Insert register",
333338 align_view_middle, "Align view middle",
334339 align_view_top, "Align view top",
335340 align_view_center, "Align view center",
@@ -572,6 +577,29 @@ fn extend_to_line_start(cx: &mut Context) {
572577 goto_line_start_impl(view, doc, Movement::Extend)
573578}
574579
580+fn kill_to_line_start(cx: &mut Context) {
581+ let (view, doc) = current!(cx.editor);
582+ let text = doc.text().slice(..);
583+
584+ let selection = doc.selection(view.id).clone().transform(|range| {
585+ let line = range.cursor_line(text);
586+ range.put_cursor(text, text.line_to_char(line), true)
587+ });
588+ delete_selection_insert_mode(doc, view, &selection);
589+}
590+
591+fn kill_to_line_end(cx: &mut Context) {
592+ let (view, doc) = current!(cx.editor);
593+ let text = doc.text().slice(..);
594+
595+ let selection = doc.selection(view.id).clone().transform(|range| {
596+ let line = range.cursor_line(text);
597+ let pos = line_end_char_index(&text, line);
598+ range.put_cursor(text, pos, true)
599+ });
600+ delete_selection_insert_mode(doc, view, &selection);
601+}
602+
575603fn goto_first_nonwhitespace(cx: &mut Context) {
576604 let (view, doc) = current!(cx.editor);
577605 let text = doc.text().slice(..);
@@ -684,6 +712,10 @@ fn move_prev_word_start(cx: &mut Context) {
684712 move_word_impl(cx, movement::move_prev_word_start)
685713}
686714
715+fn move_prev_word_end(cx: &mut Context) {
716+ move_word_impl(cx, movement::move_prev_word_end)
717+}
718+
687719fn move_next_word_end(cx: &mut Context) {
688720 move_word_impl(cx, movement::move_next_word_end)
689721}
@@ -1586,6 +1618,17 @@ fn delete_selection_impl(reg: &mut Register, doc: &mut Document, view_id: ViewId
15861618 doc.apply(&transaction, view_id);
15871619}
15881620
1621+#[inline]
1622+fn delete_selection_insert_mode(doc: &mut Document, view: &View, selection: &Selection) {
1623+ let view_id = view.id;
1624+
1625+ // then delete
1626+ let transaction = Transaction::change_by_selection(doc.text(), selection, |range| {
1627+ (range.from(), range.to(), None)
1628+ });
1629+ doc.apply(&transaction, view_id);
1630+}
1631+
15891632fn delete_selection(cx: &mut Context) {
15901633 let reg_name = cx.register.unwrap_or('"');
15911634 let (view, doc) = current!(cx.editor);
@@ -4010,8 +4053,19 @@ pub mod insert {
40104053 .selection(view.id)
40114054 .clone()
40124055 .transform(|range| movement::move_prev_word_start(text, range, count));
4013− doc.set_selection(view.id, selection);
4014− delete_selection(cx)
4056+ delete_selection_insert_mode(doc, view, &selection);
4057+ }
4058+
4059+ pub fn delete_word_forward(cx: &mut Context) {
4060+ let count = cx.count();
4061+ let (view, doc) = current!(cx.editor);
4062+ let text = doc.text().slice(..);
4063+
4064+ let selection = doc
4065+ .selection(view.id)
4066+ .clone()
4067+ .transform(|range| movement::move_next_word_start(text, range, count));
4068+ delete_selection_insert_mode(doc, view, &selection);
40154069 }
40164070}
40174071
@@ -4973,6 +5027,15 @@ fn select_register(cx: &mut Context) {
49735027 })
49745028}
49755029
5030+fn insert_register(cx: &mut Context) {
5031+ cx.on_next_key(move |cx, event| {
5032+ if let Some(ch) = event.char() {
5033+ cx.editor.selected_register = Some(ch);
5034+ paste_before(cx);
5035+ }
5036+ })
5037+}
5038+
49765039fn align_view_top(cx: &mut Context) {
49775040 let (view, doc) = current!(cx.editor);
49785041 align_view(doc, view, Align::Top);