diff --git a/README.md b/README.md index c215a40..997c88e 100644 --- a/README.md +++ b/README.md @@ -198,6 +198,7 @@ statusbar_progress = "green" statusbar_bg = "green" cmdline = "light white" cmdline_bg = "black" +search_match = "light red" ``` More examples can be found in pull request diff --git a/src/config.rs b/src/config.rs index 8119f40..7a05461 100644 --- a/src/config.rs +++ b/src/config.rs @@ -49,6 +49,7 @@ pub struct ConfigTheme { pub statusbar_bg: Option, pub cmdline: Option, pub cmdline_bg: Option, + pub search_match: Option, } lazy_static! { diff --git a/src/theme.rs b/src/theme.rs index d4e6515..9804dce 100644 --- a/src/theme.rs +++ b/src/theme.rs @@ -49,6 +49,7 @@ pub fn load(cfg: &Config) -> Theme { ); palette.set_color("cmdline", load_color!(cfg, cmdline, TerminalDefault)); palette.set_color("cmdline_bg", load_color!(cfg, cmdline_bg, TerminalDefault)); + palette.set_color("search_match", load_color!(cfg, search_match, Light(Red))); Theme { shadow: false, diff --git a/src/ui/listview.rs b/src/ui/listview.rs index 5f79987..027c165 100644 --- a/src/ui/listview.rs +++ b/src/ui/listview.rs @@ -95,6 +95,7 @@ pub struct ListView { content: Arc>>, last_content_len: usize, selected: usize, + search_query: String, search_indexes: Vec, search_selected_index: usize, last_size: Vec2, @@ -110,6 +111,7 @@ impl ListView { content, last_content_len: 0, selected: 0, + search_query: String::new(), search_indexes: Vec::new(), search_selected_index: 0, last_size: Vec2::new(0, 0), @@ -237,6 +239,25 @@ impl View for ListView { printer.print((0, 0), &left); }); + // if line contains search query match, draw on top with + // highlight color + if self.search_indexes.contains(&i) { + let fg = *printer.theme.palette.custom("search_match").unwrap(); + let matched_style = ColorStyle::new(fg, style.back); + + let matches: Vec<(usize, usize)> = left + .to_lowercase() + .match_indices(&self.search_query) + .map(|i| (i.0, i.0 + i.1.len())) + .collect(); + + for m in matches { + printer.with_color(matched_style, |printer| { + printer.print((m.0, 0), &left[m.0..m.1]); + }); + } + } + // left string cut off indicator let max_length = center_offset.saturating_sub(1); if max_length < left.width() { @@ -421,6 +442,7 @@ impl ViewExt for ListView { } Command::Jump(mode) => match mode { JumpMode::Query(query) => { + self.search_query = query.to_lowercase(); self.search_indexes = self.get_indexes_of(query); self.search_selected_index = 0; match self.search_indexes.get(0) {