@@ -1520,7 +1520,8 @@ fn select_regex(cx: &mut Context) {
1520 "select:".into(),
1520 "select:".into(),
1521 Some(reg),
1521 Some(reg),
1522 ui::completers::none,
1522 ui::completers::none,
1523− move |view, doc, regex, event| {
1523+ move |editor, regex, event| {
1524+ let (view, doc) = current!(editor);
1524 if !matches!(event, PromptEvent::Update | PromptEvent::Validate) {
1525 if !matches!(event, PromptEvent::Update | PromptEvent::Validate) {
@@ -1541,7 +1542,8 @@ fn split_selection(cx: &mut Context) {
1541 "split:".into(),
1542 "split:".into(),
1542 Some(reg),
1543 Some(reg),
1543 ui::completers::none,
1544 ui::completers::none,
1544− move |view, doc, regex, event| {
1545+ move |editor, regex, event| {
1546+ let (view, doc) = current!(editor);
1545 if !matches!(event, PromptEvent::Update | PromptEvent::Validate) {
1547 if !matches!(event, PromptEvent::Update | PromptEvent::Validate) {
@@ -1563,10 +1565,8 @@ fn split_selection_on_newline(cx: &mut Context) {
1563 doc.set_selection(view.id, selection);
1565 doc.set_selection(view.id, selection);
1566−#[allow(clippy::too_many_arguments)]
1567fn search_impl(
1568fn search_impl(
1568− doc: &mut Document,
1569+ editor: &mut Editor,
1570 contents: &str,
1570 contents: &str,
1571 regex: &Regex,
1571 regex: &Regex,
1572 movement: Movement,
1572 movement: Movement,
@@ -1574,6 +1574,7 @@ fn search_impl(
1574 scrolloff: usize,
1574 scrolloff: usize,
1575 wrap_around: bool,
1575 wrap_around: bool,
1577+ let (view, doc) = current!(editor);
1577 let text = doc.text().slice(..);
1578 let text = doc.text().slice(..);
1578 let selection = doc.selection(view.id);
1579 let selection = doc.selection(view.id);
@@ -1603,17 +1604,25 @@ fn search_impl(
1603 Direction::Backward => regex.find_iter(&contents[..start]).last(),
1604 Direction::Backward => regex.find_iter(&contents[..start]).last(),
1606− if wrap_around && mat.is_none() {
1608+ if wrap_around {
1607− mat = match direction {
1609+ mat = match direction {
1608− Direction::Forward => regex.find(contents),
1610+ Direction::Forward => regex.find(contents),
1609− Direction::Backward => {
1611+ Direction::Backward => {
1610− offset = start;
1612+ offset = start;
1611− regex.find_iter(&contents[start..]).last()
1613+ regex.find_iter(&contents[start..]).last()
1616+ editor.set_status("Wrapped around document");
1618+ editor.set_error("No more matches");
1614− // TODO: message on wraparound
1622+ let (view, doc) = current!(editor);
1623+ let text = doc.text().slice(..);
1624+ let selection = doc.selection(view.id);
1617 if let Some(mat) = mat {
1626 if let Some(mat) = mat {
1618 let start = text.byte_to_char(mat.start() + offset);
1627 let start = text.byte_to_char(mat.start() + offset);
1619 let end = text.byte_to_char(mat.end() + offset);
1628 let end = text.byte_to_char(mat.end() + offset);
@@ -1689,13 +1698,12 @@ fn searcher(cx: &mut Context, direction: Direction) {
1689 .map(|comp| (0.., std::borrow::Cow::Owned(comp.clone())))
1698 .map(|comp| (0.., std::borrow::Cow::Owned(comp.clone())))
1690 .collect()
1699 .collect()
1692− move |view, doc, regex, event| {
1701+ move |editor, regex, event| {
1693 if !matches!(event, PromptEvent::Update | PromptEvent::Validate) {
1702 if !matches!(event, PromptEvent::Update | PromptEvent::Validate) {
1696 search_impl(
1705 search_impl(
1699 &contents,
1707 &contents,
1701 Movement::Move,
1709 Movement::Move,
@@ -1711,7 +1719,7 @@ fn search_next_or_prev_impl(cx: &mut Context, movement: Movement, direction: Dir
1711 let count = cx.count();
1719 let count = cx.count();
1712 let config = cx.editor.config();
1720 let config = cx.editor.config();
1713 let scrolloff = config.scrolloff;
1721 let scrolloff = config.scrolloff;
1714− let (view, doc) = current!(cx.editor);
1722+ let (_, doc) = current!(cx.editor);
1715 let registers = &cx.editor.registers;
1723 let registers = &cx.editor.registers;
1716 if let Some(query) = registers.read('/').and_then(|query| query.last()) {
1724 if let Some(query) = registers.read('/').and_then(|query| query.last()) {
1717 let contents = doc.text().slice(..).to_string();
1725 let contents = doc.text().slice(..).to_string();
@@ -1729,8 +1737,7 @@ fn search_next_or_prev_impl(cx: &mut Context, movement: Movement, direction: Dir
1730 for _ in 0..count {
1738 for _ in 0..count {
1731 search_impl(
1739 search_impl(
1732− doc,
1740+ cx.editor,
1734 &contents,
1741 &contents,
1736 movement,
1743 movement,
@@ -1834,7 +1841,7 @@ fn global_search(cx: &mut Context) {
1834 .map(|comp| (0.., std::borrow::Cow::Owned(comp.clone())))
1841 .map(|comp| (0.., std::borrow::Cow::Owned(comp.clone())))
1835 .collect()
1842 .collect()
1837− move |_view, _doc, regex, event| {
1844+ move |_editor, regex, event| {
1838 if event != PromptEvent::Validate {
1845 if event != PromptEvent::Validate {
@@ -3773,7 +3780,8 @@ fn keep_or_remove_selections_impl(cx: &mut Context, remove: bool) {
3773 if remove { "remove:" } else { "keep:" }.into(),
3780 if remove { "remove:" } else { "keep:" }.into(),
3774 Some(reg),
3781 Some(reg),
3775 ui::completers::none,
3782 ui::completers::none,
3776− move |view, doc, regex, event| {
3783+ move |editor, regex, event| {
3784+ let (view, doc) = current!(editor);
3777 if !matches!(event, PromptEvent::Update | PromptEvent::Validate) {
3785 if !matches!(event, PromptEvent::Update | PromptEvent::Validate) {