Refactor blackhole register (#4504)
This commit is contained in:
parent
652497bdd6
commit
3b7760dfb0
3 changed files with 29 additions and 37 deletions
|
@ -15,11 +15,7 @@ impl Register {
|
|||
}
|
||||
|
||||
pub fn new_with_values(name: char, values: Vec<String>) -> Self {
|
||||
if name == '_' {
|
||||
Self::new(name)
|
||||
} else {
|
||||
Self { name, values }
|
||||
}
|
||||
Self { name, values }
|
||||
}
|
||||
|
||||
pub const fn name(&self) -> char {
|
||||
|
@ -31,15 +27,11 @@ impl Register {
|
|||
}
|
||||
|
||||
pub fn write(&mut self, values: Vec<String>) {
|
||||
if self.name != '_' {
|
||||
self.values = values;
|
||||
}
|
||||
self.values = values;
|
||||
}
|
||||
|
||||
pub fn push(&mut self, value: String) {
|
||||
if self.name != '_' {
|
||||
self.values.push(value);
|
||||
}
|
||||
self.values.push(value);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -54,19 +46,25 @@ impl Registers {
|
|||
self.inner.get(&name)
|
||||
}
|
||||
|
||||
pub fn get_mut(&mut self, name: char) -> &mut Register {
|
||||
self.inner
|
||||
.entry(name)
|
||||
.or_insert_with(|| Register::new(name))
|
||||
pub fn read(&self, name: char) -> Option<&[String]> {
|
||||
self.get(name).map(|reg| reg.read())
|
||||
}
|
||||
|
||||
pub fn write(&mut self, name: char, values: Vec<String>) {
|
||||
self.inner
|
||||
.insert(name, Register::new_with_values(name, values));
|
||||
if name != '_' {
|
||||
self.inner
|
||||
.insert(name, Register::new_with_values(name, values));
|
||||
}
|
||||
}
|
||||
|
||||
pub fn read(&self, name: char) -> Option<&[String]> {
|
||||
self.get(name).map(|reg| reg.read())
|
||||
pub fn push(&mut self, name: char, value: String) {
|
||||
if name != '_' {
|
||||
if let Some(r) = self.inner.get_mut(&name) {
|
||||
r.push(value);
|
||||
} else {
|
||||
self.write(name, vec![value]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn first(&self, name: char) -> Option<&String> {
|
||||
|
|
|
@ -1805,7 +1805,7 @@ fn search_selection(cx: &mut Context) {
|
|||
.join("|");
|
||||
|
||||
let msg = format!("register '{}' set to '{}'", '/', ®ex);
|
||||
cx.editor.registers.get_mut('/').push(regex);
|
||||
cx.editor.registers.push('/', regex);
|
||||
cx.editor.set_status(msg);
|
||||
}
|
||||
|
||||
|
@ -2121,16 +2121,14 @@ enum Operation {
|
|||
fn delete_selection_impl(cx: &mut Context, op: Operation) {
|
||||
let (view, doc) = current!(cx.editor);
|
||||
|
||||
let text = doc.text().slice(..);
|
||||
let selection = doc.selection(view.id);
|
||||
|
||||
if cx.register != Some('_') {
|
||||
// first yank the selection
|
||||
let text = doc.text().slice(..);
|
||||
let values: Vec<String> = selection.fragments(text).map(Cow::into_owned).collect();
|
||||
let reg_name = cx.register.unwrap_or('"');
|
||||
let registers = &mut cx.editor.registers;
|
||||
let reg = registers.get_mut(reg_name);
|
||||
reg.write(values);
|
||||
cx.editor.registers.write(reg_name, values);
|
||||
};
|
||||
|
||||
// then delete
|
||||
|
@ -5005,7 +5003,7 @@ fn record_macro(cx: &mut Context) {
|
|||
}
|
||||
})
|
||||
.collect::<String>();
|
||||
cx.editor.registers.get_mut(reg).write(vec![s]);
|
||||
cx.editor.registers.write(reg, vec![s]);
|
||||
cx.editor
|
||||
.set_status(format!("Recorded to register [{}]", reg));
|
||||
} else {
|
||||
|
|
|
@ -294,23 +294,22 @@ impl Prompt {
|
|||
direction: CompletionDirection,
|
||||
) {
|
||||
(self.callback_fn)(cx, &self.line, PromptEvent::Abort);
|
||||
let register = cx.editor.registers.get_mut(register).read();
|
||||
let values = match cx.editor.registers.read(register) {
|
||||
Some(values) if !values.is_empty() => values,
|
||||
_ => return,
|
||||
};
|
||||
|
||||
if register.is_empty() {
|
||||
return;
|
||||
}
|
||||
|
||||
let end = register.len().saturating_sub(1);
|
||||
let end = values.len().saturating_sub(1);
|
||||
|
||||
let index = match direction {
|
||||
CompletionDirection::Forward => self.history_pos.map_or(0, |i| i + 1),
|
||||
CompletionDirection::Backward => {
|
||||
self.history_pos.unwrap_or(register.len()).saturating_sub(1)
|
||||
self.history_pos.unwrap_or(values.len()).saturating_sub(1)
|
||||
}
|
||||
}
|
||||
.min(end);
|
||||
|
||||
self.line = register[index].clone();
|
||||
self.line = values[index].clone();
|
||||
|
||||
self.history_pos = Some(index);
|
||||
|
||||
|
@ -548,10 +547,7 @@ impl Component for Prompt {
|
|||
if last_item != self.line {
|
||||
// store in history
|
||||
if let Some(register) = self.history_register {
|
||||
cx.editor
|
||||
.registers
|
||||
.get_mut(register)
|
||||
.push(self.line.clone());
|
||||
cx.editor.registers.push(register, self.line.clone());
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue