@@ -35,6 +35,7 @@ use crossterm::event::{KeyCode, KeyEvent};
3535use once_cell::sync::Lazy;
3636
3737pub struct Context<'a> {
38+ pub register: helix_view::RegisterSelection,
3839 pub count: usize,
3940 pub editor: &'a mut Editor,
4041
@@ -777,7 +778,7 @@ pub fn extend_line(cx: &mut Context) {
777778
778779// heuristic: append changes to history after each command, unless we're in insert mode
779780
780−fn _delete_selection(doc: &mut Document, view_id: ViewId) {
781+fn _delete_selection(reg: char, doc: &mut Document, view_id: ViewId) {
781782 // first yank the selection
782783 let values: Vec<String> = doc
783784 .selection(view_id)
@@ -785,8 +786,6 @@ fn _delete_selection(doc: &mut Document, view_id: ViewId) {
785786 .map(Cow::into_owned)
786787 .collect();
787788
788− // TODO: allow specifying reg
789− let reg = '"';
790789 register::set(reg, values);
791790
792791 // then delete
@@ -800,8 +799,9 @@ fn _delete_selection(doc: &mut Document, view_id: ViewId) {
800799}
801800
802801pub fn delete_selection(cx: &mut Context) {
802+ let reg = cx.register.name();
803803 let (view, doc) = cx.current();
804− _delete_selection(doc, view.id);
804+ _delete_selection(reg, doc, view.id);
805805
806806 doc.append_changes_to_history(view.id);
807807
@@ -810,8 +810,9 @@ pub fn delete_selection(cx: &mut Context) {
810810}
811811
812812pub fn change_selection(cx: &mut Context) {
813+ let reg = cx.register.name();
813814 let (view, doc) = cx.current();
814− _delete_selection(doc, view.id);
815+ _delete_selection(reg, doc, view.id);
815816 enter_insert_mode(doc);
816817}
817818
@@ -1893,11 +1894,13 @@ pub fn yank(cx: &mut Context) {
18931894 .map(Cow::into_owned)
18941895 .collect();
18951896
1896− // TODO: allow specifying reg
1897− let reg = '"';
1898− let msg = format!("yanked {} selection(s) to register {}", values.len(), reg);
1897+ let msg = format!(
1898+ "yanked {} selection(s) to register {}",
1899+ values.len(),
1900+ cx.register.name()
1901+ );
18991902
1900− register::set(reg, values);
1903+ register::set(cx.register.name(), values);
19011904
19021905 cx.editor.set_status(msg)
19031906}
@@ -1908,9 +1911,7 @@ enum Paste {
19081911 After,
19091912}
19101913
1911−fn _paste(doc: &mut Document, view: &View, action: Paste) -> Option<Transaction> {
1912− // TODO: allow specifying reg
1913− let reg = '"';
1914+fn _paste(reg: char, doc: &mut Document, view: &View, action: Paste) -> Option<Transaction> {
19141915 if let Some(values) = register::get(reg) {
19151916 let repeat = std::iter::repeat(
19161917 values
@@ -1956,18 +1957,20 @@ fn _paste(doc: &mut Document, view: &View, action: Paste) -> Option<Transaction>
19561957// default insert
19571958
19581959pub fn paste_after(cx: &mut Context) {
1960+ let reg = cx.register.name();
19591961 let (view, doc) = cx.current();
19601962
1961− if let Some(transaction) = _paste(doc, view, Paste::After) {
1963+ if let Some(transaction) = _paste(reg, doc, view, Paste::After) {
19621964 doc.apply(&transaction, view.id);
19631965 doc.append_changes_to_history(view.id);
19641966 }
19651967}
19661968
19671969pub fn paste_before(cx: &mut Context) {
1970+ let reg = cx.register.name();
19681971 let (view, doc) = cx.current();
19691972
1970− if let Some(transaction) = _paste(doc, view, Paste::Before) {
1973+ if let Some(transaction) = _paste(reg, doc, view, Paste::Before) {
19711974 doc.apply(&transaction, view.id);
19721975 doc.append_changes_to_history(view.id);
19731976 }
@@ -2426,6 +2429,18 @@ pub fn wclose(cx: &mut Context) {
24262429 cx.editor.close(view_id, /* close_buffer */ false);
24272430}
24282431
2432+pub fn select_register(cx: &mut Context) {
2433+ cx.on_next_key(move |cx, event| {
2434+ if let KeyEvent {
2435+ code: KeyCode::Char(ch),
2436+ ..
2437+ } = event
2438+ {
2439+ cx.editor.register.select(ch);
2440+ }
2441+ })
2442+}
2443+
24292444pub fn space_mode(cx: &mut Context) {
24302445 cx.on_next_key(move |cx, event| {
24312446 if let KeyEvent {
@@ -2439,7 +2454,7 @@ pub fn space_mode(cx: &mut Context) {
24392454 'b' => buffer_picker(cx),
24402455 'w' => window_mode(cx),
24412456 // ' ' => toggle_alternate_buffer(cx),
2442− // TODO: temporary since space mode took it's old key
2457+ // TODO: temporary since space mode took its old key
24432458 ' ' => keep_primary_selection(cx),
24442459 _ => (),
24452460 }