@@ -44,7 +44,7 @@ use once_cell::sync::Lazy;
44
44
use serde:: de:: { self , Deserialize , Deserializer } ;
45
45
46
46
pub struct Context < ' a > {
47
- pub selected_register : helix_view :: RegisterSelection ,
47
+ pub register : Option < char > ,
48
48
pub count : Option < NonZeroUsize > ,
49
49
pub editor : & ' a mut Editor ,
50
50
@@ -1030,7 +1030,8 @@ fn select_all(cx: &mut Context) {
1030
1030
}
1031
1031
1032
1032
fn 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| {
1034
1035
let text = doc. text ( ) . slice ( ..) ;
1035
1036
if let Some ( selection) = selection:: select_on_matches ( text, doc. selection ( view. id ) , & regex)
1036
1037
{
@@ -1042,7 +1043,8 @@ fn select_regex(cx: &mut Context) {
1042
1043
}
1043
1044
1044
1045
fn 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| {
1046
1048
let text = doc. text ( ) . slice ( ..) ;
1047
1049
let selection = selection:: split_on_matches ( text, doc. selection ( view. id ) , & regex) ;
1048
1050
doc. set_selection ( view. id , selection) ;
@@ -1100,6 +1102,7 @@ fn search_impl(doc: &mut Document, view: &mut View, contents: &str, regex: &Rege
1100
1102
1101
1103
// TODO: use one function for search vs extend
1102
1104
fn search ( cx : & mut Context ) {
1105
+ let reg = cx. register . unwrap_or ( '/' ) ;
1103
1106
let ( _, doc) = current ! ( cx. editor) ;
1104
1107
1105
1108
// TODO: could probably share with select_on_matches?
@@ -1108,20 +1111,18 @@ fn search(cx: &mut Context) {
1108
1111
// feed chunks into the regex yet
1109
1112
let contents = doc. text ( ) . slice ( ..) . to_string ( ) ;
1110
1113
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| {
1112
1115
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( ) ] ) ;
1115
1116
} ) ;
1116
1117
1117
1118
cx. push_layer ( Box :: new ( prompt) ) ;
1118
1119
}
1119
1120
1120
1121
fn search_next_impl ( cx : & mut Context , extend : bool ) {
1121
1122
let ( view, doc) = current ! ( cx. editor) ;
1122
- let registers = & mut cx. editor . registers ;
1123
+ let registers = & cx. editor . registers ;
1123
1124
if let Some ( query) = registers. read ( '/' ) {
1124
- let query = query. first ( ) . unwrap ( ) ;
1125
+ let query = query. last ( ) . unwrap ( ) ;
1125
1126
let contents = doc. text ( ) . slice ( ..) . to_string ( ) ;
1126
1127
let regex = Regex :: new ( query) . unwrap ( ) ;
1127
1128
search_impl ( doc, view, & contents, & regex, extend) ;
@@ -1141,7 +1142,7 @@ fn search_selection(cx: &mut Context) {
1141
1142
let contents = doc. text ( ) . slice ( ..) ;
1142
1143
let query = doc. selection ( view. id ) . primary ( ) . fragment ( contents) ;
1143
1144
let regex = regex:: escape ( & query) ;
1144
- cx. editor . registers . write ( '/' , vec ! [ regex] ) ;
1145
+ cx. editor . registers . get_mut ( '/' ) . push ( regex) ;
1145
1146
search_next ( cx) ;
1146
1147
}
1147
1148
@@ -1200,7 +1201,7 @@ fn delete_selection_impl(reg: &mut Register, doc: &mut Document, view_id: ViewId
1200
1201
}
1201
1202
1202
1203
fn delete_selection ( cx : & mut Context ) {
1203
- let reg_name = cx. selected_register . name ( ) ;
1204
+ let reg_name = cx. register . unwrap_or ( '"' ) ;
1204
1205
let ( view, doc) = current ! ( cx. editor) ;
1205
1206
let registers = & mut cx. editor . registers ;
1206
1207
let reg = registers. get_mut ( reg_name) ;
@@ -1213,7 +1214,7 @@ fn delete_selection(cx: &mut Context) {
1213
1214
}
1214
1215
1215
1216
fn change_selection ( cx : & mut Context ) {
1216
- let reg_name = cx. selected_register . name ( ) ;
1217
+ let reg_name = cx. register . unwrap_or ( '"' ) ;
1217
1218
let ( view, doc) = current ! ( cx. editor) ;
1218
1219
let registers = & mut cx. editor . registers ;
1219
1220
let reg = registers. get_mut ( reg_name) ;
@@ -3346,12 +3347,12 @@ fn yank(cx: &mut Context) {
3346
3347
let msg = format ! (
3347
3348
"yanked {} selection(s) to register {}" ,
3348
3349
values. len( ) ,
3349
- cx. selected_register . name ( )
3350
+ cx. register . unwrap_or ( '"' )
3350
3351
) ;
3351
3352
3352
3353
cx. editor
3353
3354
. registers
3354
- . write ( cx. selected_register . name ( ) , values) ;
3355
+ . write ( cx. register . unwrap_or ( '"' ) , values) ;
3355
3356
3356
3357
cx. editor . set_status ( msg) ;
3357
3358
exit_select_mode ( cx) ;
@@ -3524,7 +3525,7 @@ fn paste_primary_clipboard_before(cx: &mut Context) {
3524
3525
}
3525
3526
3526
3527
fn replace_with_yanked ( cx : & mut Context ) {
3527
- let reg_name = cx. selected_register . name ( ) ;
3528
+ let reg_name = cx. register . unwrap_or ( '"' ) ;
3528
3529
let ( view, doc) = current ! ( cx. editor) ;
3529
3530
let registers = & mut cx. editor . registers ;
3530
3531
@@ -3575,7 +3576,7 @@ fn replace_selections_with_primary_clipboard(cx: &mut Context) {
3575
3576
}
3576
3577
3577
3578
fn paste_after ( cx : & mut Context ) {
3578
- let reg_name = cx. selected_register . name ( ) ;
3579
+ let reg_name = cx. register . unwrap_or ( '"' ) ;
3579
3580
let ( view, doc) = current ! ( cx. editor) ;
3580
3581
let registers = & mut cx. editor . registers ;
3581
3582
@@ -3589,7 +3590,7 @@ fn paste_after(cx: &mut Context) {
3589
3590
}
3590
3591
3591
3592
fn paste_before ( cx : & mut Context ) {
3592
- let reg_name = cx. selected_register . name ( ) ;
3593
+ let reg_name = cx. register . unwrap_or ( '"' ) ;
3593
3594
let ( view, doc) = current ! ( cx. editor) ;
3594
3595
let registers = & mut cx. editor . registers ;
3595
3596
@@ -3770,7 +3771,8 @@ fn join_selections(cx: &mut Context) {
3770
3771
3771
3772
fn keep_selections ( cx : & mut Context ) {
3772
3773
// 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| {
3774
3776
let text = doc. text ( ) . slice ( ..) ;
3775
3777
3776
3778
if let Some ( selection) = selection:: keep_matches ( text, doc. selection ( view. id ) , & regex) {
@@ -4103,7 +4105,7 @@ fn wclose(cx: &mut Context) {
4103
4105
fn select_register ( cx : & mut Context ) {
4104
4106
cx. on_next_key ( move |cx, event| {
4105
4107
if let Some ( ch) = event. char ( ) {
4106
- cx. editor . selected_register . select ( ch) ;
4108
+ cx. editor . selected_register = Some ( ch) ;
4107
4109
}
4108
4110
} )
4109
4111
}
0 commit comments