Skip to content

Commit 72cf86e

Browse files
committed
Regex prompts should have a history with a specifiable register
1 parent 011f9aa commit 72cf86e

File tree

6 files changed

+29
-78
lines changed

6 files changed

+29
-78
lines changed

helix-term/src/commands.rs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ use once_cell::sync::Lazy;
4444
use serde::de::{self, Deserialize, Deserializer};
4545

4646
pub struct Context<'a> {
47-
pub selected_register: helix_view::RegisterSelection,
47+
pub register: Option<char>,
4848
pub count: Option<NonZeroUsize>,
4949
pub editor: &'a mut Editor,
5050

@@ -1030,7 +1030,8 @@ fn select_all(cx: &mut Context) {
10301030
}
10311031

10321032
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| {
10341035
let text = doc.text().slice(..);
10351036
if let Some(selection) = selection::select_on_matches(text, doc.selection(view.id), &regex)
10361037
{
@@ -1042,7 +1043,8 @@ fn select_regex(cx: &mut Context) {
10421043
}
10431044

10441045
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| {
10461048
let text = doc.text().slice(..);
10471049
let selection = selection::split_on_matches(text, doc.selection(view.id), &regex);
10481050
doc.set_selection(view.id, selection);
@@ -1100,6 +1102,7 @@ fn search_impl(doc: &mut Document, view: &mut View, contents: &str, regex: &Rege
11001102

11011103
// TODO: use one function for search vs extend
11021104
fn search(cx: &mut Context) {
1105+
let reg = cx.register.unwrap_or('/');
11031106
let (_, doc) = current!(cx.editor);
11041107

11051108
// TODO: could probably share with select_on_matches?
@@ -1108,20 +1111,18 @@ fn search(cx: &mut Context) {
11081111
// feed chunks into the regex yet
11091112
let contents = doc.text().slice(..).to_string();
11101113

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| {
11121115
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()]);
11151116
});
11161117

11171118
cx.push_layer(Box::new(prompt));
11181119
}
11191120

11201121
fn search_next_impl(cx: &mut Context, extend: bool) {
11211122
let (view, doc) = current!(cx.editor);
1122-
let registers = &mut cx.editor.registers;
1123+
let registers = &cx.editor.registers;
11231124
if let Some(query) = registers.read('/') {
1124-
let query = query.first().unwrap();
1125+
let query = query.last().unwrap();
11251126
let contents = doc.text().slice(..).to_string();
11261127
let regex = Regex::new(query).unwrap();
11271128
search_impl(doc, view, &contents, &regex, extend);
@@ -1141,7 +1142,7 @@ fn search_selection(cx: &mut Context) {
11411142
let contents = doc.text().slice(..);
11421143
let query = doc.selection(view.id).primary().fragment(contents);
11431144
let regex = regex::escape(&query);
1144-
cx.editor.registers.write('/', vec![regex]);
1145+
cx.editor.registers.get_mut('/').push(regex);
11451146
search_next(cx);
11461147
}
11471148

@@ -1200,7 +1201,7 @@ fn delete_selection_impl(reg: &mut Register, doc: &mut Document, view_id: ViewId
12001201
}
12011202

12021203
fn delete_selection(cx: &mut Context) {
1203-
let reg_name = cx.selected_register.name();
1204+
let reg_name = cx.register.unwrap_or('"');
12041205
let (view, doc) = current!(cx.editor);
12051206
let registers = &mut cx.editor.registers;
12061207
let reg = registers.get_mut(reg_name);
@@ -1213,7 +1214,7 @@ fn delete_selection(cx: &mut Context) {
12131214
}
12141215

12151216
fn change_selection(cx: &mut Context) {
1216-
let reg_name = cx.selected_register.name();
1217+
let reg_name = cx.register.unwrap_or('"');
12171218
let (view, doc) = current!(cx.editor);
12181219
let registers = &mut cx.editor.registers;
12191220
let reg = registers.get_mut(reg_name);
@@ -3346,12 +3347,12 @@ fn yank(cx: &mut Context) {
33463347
let msg = format!(
33473348
"yanked {} selection(s) to register {}",
33483349
values.len(),
3349-
cx.selected_register.name()
3350+
cx.register.unwrap_or('"')
33503351
);
33513352

33523353
cx.editor
33533354
.registers
3354-
.write(cx.selected_register.name(), values);
3355+
.write(cx.register.unwrap_or('"'), values);
33553356

33563357
cx.editor.set_status(msg);
33573358
exit_select_mode(cx);
@@ -3524,7 +3525,7 @@ fn paste_primary_clipboard_before(cx: &mut Context) {
35243525
}
35253526

35263527
fn replace_with_yanked(cx: &mut Context) {
3527-
let reg_name = cx.selected_register.name();
3528+
let reg_name = cx.register.unwrap_or('"');
35283529
let (view, doc) = current!(cx.editor);
35293530
let registers = &mut cx.editor.registers;
35303531

@@ -3575,7 +3576,7 @@ fn replace_selections_with_primary_clipboard(cx: &mut Context) {
35753576
}
35763577

35773578
fn paste_after(cx: &mut Context) {
3578-
let reg_name = cx.selected_register.name();
3579+
let reg_name = cx.register.unwrap_or('"');
35793580
let (view, doc) = current!(cx.editor);
35803581
let registers = &mut cx.editor.registers;
35813582

@@ -3589,7 +3590,7 @@ fn paste_after(cx: &mut Context) {
35893590
}
35903591

35913592
fn paste_before(cx: &mut Context) {
3592-
let reg_name = cx.selected_register.name();
3593+
let reg_name = cx.register.unwrap_or('"');
35933594
let (view, doc) = current!(cx.editor);
35943595
let registers = &mut cx.editor.registers;
35953596

@@ -3770,7 +3771,8 @@ fn join_selections(cx: &mut Context) {
37703771

37713772
fn keep_selections(cx: &mut Context) {
37723773
// 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| {
37743776
let text = doc.text().slice(..);
37753777

37763778
if let Some(selection) = selection::keep_matches(text, doc.selection(view.id), &regex) {
@@ -4103,7 +4105,7 @@ fn wclose(cx: &mut Context) {
41034105
fn select_register(cx: &mut Context) {
41044106
cx.on_next_key(move |cx, event| {
41054107
if let Some(ch) = event.char() {
4106-
cx.editor.selected_register.select(ch);
4108+
cx.editor.selected_register = Some(ch);
41074109
}
41084110
})
41094111
}

helix-term/src/ui/editor.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,7 @@ impl EditorView {
710710
// debug_assert!(cxt.count != 0);
711711

712712
// set the register
713-
cxt.selected_register = cxt.editor.selected_register.take();
713+
cxt.register = cxt.editor.selected_register.take();
714714

715715
self.handle_keymap_event(mode, cxt, event);
716716
if self.keymaps.pending().is_empty() {
@@ -887,9 +887,9 @@ impl EditorView {
887887
impl Component for EditorView {
888888
fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult {
889889
let mut cxt = commands::Context {
890-
selected_register: helix_view::RegisterSelection::default(),
891890
editor: &mut cx.editor,
892891
count: None,
892+
register: None,
893893
callback: None,
894894
on_next_key_callback: None,
895895
jobs: cx.jobs,

helix-term/src/ui/mod.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,23 @@ pub use spinner::{ProgressSpinners, Spinner};
2020
pub use text::Text;
2121

2222
use helix_core::regex::Regex;
23-
use helix_core::register::Registers;
2423
use helix_view::{Document, Editor, View};
2524

2625
use std::path::PathBuf;
2726

2827
pub fn regex_prompt(
2928
cx: &mut crate::commands::Context,
3029
prompt: std::borrow::Cow<'static, str>,
31-
fun: impl Fn(&mut View, &mut Document, &mut Registers, Regex) + 'static,
30+
history_register: Option<char>,
31+
fun: impl Fn(&mut View, &mut Document, Regex) + 'static,
3232
) -> Prompt {
3333
let (view, doc) = current!(cx.editor);
3434
let view_id = view.id;
3535
let snapshot = doc.selection(view_id).clone();
3636

3737
Prompt::new(
3838
prompt,
39-
None,
39+
history_register,
4040
|_input: &str| Vec::new(), // this is fine because Vec::new() doesn't allocate
4141
move |cx: &mut crate::compositor::Context, input: &str, event: PromptEvent| {
4242
match event {
@@ -56,12 +56,11 @@ pub fn regex_prompt(
5656
match Regex::new(input) {
5757
Ok(regex) => {
5858
let (view, doc) = current!(cx.editor);
59-
let registers = &mut cx.editor.registers;
6059

6160
// revert state to what it was before the last update
6261
doc.set_selection(view.id, snapshot.clone());
6362

64-
fun(view, doc, registers, regex);
63+
fun(view, doc, regex);
6564

6665
view.ensure_cursor_in_view(doc, cx.editor.config.scrolloff);
6766
}

helix-view/src/editor.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::{
33
graphics::{CursorKind, Rect},
44
theme::{self, Theme},
55
tree::Tree,
6-
Document, DocumentId, RegisterSelection, View, ViewId,
6+
Document, DocumentId, View, ViewId,
77
};
88

99
use futures_util::future;
@@ -73,7 +73,7 @@ pub struct Editor {
7373
pub tree: Tree,
7474
pub documents: SlotMap<DocumentId, Document>,
7575
pub count: Option<std::num::NonZeroUsize>,
76-
pub selected_register: RegisterSelection,
76+
pub selected_register: Option<char>,
7777
pub registers: Registers,
7878
pub theme: Theme,
7979
pub language_servers: helix_lsp::Registry,
@@ -111,7 +111,7 @@ impl Editor {
111111
tree: Tree::new(area),
112112
documents: SlotMap::with_key(),
113113
count: None,
114-
selected_register: RegisterSelection::default(),
114+
selected_register: None,
115115
theme: themes.default(),
116116
language_servers,
117117
syn_loader: config_loader,

helix-view/src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ pub mod graphics;
88
pub mod info;
99
pub mod input;
1010
pub mod keyboard;
11-
pub mod register_selection;
1211
pub mod theme;
1312
pub mod tree;
1413
pub mod view;
@@ -20,6 +19,5 @@ slotmap::new_key_type! {
2019

2120
pub use document::Document;
2221
pub use editor::Editor;
23-
pub use register_selection::RegisterSelection;
2422
pub use theme::Theme;
2523
pub use view::View;

helix-view/src/register_selection.rs

Lines changed: 0 additions & 48 deletions
This file was deleted.

0 commit comments

Comments
 (0)