optimize highlight rendering
This commit is contained in:
parent
101f99c825
commit
689a45de36
@ -157,7 +157,7 @@ impl Document {
|
||||
|
||||
#[allow(clippy::indexing_slicing)]
|
||||
let current_row = &mut self.rows[at.y];
|
||||
let new_row = self.rows[at.y].split(at.x);
|
||||
let mut new_row = current_row.split(at.x);
|
||||
|
||||
current_row.highlight();
|
||||
new_row.highlight();
|
||||
|
@ -1,5 +1,6 @@
|
||||
use termion::color;
|
||||
|
||||
#[derive(PartialEq)]
|
||||
pub enum Type {
|
||||
None,
|
||||
Number,
|
||||
|
30
src/row.rs
30
src/row.rs
@ -27,31 +27,41 @@ impl Row {
|
||||
let start = cmp::min(start, end);
|
||||
|
||||
let mut result = String::new();
|
||||
let mut current_highlighting = &highlighting::Type::None;
|
||||
|
||||
#[allow(clippy::integer_arithmetic)]
|
||||
for grapheme in self.string[..]
|
||||
for (index, grapheme) in self.string[..]
|
||||
.graphemes(true)
|
||||
.enumerate()
|
||||
.skip(start)
|
||||
.take(end - start)
|
||||
{
|
||||
if let Some(c) = grapheme.chars().next() {
|
||||
let highlighting_type = self
|
||||
.highlighting
|
||||
.get(index)
|
||||
.unwrap_or(&highlighting::Type::None);
|
||||
|
||||
if highlighting_type != current_highlighting {
|
||||
current_highlighting = highlighting_type;
|
||||
|
||||
let start_highlight =
|
||||
format!("{}", termion::color::Fg(highlighting_type.to_color()));
|
||||
|
||||
result.push_str(&start_highlight[..]);
|
||||
}
|
||||
|
||||
if c == '\t' {
|
||||
result.push_str(" ");
|
||||
} else if c.is_ascii_digit() {
|
||||
result.push_str(
|
||||
&format!(
|
||||
"{}{}{}",
|
||||
color::Fg(color::Rgb(220, 163, 163)),
|
||||
c,
|
||||
color::Fg(color::Reset)
|
||||
)[..],
|
||||
);
|
||||
} else {
|
||||
result.push(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let end_highlight = format!("{}", termion::color::Fg(color::Reset));
|
||||
result.push_str(&end_highlight[..]);
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user