@@ -44,7 +44,7 @@ use once_cell::sync::Lazy;
4444use serde::de::{self, Deserialize, Deserializer};
4545
4646pub struct Context<'a> {
47− pub selected_register: helix_view::RegisterSelection,
47+ pub register: Option<char>,
4848 pub count: Option<NonZeroUsize>,
4949 pub editor: &'a mut Editor,
5050
@@ -1030,7 +1030,8 @@ fn select_all(cx: &mut Context) {
10301030}
10311031
10321032fn select_regex(cx: &mut Context) {
1033− let prompt = ui::regex_prompt(cx, "select:".into(), move |view, doc, _, regex| {
1033+ let reg = cx.register.unwrap_or('/');
1034+ let prompt = ui::regex_prompt(cx, "select:".into(), Some(reg), move |view, doc, regex| {
10341035 let text = doc.text().slice(..);
10351036 if let Some(selection) = selection::select_on_matches(text, doc.selection(view.id), ®ex)
10361037 {
@@ -1042,7 +1043,8 @@ fn select_regex(cx: &mut Context) {
10421043}
10431044
10441045fn split_selection(cx: &mut Context) {
1045− let prompt = ui::regex_prompt(cx, "split:".into(), move |view, doc, _, regex| {
1046+ let reg = cx.register.unwrap_or('/');
1047+ let prompt = ui::regex_prompt(cx, "split:".into(), Some(reg), move |view, doc, regex| {
10461048 let text = doc.text().slice(..);
10471049 let selection = selection::split_on_matches(text, doc.selection(view.id), ®ex);
10481050 doc.set_selection(view.id, selection);
@@ -1100,6 +1102,7 @@ fn search_impl(doc: &mut Document, view: &mut View, contents: &str, regex: &Rege
11001102
11011103// TODO: use one function for search vs extend
11021104fn search(cx: &mut Context) {
1105+ let reg = cx.register.unwrap_or('/');
11031106 let (_, doc) = current!(cx.editor);
11041107
11051108 // TODO: could probably share with select_on_matches?
@@ -1108,10 +1111,8 @@ fn search(cx: &mut Context) {
11081111 // feed chunks into the regex yet
11091112 let contents = doc.text().slice(..).to_string();
11101113
1111− let prompt = ui::regex_prompt(cx, "search:".into(), move |view, doc, registers, regex| {
1114+ let prompt = ui::regex_prompt(cx, "search:".into(), Some(reg), move |view, doc, regex| {
11121115 search_impl(doc, view, &contents, ®ex, false);
1113− // TODO: only store on enter (accept), not update
1114− registers.write('/', vec![regex.as_str().to_string()]);
11151116 });
11161117
11171118 cx.push_layer(Box::new(prompt));
@@ -1119,9 +1120,9 @@ fn search(cx: &mut Context) {
11191120
11201121fn search_next_impl(cx: &mut Context, extend: bool) {
11211122 let (view, doc) = current!(cx.editor);
1122− let registers = &mut cx.editor.registers;
1123+ let registers = &cx.editor.registers;
11231124 if let Some(query) = registers.read('/') {
1124− let query = query.first().unwrap();
1125+ let query = query.last().unwrap();
11251126 let contents = doc.text().slice(..).to_string();
11261127 let regex = Regex::new(query).unwrap();
11271128 search_impl(doc, view, &contents, ®ex, extend);
@@ -1141,7 +1142,7 @@ fn search_selection(cx: &mut Context) {
11411142 let contents = doc.text().slice(..);
11421143 let query = doc.selection(view.id).primary().fragment(contents);
11431144 let regex = regex::escape(&query);
1144− cx.editor.registers.write('/', vec![regex]);
1145+ cx.editor.registers.get_mut('/').push(regex);
11451146 search_next(cx);
11461147}
11471148
@@ -1200,7 +1201,7 @@ fn delete_selection_impl(reg: &mut Register, doc: &mut Document, view_id: ViewId
12001201}
12011202
12021203fn delete_selection(cx: &mut Context) {
1203− let reg_name = cx.selected_register.name();
1204+ let reg_name = cx.register.unwrap_or('"');
12041205 let (view, doc) = current!(cx.editor);
12051206 let registers = &mut cx.editor.registers;
12061207 let reg = registers.get_mut(reg_name);
@@ -1213,7 +1214,7 @@ fn delete_selection(cx: &mut Context) {
12131214}
12141215
12151216fn change_selection(cx: &mut Context) {
1216− let reg_name = cx.selected_register.name();
1217+ let reg_name = cx.register.unwrap_or('"');
12171218 let (view, doc) = current!(cx.editor);
12181219 let registers = &mut cx.editor.registers;
12191220 let reg = registers.get_mut(reg_name);
@@ -3346,12 +3347,12 @@ fn yank(cx: &mut Context) {
33463347 let msg = format!(
33473348 "yanked {} selection(s) to register {}",
33483349 values.len(),
3349− cx.selected_register.name()
3350+ cx.register.unwrap_or('"')
33503351 );
33513352
33523353 cx.editor
33533354 .registers
3354− .write(cx.selected_register.name(), values);
3355+ .write(cx.register.unwrap_or('"'), values);
33553356
33563357 cx.editor.set_status(msg);
33573358 exit_select_mode(cx);
@@ -3524,7 +3525,7 @@ fn paste_primary_clipboard_before(cx: &mut Context) {
35243525}
35253526
35263527fn replace_with_yanked(cx: &mut Context) {
3527− let reg_name = cx.selected_register.name();
3528+ let reg_name = cx.register.unwrap_or('"');
35283529 let (view, doc) = current!(cx.editor);
35293530 let registers = &mut cx.editor.registers;
35303531
@@ -3575,7 +3576,7 @@ fn replace_selections_with_primary_clipboard(cx: &mut Context) {
35753576}
35763577
35773578fn paste_after(cx: &mut Context) {
3578− let reg_name = cx.selected_register.name();
3579+ let reg_name = cx.register.unwrap_or('"');
35793580 let (view, doc) = current!(cx.editor);
35803581 let registers = &mut cx.editor.registers;
35813582
@@ -3589,7 +3590,7 @@ fn paste_after(cx: &mut Context) {
35893590}
35903591
35913592fn paste_before(cx: &mut Context) {
3592− let reg_name = cx.selected_register.name();
3593+ let reg_name = cx.register.unwrap_or('"');
35933594 let (view, doc) = current!(cx.editor);
35943595 let registers = &mut cx.editor.registers;
35953596
@@ -3770,7 +3771,8 @@ fn join_selections(cx: &mut Context) {
37703771
37713772fn keep_selections(cx: &mut Context) {
37723773 // keep selections matching regex
3773− let prompt = ui::regex_prompt(cx, "keep:".into(), move |view, doc, _, regex| {
3774+ let reg = cx.register.unwrap_or('/');
3775+ let prompt = ui::regex_prompt(cx, "keep:".into(), Some(reg), move |view, doc, regex| {
37743776 let text = doc.text().slice(..);
37753777
37763778 if let Some(selection) = selection::keep_matches(text, doc.selection(view.id), ®ex) {
@@ -4103,7 +4105,7 @@ fn wclose(cx: &mut Context) {
41034105fn select_register(cx: &mut Context) {
41044106 cx.on_next_key(move |cx, event| {
41054107 if let Some(ch) = event.char() {
4106− cx.editor.selected_register.select(ch);
4108+ cx.editor.selected_register = Some(ch);
41074109 }
41084110 })
41094111}