aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src
diff options
context:
space:
mode:
authorA-Walrus2022-10-03 14:43:26 +0000
committerGitHub2022-10-03 14:43:26 +0000
commitf3958aa1fd4518aad0842e3015d991aadce1fd28 (patch)
tree519b79d2bbeac5eabb626d86f49c3ee68d6c02b8 /helix-term/src
parent2fac9e24e565e976a8af8d82a4b6f2755a82a074 (diff)
Cycled to end/beginning + no more matches msgs (#3176)
* Show status msg when next/prev cycles around * Add msg when there is no wraparound * Cleanup code * Change msg to "Wrapped around document"
Diffstat (limited to 'helix-term/src')
-rw-r--r--helix-term/src/commands.rs50
-rw-r--r--helix-term/src/ui/mod.rs7
2 files changed, 33 insertions, 24 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 264ab5bb..0a192b4a 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -1520,7 +1520,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;
}
@@ -1541,7 +1542,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;
}
@@ -1563,10 +1565,8 @@ 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,
@@ -1574,6 +1574,7 @@ fn search_impl(
scrolloff: usize,
wrap_around: bool,
) {
+ let (view, doc) = current!(editor);
let text = doc.text().slice(..);
let selection = doc.selection(view.id);
@@ -1603,17 +1604,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);
@@ -1689,13 +1698,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,
@@ -1711,7 +1719,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();
@@ -1729,8 +1737,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,
@@ -1834,7 +1841,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;
}
@@ -3773,7 +3780,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;
}
diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs
index ba809d9b..8ab15bff 100644
--- a/helix-term/src/ui/mod.rs
+++ b/helix-term/src/ui/mod.rs
@@ -26,7 +26,7 @@ pub use text::Text;
use helix_core::regex::Regex;
use helix_core::regex::RegexBuilder;
-use helix_view::{Document, Editor, View};
+use helix_view::Editor;
use std::path::PathBuf;
@@ -61,7 +61,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;
@@ -108,8 +108,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) => {