@@ -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 ) , & regex)
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 ) , & regex) ;
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,20 +1111,18 @@ 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, & regex, 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) ) ;
11181119}
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, & regex, 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 ) , & regex) {
@@ -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}
0 commit comments