From 3a162e2bef0b8a5ae1045d8b018447c9ed9fde61 Mon Sep 17 00:00:00 2001 From: Jonathan LEI Date: Tue, 15 Aug 2023 07:59:49 +0800 Subject: [PATCH] Make editor remember the latest search register (#5244) --- helix-term/src/commands.rs | 26 +++++++++++++++++++++----- helix-view/src/register.rs | 2 ++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 61c647d0..b8324b65 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -1895,7 +1895,9 @@ fn searcher(cx: &mut Context, direction: Direction) { .collect() }, move |editor, regex, event| { - if !matches!(event, PromptEvent::Update | PromptEvent::Validate) { + if event == PromptEvent::Validate { + editor.registers.last_search_register = reg; + } else if event != PromptEvent::Update { return; } search_impl( @@ -1914,7 +1916,9 @@ fn searcher(cx: &mut Context, direction: Direction) { fn search_next_or_prev_impl(cx: &mut Context, movement: Movement, direction: Direction) { let count = cx.count(); - let register = cx.register.unwrap_or('/'); + let register = cx + .register + .unwrap_or(cx.editor.registers.last_search_register); let config = cx.editor.config(); let scrolloff = config.scrolloff; if let Some(query) = cx.editor.registers.first(register, cx.editor) { @@ -1982,13 +1986,21 @@ fn search_selection(cx: &mut Context) { let msg = format!("register '{}' set to '{}'", register, ®ex); match cx.editor.registers.push(register, regex) { - Ok(_) => cx.editor.set_status(msg), + Ok(_) => { + cx.editor.registers.last_search_register = register; + cx.editor.set_status(msg) + } Err(err) => cx.editor.set_error(err.to_string()), } } fn make_search_word_bounded(cx: &mut Context) { - let register = cx.register.unwrap_or('/'); + // Defaults to the active search register instead `/` to be more ergonomic assuming most people + // would use this command following `search_selection`. This avoids selecting the register + // twice. + let register = cx + .register + .unwrap_or(cx.editor.registers.last_search_register); let regex = match cx.editor.registers.first(register, cx.editor) { Some(regex) => regex, None => return, @@ -2014,7 +2026,10 @@ fn make_search_word_bounded(cx: &mut Context) { let msg = format!("register '{}' set to '{}'", register, &new_regex); match cx.editor.registers.push(register, new_regex) { - Ok(_) => cx.editor.set_status(msg), + Ok(_) => { + cx.editor.registers.last_search_register = register; + cx.editor.set_status(msg) + } Err(err) => cx.editor.set_error(err.to_string()), } } @@ -2078,6 +2093,7 @@ fn global_search(cx: &mut Context) { if event != PromptEvent::Validate { return; } + editor.registers.last_search_register = reg; let documents: Vec<_> = editor .documents() diff --git a/helix-view/src/register.rs b/helix-view/src/register.rs index 3d1849a6..0ebea536 100644 --- a/helix-view/src/register.rs +++ b/helix-view/src/register.rs @@ -29,6 +29,7 @@ pub struct Registers { /// efficiently prepend new values in `Registers::push`. inner: HashMap>, clipboard_provider: Box, + pub last_search_register: char, } impl Default for Registers { @@ -36,6 +37,7 @@ impl Default for Registers { Self { inner: Default::default(), clipboard_provider: get_clipboard_provider(), + last_search_register: '/', } } }