@@ -4,60 +4,81 @@ use crossterm::{
4 event::{self, read, Event, EventStream, KeyCode, KeyEvent},
4 event::{self, read, Event, EventStream, KeyCode, KeyEvent},
5 execute, queue, style,
5 execute, queue, style,
6 terminal::{self, disable_raw_mode, enable_raw_mode},
6 terminal::{self, disable_raw_mode, enable_raw_mode},
9use futures::{future::FutureExt, select, StreamExt};
8use futures::{future::FutureExt, select, StreamExt};
10use std::io::{self, stdout, Write};
9use std::io::{self, stdout, Write};
11use std::path::PathBuf;
10use std::path::PathBuf;
12use std::time::Duration;
11use std::time::Duration;
14−const HELP: &str = r#"
13+use anyhow::Error;
16− - Move cursor with h, j, k, l
15+use crate::{keymap, Args};
17−"#;
16+use helix_core::{Buffer, State};
19pub struct Editor {
18pub struct Editor {
20− file: PathBuf,
19+ state: Option<State>,
23impl Editor {
22impl Editor {
23+ pub fn new(mut args: Args) -> Result<Self, Error> {
24+ let mut editor = Editor { state: None };
26+ if let Some(file) = args.files.pop() {
33+ pub fn open(&mut self, path: PathBuf) -> Result<(), Error> {
34+ let buffer = Buffer::load(path)?;
35+ let state = State::new(buffer);
36+ self.state = Some(state);
24− pub async fn print_events() {
44+ pub async fn print_events(&mut self) {
25 let mut reader = EventStream::new();
45 let mut reader = EventStream::new();
46+ let keymap = keymap::default();
27 // Handle key events
51 // Handle key events
28 let mut event = reader.next().await;
52 let mut event = reader.next().await;
29 match event {
53 match event {
30− Some(Ok(x)) => {
54+ // TODO: handle resize events
31− if let Event::Key(KeyEvent {
55+ Some(Ok(Event::Key(KeyEvent {
32− code: KeyCode::Char(c),
56+ code: KeyCode::Char('q'),
37− 'h' => execute!(io::stdout(), cursor::MoveLeft(1)).unwrap(),
38− 'j' => execute!(io::stdout(), cursor::MoveDown(1)).unwrap(),
39− 'k' => execute!(io::stdout(), cursor::MoveUp(1)).unwrap(),
40− 'l' => execute!(io::stdout(), cursor::MoveRight(1)).unwrap(),
46− terminal::LeaveAlternateScreen
50− _ => println!("{:?}", x),
61+ Some(Ok(Event::Key(event))) => {
62+ // TODO: handle modes and sequences (`gg`)
63+ if let Some(command) = keymap.get(&event) {
64+ if let Some(state) = &mut self.state {
65+ // TODO: handle count other than 1
54 Some(Err(x)) => panic!(x),
75 Some(Err(x)) => panic!(x),
55 None => break,
76 None => break,
60− pub fn run() -> Result<()> {
81+ pub fn run(&mut self) -> Result<(), Error> {
61 enable_raw_mode()?;
82 enable_raw_mode()?;
63 let mut stdout = stdout();
84 let mut stdout = stdout();
@@ -81,7 +102,7 @@ impl Editor {
83 // No need to `run()`, now we can just block on the main future.
104 // No need to `run()`, now we can just block on the main future.
84− smol::block_on(Editor::print_events());
105+ smol::block_on(self.print_events());
86 // Send a shutdown signal.
107 // Send a shutdown signal.
@@ -93,6 +114,8 @@ impl Editor {
93 t.join().unwrap();
114 t.join().unwrap();
96− disable_raw_mode()
117+ disable_raw_mode()?;