aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src
diff options
context:
space:
mode:
Diffstat (limited to 'helix-term/src')
-rw-r--r--helix-term/src/editor.rs58
1 files changed, 34 insertions, 24 deletions
diff --git a/helix-term/src/editor.rs b/helix-term/src/editor.rs
index 1ce5c8f6..65024374 100644
--- a/helix-term/src/editor.rs
+++ b/helix-term/src/editor.rs
@@ -3,7 +3,7 @@ use crossterm::{
cursor::position,
event::{self, read, Event, EventStream, KeyCode, KeyEvent},
execute, queue,
- style::Print,
+ style::{Color, Print, SetForegroundColor},
terminal::{self, disable_raw_mode, enable_raw_mode},
};
use futures::{future::FutureExt, select, StreamExt};
@@ -16,25 +16,37 @@ use anyhow::Error;
use crate::{keymap, Args};
use helix_core::{Buffer, State};
-pub struct View<'a> {
+pub struct BufferComponent<'a> {
x: u16,
y: u16,
- contents: &'a str,
+ contents: Vec<&'a str>,
}
-impl View<'_> {
+impl BufferComponent<'_> {
pub fn render(&self) {
- execute!(
- stdout(),
- cursor::MoveTo(self.x, self.y),
- Print(self.contents)
- );
+ let mut line_count = 0;
+ for line in &self.contents {
+ execute!(
+ stdout(),
+ SetForegroundColor(Color::DarkCyan),
+ cursor::MoveTo(self.x, self.y + line_count),
+ Print((line_count + 1).to_string())
+ );
+ execute!(
+ stdout(),
+ SetForegroundColor(Color::Reset),
+ cursor::MoveTo(self.x + 2, self.y + line_count),
+ Print(line)
+ )
+ .unwrap();
+ line_count += 1;
+ }
}
}
pub struct Editor {
state: Option<State>,
- current_line: u16,
+ first_line: u16,
size: (u16, u16),
}
@@ -42,7 +54,7 @@ impl Editor {
pub fn new(mut args: Args) -> Result<Self, Error> {
let mut editor = Editor {
state: None,
- current_line: 0,
+ first_line: 0,
size: terminal::size().unwrap(),
};
@@ -65,19 +77,17 @@ impl Editor {
match &self.state {
Some(s) => {
- for line in s
- .file()
- .lines_at(self.current_line as usize)
- .take(self.size.1 as usize)
- {
- let view = View {
- x: 0,
- y: self.current_line,
- contents: line.as_str().unwrap(),
- };
- view.render();
- self.current_line += 1;
- }
+ let view = BufferComponent {
+ x: 0,
+ y: self.first_line,
+ contents: s
+ .file()
+ .lines_at(self.first_line as usize)
+ .take(self.size.1 as usize)
+ .map(|x| x.as_str().unwrap())
+ .collect::<Vec<&str>>(),
+ };
+ view.render();
}
None => (),
}