Skip to content

Commit

Permalink
Refactor blackhole register (helix-editor#4504)
Browse files Browse the repository at this point in the history
  • Loading branch information
ath3 authored and Frederik Vestre committed Feb 6, 2023
1 parent 2273002 commit 19809d7
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 37 deletions.
36 changes: 17 additions & 19 deletions helix-core/src/register.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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);
}
}

Expand All @@ -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> {
Expand Down
10 changes: 4 additions & 6 deletions helix-term/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1805,7 +1805,7 @@ fn search_selection(cx: &mut Context) {
.join("|");

let msg = format!("register '{}' set to '{}'", '/', &regex);
cx.editor.registers.get_mut('/').push(regex);
cx.editor.registers.push('/', regex);
cx.editor.set_status(msg);
}

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down
20 changes: 8 additions & 12 deletions helix-term/src/ui/prompt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();

if register.is_empty() {
return;
}
let values = match cx.editor.registers.read(register) {
Some(values) if !values.is_empty() => values,
_ => 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);

Expand Down Expand Up @@ -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());
};
}

Expand Down

0 comments on commit 19809d7

Please sign in to comment.