diff --git a/src/entrybox.cc b/src/entrybox.cc index abe680024c2a00e8db1e6b016783dae77df057e0..64b107efd5bb548128fda41d1b900837482a43b4 100644 --- a/src/entrybox.cc +++ b/src/entrybox.cc @@ -21,7 +21,13 @@ EntryBox::Entry::Entry(const std::string &content, std::functionkeyval == GDK_KEY_Up || key->keyval == GDK_KEY_KP_Up) { auto &history = entry_histories[get_placeholder_text()]; if(history.size() > 0) { - selected_history++; + if(selected_history == 0 && history.front() != get_text()) { + // This restores correct history behavior with find text initialized + // from a source view selection. + } + else { + selected_history++; + } if(selected_history >= history.size()) selected_history = history.size() - 1; set_text(history[selected_history]); diff --git a/src/source_base.cc b/src/source_base.cc index 6fca2d1df26823df32a3a56a94343304a10ebbbb..9484e0fb45dcef1e268b181a312bece61e3523bd 100644 --- a/src/source_base.cc +++ b/src/source_base.cc @@ -806,6 +806,14 @@ void Source::BaseView::paste() { scroll_to_cursor_delayed(this, false, false); } +std::string Source::BaseView::get_selected_text() { + Gtk::TextIter start, end; + if(!get_buffer()->get_selection_bounds(start, end)) { + return {}; + } + return get_buffer()->get_text(start, end); +} + void Source::BaseView::search_highlight(const std::string &text, bool case_sensitive, bool regex) { gtk_source_search_settings_set_case_sensitive(search_settings, case_sensitive); gtk_source_search_settings_set_regex_enabled(search_settings, regex); diff --git a/src/source_base.h b/src/source_base.h index 63cec202353366809ca6d3299d2fb0430cef598b..f5abf0070a13c3ad6f8e7029b6cdf4b4fa43b52b 100644 --- a/src/source_base.h +++ b/src/source_base.h @@ -64,6 +64,8 @@ namespace Source { void paste(); + std::string get_selected_text(); + void search_highlight(const std::string &text, bool case_sensitive, bool regex); void search_forward(); void search_backward(); diff --git a/src/window.cc b/src/window.cc index e3487a49644eda911c445a7552bb2bbce649894c..20bca22d5ae09047d32479f1463ac5a48cf05444 100644 --- a/src/window.cc +++ b/src/window.cc @@ -1446,6 +1446,12 @@ void Window::search_and_replace_entry() { }); auto search_entry_it = EntryBox::get().entries.begin(); search_entry_it->set_placeholder_text("Find"); + if(auto view = Notebook::get().get_current_view()) { + auto const selected = view->get_selected_text(); + if(!selected.empty()) { + search_entry_it->set_text(selected); + } + } if(auto view = Notebook::get().get_current_view()) { view->update_search_occurrences = [label_it](int number) { label_it->update(0, std::to_string(number));