on master help sign in
Refactor blackhole register (#4504)
3b7760dath3
helix-core/src/register.rs+17−19
@@ -15,11 +15,7 @@ impl Register {
15 }
15 }
16
16
17 pub fn new_with_values(name: char, values: Vec<String>) -> Self {
17 pub fn new_with_values(name: char, values: Vec<String>) -> Self {
18− if name == '_' {
19− Self::new(name)
20− } else {
21− Self { name, values }
18+ Self { name, values }
22− }
23 }
19 }
24
20
25 pub const fn name(&self) -> char {
21 pub const fn name(&self) -> char {
@@ -31,15 +27,11 @@ impl Register {
31 }
27 }
32
28
33 pub fn write(&mut self, values: Vec<String>) {
29 pub fn write(&mut self, values: Vec<String>) {
34− if self.name != '_' {
35− self.values = values;
30+ self.values = values;
36− }
37 }
31 }
38
32
39 pub fn push(&mut self, value: String) {
33 pub fn push(&mut self, value: String) {
40− if self.name != '_' {
41− self.values.push(value);
34+ self.values.push(value);
42− }
43 }
35 }
44}
36}
45
37
@@ -54,19 +46,25 @@ impl Registers {
54 self.inner.get(&name)
46 self.inner.get(&name)
55 }
47 }
56
48
57− pub fn get_mut(&mut self, name: char) -> &mut Register {
49+ pub fn read(&self, name: char) -> Option<&[String]> {
58− self.inner
50+ self.get(name).map(|reg| reg.read())
59− .entry(name)
60− .or_insert_with(|| Register::new(name))
61 }
51 }
62
52
63 pub fn write(&mut self, name: char, values: Vec<String>) {
53 pub fn write(&mut self, name: char, values: Vec<String>) {
54+ if name != '_' {
64− self.inner
55+ self.inner
65− .insert(name, Register::new_with_values(name, values));
56+ .insert(name, Register::new_with_values(name, values));
57+ }
66 }
58 }
67
59
68− pub fn read(&self, name: char) -> Option<&[String]> {
60+ pub fn push(&mut self, name: char, value: String) {
69− self.get(name).map(|reg| reg.read())
61+ if name != '_' {
62+ if let Some(r) = self.inner.get_mut(&name) {
63+ r.push(value);
64+ } else {
65+ self.write(name, vec![value]);
66+ }
67+ }
70 }
68 }
71
69
72 pub fn first(&self, name: char) -> Option<&String> {
70 pub fn first(&self, name: char) -> Option<&String> {
helix-term/src/commands.rs+4−6
@@ -1805,7 +1805,7 @@ fn search_selection(cx: &mut Context) {
1805 .join("|");
1805 .join("|");
1806
1806
1807 let msg = format!("register '{}' set to '{}'", '/', &regex);
1807 let msg = format!("register '{}' set to '{}'", '/', &regex);
1808− cx.editor.registers.get_mut('/').push(regex);
1808+ cx.editor.registers.push('/', regex);
1809 cx.editor.set_status(msg);
1809 cx.editor.set_status(msg);
1810}
1810}
1811
1811
@@ -2121,16 +2121,14 @@ enum Operation {
2121fn delete_selection_impl(cx: &mut Context, op: Operation) {
2121fn delete_selection_impl(cx: &mut Context, op: Operation) {
2122 let (view, doc) = current!(cx.editor);
2122 let (view, doc) = current!(cx.editor);
2123
2123
2124− let text = doc.text().slice(..);
2125 let selection = doc.selection(view.id);
2124 let selection = doc.selection(view.id);
2126
2125
2127 if cx.register != Some('_') {
2126 if cx.register != Some('_') {
2128 // first yank the selection
2127 // first yank the selection
2128+ let text = doc.text().slice(..);
2129 let values: Vec<String> = selection.fragments(text).map(Cow::into_owned).collect();
2129 let values: Vec<String> = selection.fragments(text).map(Cow::into_owned).collect();
2130 let reg_name = cx.register.unwrap_or('"');
2130 let reg_name = cx.register.unwrap_or('"');
2131− let registers = &mut cx.editor.registers;
2131+ cx.editor.registers.write(reg_name, values);
2132− let reg = registers.get_mut(reg_name);
2133− reg.write(values);
2134 };
2132 };
2135
2133
2136 // then delete
2134 // then delete
@@ -5005,7 +5003,7 @@ fn record_macro(cx: &mut Context) {
5005 }
5003 }
5006 })
5004 })
5007 .collect::<String>();
5005 .collect::<String>();
5008− cx.editor.registers.get_mut(reg).write(vec![s]);
5006+ cx.editor.registers.write(reg, vec![s]);
5009 cx.editor
5007 cx.editor
5010 .set_status(format!("Recorded to register [{}]", reg));
5008 .set_status(format!("Recorded to register [{}]", reg));
5011 } else {
5009 } else {
helix-term/src/ui/prompt.rs+8−12
@@ -294,23 +294,22 @@ impl Prompt {
294 direction: CompletionDirection,
294 direction: CompletionDirection,
295 ) {
295 ) {
296 (self.callback_fn)(cx, &self.line, PromptEvent::Abort);
296 (self.callback_fn)(cx, &self.line, PromptEvent::Abort);
297− let register = cx.editor.registers.get_mut(register).read();
297+ let values = match cx.editor.registers.read(register) {
298−
299− if register.is_empty() {
298+ Some(values) if !values.is_empty() => values,
300− return;
299+ _ => return,
301− }
300+ };
302
301
303− let end = register.len().saturating_sub(1);
302+ let end = values.len().saturating_sub(1);
304
303
305 let index = match direction {
304 let index = match direction {
306 CompletionDirection::Forward => self.history_pos.map_or(0, |i| i + 1),
305 CompletionDirection::Forward => self.history_pos.map_or(0, |i| i + 1),
307 CompletionDirection::Backward => {
306 CompletionDirection::Backward => {
308− self.history_pos.unwrap_or(register.len()).saturating_sub(1)
307+ self.history_pos.unwrap_or(values.len()).saturating_sub(1)
309 }
308 }
310 }
309 }
311 .min(end);
310 .min(end);
312
311
313− self.line = register[index].clone();
312+ self.line = values[index].clone();
314
313
315 self.history_pos = Some(index);
314 self.history_pos = Some(index);
316
315
@@ -548,10 +547,7 @@ impl Component for Prompt {
548 if last_item != self.line {
547 if last_item != self.line {
549 // store in history
548 // store in history
550 if let Some(register) = self.history_register {
549 if let Some(register) = self.history_register {
551− cx.editor
552− .registers
553− .get_mut(register)
554− .push(self.line.clone());
550+ cx.editor.registers.push(register, self.line.clone());
555 };
551 };
556 }
552 }
557
553