From 3ca0bda446fc7400825c08c091cf1e534ca8184e Mon Sep 17 00:00:00 2001 From: Dongdong Zhou Date: Sun, 24 Oct 2021 22:52:12 +0100 Subject: [PATCH] terminal paint find --- core/src/terminal.rs | 91 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 16 deletions(-) diff --git a/core/src/terminal.rs b/core/src/terminal.rs index df6722be..4fdda87b 100644 --- a/core/src/terminal.rs +++ b/core/src/terminal.rs @@ -238,7 +238,6 @@ fn toggle_visual(&mut self, visual_mode: VisualMode) { if !term.mode().contains(TermMode::VI) { term.toggle_vi_mode(); } - term.selection = None; let ty = match visual_mode { VisualMode::Normal => SelectionType::Simple, VisualMode::Linewise => SelectionType::Lines, @@ -956,6 +955,8 @@ fn paint(&mut self, ctx: &mut PaintCtx, data: &LapceTabData, env: &Env) { for item in content.display_iter { let point = item.point; let cell = item.cell; + let inverse = cell.flags.contains(Flags::INVERSE); + let x = point.column.0 as f64 * char_width; let y = (point.line.0 as f64 + content.display_offset as f64) * line_height; @@ -972,7 +973,6 @@ fn paint(&mut self, ctx: &mut PaintCtx, data: &LapceTabData, env: &Env) { fg = fg.with_alpha(0.66); } - let inverse = cell.flags.contains(Flags::INVERSE); if inverse { let fg_clone = fg.clone(); fg = bg; @@ -1016,20 +1016,80 @@ fn paint(&mut self, ctx: &mut PaintCtx, data: &LapceTabData, env: &Env) { fg = term_bg.clone(); } - let mut builder = ctx - .text() - .new_text_layout(cell.c.to_string()) - .font( - data.config.editor.font_family(), - data.config.editor.font_size as f64, - ) - .text_color(fg); - if bold { - builder = builder - .default_attribute(TextAttribute::Weight(FontWeight::BOLD)); + if cell.c != ' ' && cell.c != '\t' { + let mut builder = ctx + .text() + .new_text_layout(cell.c.to_string()) + .font( + data.config.editor.font_family(), + data.config.editor.font_size as f64, + ) + .text_color(fg); + if bold { + builder = builder + .default_attribute(TextAttribute::Weight(FontWeight::BOLD)); + } + let text_layout = builder.build().unwrap(); + ctx.draw_text(&text_layout, Point::new(x, y + y_shift)); + } + } + if let Some(search_string) = data.find.search_string.as_ref() { + if let Ok(dfas) = RegexSearch::new(search_string) { + let mut start = alacritty_terminal::index::Point::new( + alacritty_terminal::index::Line( + -(content.display_offset as i32), + ), + alacritty_terminal::index::Column(0), + ); + let end_line = + (start.line + term.screen_lines()).min(term.bottommost_line()); + let mut max_lines = (end_line.0 - start.line.0) as usize; + + while let Some(m) = term.search_next( + &dfas, + start, + Direction::Right, + Side::Left, + Some(max_lines), + ) { + let match_start = m.start(); + if match_start.line.0 < start.line.0 + || (match_start.line.0 == start.line.0 + && match_start.column.0 < start.column.0) + { + break; + } + let x = match_start.column.0 as f64 * char_width; + let y = (match_start.line.0 as f64 + + content.display_offset as f64) + * line_height; + let rect = Rect::ZERO.with_origin(Point::new(x, y)).with_size( + Size::new( + (m.end().column.0 - m.start().column.0 + + term.grid()[*m.end()].c.width().unwrap_or(1)) + as f64 + * char_width, + line_height, + ), + ); + ctx.stroke( + rect, + data.config + .get_color_unchecked(LapceTheme::TERMINAL_FOREGROUND), + 1.0, + ); + start = *m.end(); + if start.column.0 < term.last_column() { + start.column.0 += 1; + } else { + if start.line.0 < term.bottommost_line() { + start.column.0 = 0; + start.line.0 += 1; + } + } + max_lines = (end_line.0 - start.line.0) as usize; + } } - let text_layout = builder.build().unwrap(); - ctx.draw_text(&text_layout, Point::new(x, y + y_shift)); } } } @@ -1044,7 +1104,6 @@ impl EventProxy {} impl EventListener for EventProxy { fn send_event(&self, event: alacritty_terminal::event::Event) { - println!("terminal event proxy got event {:?}", event); match event { alacritty_terminal::event::Event::PtyWrite(s) => { println!("pyt write {}", s);