@@ -9,7 +9,6 @@ use helix_core::{
9 numbers::NumberIncrementor,
9 numbers::NumberIncrementor,
10 object, pos_at_coords,
10 object, pos_at_coords,
11 regex::{self, Regex, RegexBuilder},
11 regex::{self, Regex, RegexBuilder},
13 search, selection, surround, textobject,
12 search, selection, surround, textobject,
14 unicode::width::UnicodeWidthChar,
13 unicode::width::UnicodeWidthChar,
15 LineEnding, Position, Range, Rope, RopeGraphemes, RopeSlice, Selection, SmallVec, Tendril,
14 LineEnding, Position, Range, Rope, RopeGraphemes, RopeSlice, Selection, SmallVec, Tendril,
@@ -232,7 +231,9 @@ impl Command {
232 extend_line, "Select current line, if already selected, extend to next line",
231 extend_line, "Select current line, if already selected, extend to next line",
233 extend_to_line_bounds, "Extend selection to line bounds (line-wise selection)",
232 extend_to_line_bounds, "Extend selection to line bounds (line-wise selection)",
234 delete_selection, "Delete selection",
233 delete_selection, "Delete selection",
234+ delete_selection_noyank, "Delete selection, without yanking",
235 change_selection, "Change selection (delete and enter insert mode)",
235 change_selection, "Change selection (delete and enter insert mode)",
236+ change_selection_noyank, "Change selection (delete and enter insert mode, without yanking)",
236 collapse_selection, "Collapse selection onto a single cursor",
237 collapse_selection, "Collapse selection onto a single cursor",
237 flip_selections, "Flip selection cursor and anchor",
238 flip_selections, "Flip selection cursor and anchor",
238 insert_mode, "Insert before selection",
239 insert_mode, "Insert before selection",
@@ -1693,19 +1694,42 @@ fn extend_to_line_bounds(cx: &mut Context) {
1696−fn delete_selection_impl(reg: &mut Register, doc: &mut Document, view_id: ViewId) {
1702+fn delete_selection_impl(cx: &mut Context, op: Operation) {
1703+ let (view, doc) = current!(cx.editor);
1697 let text = doc.text().slice(..);
1705 let text = doc.text().slice(..);
1698− let selection = doc.selection(view_id);
1706+ let selection = doc.selection(view.id);
1708+ if cx.register != Some('_') {
1700− // first yank the selection
1709+ // first yank the selection
1701− let values: Vec<String> = selection.fragments(text).map(Cow::into_owned).collect();
1710+ let values: Vec<String> = selection.fragments(text).map(Cow::into_owned).collect();
1711+ let reg_name = cx.register.unwrap_or('"');
1712+ let registers = &mut cx.editor.registers;
1713+ let reg = registers.get_mut(reg_name);
1702− reg.write(values);
1714+ reg.write(values);
1704 // then delete
1717 // then delete
1705 let transaction = Transaction::change_by_selection(doc.text(), selection, |range| {
1718 let transaction = Transaction::change_by_selection(doc.text(), selection, |range| {
1706 (range.from(), range.to(), None)
1719 (range.from(), range.to(), None)
1708− doc.apply(&transaction, view_id);
1721+ doc.apply(&transaction, view.id);
1724+ Operation::Delete => {
1725+ doc.append_changes_to_history(view.id);
1726+ // exit select mode, if currently in select mode
1727+ exit_select_mode(cx);
1729+ Operation::Change => {
1730+ enter_insert_mode(doc);
1711#[inline]
1735#[inline]
@@ -1720,25 +1744,21 @@ fn delete_selection_insert_mode(doc: &mut Document, view: &View, selection: &Sel
1722fn delete_selection(cx: &mut Context) {
1746fn delete_selection(cx: &mut Context) {
1723− let reg_name = cx.register.unwrap_or('"');
1724− let (view, doc) = current!(cx.editor);
1725− let registers = &mut cx.editor.registers;
1726− let reg = registers.get_mut(reg_name);
1727− delete_selection_impl(reg, doc, view.id);
1747+ delete_selection_impl(cx, Operation::Delete);
1729− doc.append_changes_to_history(view.id);
1731− // exit select mode, if currently in select mode
1750+fn delete_selection_noyank(cx: &mut Context) {
1732− exit_select_mode(cx);
1751+ cx.register = Some('_');
1752+ delete_selection_impl(cx, Operation::Delete);
1735fn change_selection(cx: &mut Context) {
1755fn change_selection(cx: &mut Context) {
1736− let reg_name = cx.register.unwrap_or('"');
1756+ delete_selection_impl(cx, Operation::Change);
1737− let (view, doc) = current!(cx.editor);
1757+}
1738− let registers = &mut cx.editor.registers;
1758+
1739− let reg = registers.get_mut(reg_name);
1759+fn change_selection_noyank(cx: &mut Context) {
1760+ cx.register = Some('_');
1740− delete_selection_impl(reg, doc, view.id);
1761+ delete_selection_impl(cx, Operation::Change);
1741− enter_insert_mode(doc);
1744fn collapse_selection(cx: &mut Context) {
1764fn collapse_selection(cx: &mut Context) {