Skip to content

Commit

Permalink
Cycled to end/beginning + no more matches msgs (helix-editor#3176)
Browse files Browse the repository at this point in the history
* Show status msg when next/prev cycles around

* Add msg when there is no wraparound

* Cleanup code

* Change msg to "Wrapped around document"
  • Loading branch information
A-Walrus authored and Shekhinah Memmel committed Dec 11, 2022
1 parent e5436a7 commit fec6ed8
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 24 deletions.
50 changes: 29 additions & 21 deletions helix-term/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1523,7 +1523,8 @@ fn select_regex(cx: &mut Context) {
"select:".into(),
Some(reg),
ui::completers::none,
move |view, doc, regex, event| {
move |editor, regex, event| {
let (view, doc) = current!(editor);
if !matches!(event, PromptEvent::Update | PromptEvent::Validate) {
return;
}
Expand All @@ -1544,7 +1545,8 @@ fn split_selection(cx: &mut Context) {
"split:".into(),
Some(reg),
ui::completers::none,
move |view, doc, regex, event| {
move |editor, regex, event| {
let (view, doc) = current!(editor);
if !matches!(event, PromptEvent::Update | PromptEvent::Validate) {
return;
}
Expand All @@ -1566,17 +1568,16 @@ fn split_selection_on_newline(cx: &mut Context) {
doc.set_selection(view.id, selection);
}

#[allow(clippy::too_many_arguments)]
fn search_impl(
doc: &mut Document,
view: &mut View,
editor: &mut Editor,
contents: &str,
regex: &Regex,
movement: Movement,
direction: Direction,
scrolloff: usize,
wrap_around: bool,
) {
let (view, doc) = current!(editor);
let text = doc.text().slice(..);
let selection = doc.selection(view.id);

Expand Down Expand Up @@ -1606,17 +1607,25 @@ fn search_impl(
Direction::Backward => regex.find_iter(&contents[..start]).last(),
};

if wrap_around && mat.is_none() {
mat = match direction {
Direction::Forward => regex.find(contents),
Direction::Backward => {
offset = start;
regex.find_iter(&contents[start..]).last()
}
if mat.is_none() {
if wrap_around {
mat = match direction {
Direction::Forward => regex.find(contents),
Direction::Backward => {
offset = start;
regex.find_iter(&contents[start..]).last()
}
};
editor.set_status("Wrapped around document");
} else {
editor.set_error("No more matches");
}
// TODO: message on wraparound
}

let (view, doc) = current!(editor);
let text = doc.text().slice(..);
let selection = doc.selection(view.id);

if let Some(mat) = mat {
let start = text.byte_to_char(mat.start() + offset);
let end = text.byte_to_char(mat.end() + offset);
Expand Down Expand Up @@ -1692,13 +1701,12 @@ fn searcher(cx: &mut Context, direction: Direction) {
.map(|comp| (0.., std::borrow::Cow::Owned(comp.clone())))
.collect()
},
move |view, doc, regex, event| {
move |editor, regex, event| {
if !matches!(event, PromptEvent::Update | PromptEvent::Validate) {
return;
}
search_impl(
doc,
view,
editor,
&contents,
&regex,
Movement::Move,
Expand All @@ -1714,7 +1722,7 @@ fn search_next_or_prev_impl(cx: &mut Context, movement: Movement, direction: Dir
let count = cx.count();
let config = cx.editor.config();
let scrolloff = config.scrolloff;
let (view, doc) = current!(cx.editor);
let (_, doc) = current!(cx.editor);
let registers = &cx.editor.registers;
if let Some(query) = registers.read('/').and_then(|query| query.last()) {
let contents = doc.text().slice(..).to_string();
Expand All @@ -1732,8 +1740,7 @@ fn search_next_or_prev_impl(cx: &mut Context, movement: Movement, direction: Dir
{
for _ in 0..count {
search_impl(
doc,
view,
cx.editor,
&contents,
&regex,
movement,
Expand Down Expand Up @@ -1837,7 +1844,7 @@ fn global_search(cx: &mut Context) {
.map(|comp| (0.., std::borrow::Cow::Owned(comp.clone())))
.collect()
},
move |_view, _doc, regex, event| {
move |_editor, regex, event| {
if event != PromptEvent::Validate {
return;
}
Expand Down Expand Up @@ -3813,7 +3820,8 @@ fn keep_or_remove_selections_impl(cx: &mut Context, remove: bool) {
if remove { "remove:" } else { "keep:" }.into(),
Some(reg),
ui::completers::none,
move |view, doc, regex, event| {
move |editor, regex, event| {
let (view, doc) = current!(editor);
if !matches!(event, PromptEvent::Update | PromptEvent::Validate) {
return;
}
Expand Down
7 changes: 4 additions & 3 deletions helix-term/src/ui/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ pub use tree::{Tree, TreeItem, TreeOp};

use helix_core::regex::Regex;
use helix_core::regex::RegexBuilder;
use helix_view::{Document, Editor, View};
use helix_view::Editor;

use std::path::PathBuf;

Expand Down Expand Up @@ -65,7 +65,7 @@ pub fn regex_prompt(
prompt: std::borrow::Cow<'static, str>,
history_register: Option<char>,
completion_fn: impl FnMut(&Editor, &str) -> Vec<prompt::Completion> + 'static,
fun: impl Fn(&mut View, &mut Document, Regex, PromptEvent) + 'static,
fun: impl Fn(&mut Editor, Regex, PromptEvent) + 'static,
) {
let (view, doc) = current!(cx.editor);
let doc_id = view.doc;
Expand Down Expand Up @@ -112,8 +112,9 @@ pub fn regex_prompt(
view.jumps.push((doc_id, snapshot.clone()));
}

fun(view, doc, regex, event);
fun(cx.editor, regex, event);

let (view, doc) = current!(cx.editor);
view.ensure_cursor_in_view(doc, config.scrolloff);
}
Err(err) => {
Expand Down

0 comments on commit fec6ed8

Please sign in to comment.