aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src
diff options
context:
space:
mode:
Diffstat (limited to 'helix-term/src')
-rw-r--r--helix-term/src/commands.rs27
-rw-r--r--helix-term/src/keymap.rs1
-rw-r--r--helix-term/src/ui/editor.rs1
3 files changed, 23 insertions, 6 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 53ec2fbf..98e8b20c 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -608,9 +608,10 @@ pub fn split_selection_on_newline(cx: &mut Context) {
// I'd probably collect all the matches right now and store the current index. The cache needs
// wiping if input happens.
-fn _search(doc: &mut Document, view_id: ViewId, contents: &str, regex: &Regex) {
+fn _search(doc: &mut Document, view_id: ViewId, contents: &str, regex: &Regex, extend: bool) {
let text = doc.text();
- let start = doc.selection(view_id).cursor();
+ let selection = doc.selection(view_id);
+ let start = selection.cursor();
// use find_at to find the next match after the cursor, loop around the end
let mat = regex
@@ -619,7 +620,13 @@ fn _search(doc: &mut Document, view_id: ViewId, contents: &str, regex: &Regex) {
if let Some(mat) = mat {
let start = text.byte_to_char(mat.start());
let end = text.byte_to_char(mat.end());
- let selection = Selection::single(start, end - 1);
+
+ let selection = if extend {
+ selection.clone().add(Range::new(start, end - 1))
+ } else {
+ Selection::single(start, end - 1)
+ };
+
// TODO: (first_match, regex) stuff in register?
doc.set_selection(view_id, selection);
};
@@ -639,7 +646,7 @@ pub fn search(cx: &mut Context) {
let prompt = ui::regex_prompt(cx, "search:".to_string(), move |doc, regex| {
let text = doc.text();
let start = doc.selection(view_id).cursor();
- _search(doc, view_id, &contents, &regex);
+ _search(doc, view_id, &contents, &regex, false);
// TODO: only store on enter (accept), not update
register::set('\\', vec![regex.as_str().to_string()]);
@@ -648,17 +655,25 @@ pub fn search(cx: &mut Context) {
cx.push_layer(Box::new(prompt));
}
-pub fn search_next(cx: &mut Context) {
+pub fn _search_next(cx: &mut Context, extend: bool) {
if let Some(query) = register::get('\\') {
let query = query.first().unwrap();
let view_id = cx.view_id;
let doc = cx.doc();
let contents = doc.text().slice(..).to_string();
let regex = Regex::new(&query).unwrap();
- _search(doc, view_id, &contents, &regex);
+ _search(doc, view_id, &contents, &regex, extend);
}
}
+pub fn search_next(cx: &mut Context) {
+ _search_next(cx, false);
+}
+
+pub fn extend_search_next(cx: &mut Context) {
+ _search_next(cx, true);
+}
+
pub fn search_selection(cx: &mut Context) {
let (view, doc) = cx.current();
let contents = doc.text().slice(..);
diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs
index 06b190aa..e20c8ebf 100644
--- a/helix-term/src/keymap.rs
+++ b/helix-term/src/keymap.rs
@@ -199,6 +199,7 @@ pub fn default() -> Keymaps {
key!('/') => commands::search,
// ? for search_reverse
key!('n') => commands::search_next,
+ shift!('N') => commands::extend_search_next,
// N for search_prev
key!('*') => commands::search_selection,
diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs
index d32f7864..35693d7b 100644
--- a/helix-term/src/ui/editor.rs
+++ b/helix-term/src/ui/editor.rs
@@ -61,6 +61,7 @@ impl EditorView {
view.area.width - OFFSET,
view.area.height.saturating_sub(1),
); // - 1 for statusline
+
self.render_buffer(doc, view, area, surface, theme, is_focused);
// if we're not at the edge of the screen, draw a right border