Open a file and display the first line
This commit is contained in:
parent
a67562b3a2
commit
4167088f81
@ -2,12 +2,24 @@
|
|||||||
use crate::helpers::*;
|
use crate::helpers::*;
|
||||||
|
|
||||||
use std::cmp::PartialEq;
|
use std::cmp::PartialEq;
|
||||||
|
use std::fs::File;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
use std::io::BufReader;
|
use std::io::BufReader;
|
||||||
|
|
||||||
|
use self::EditorKey::*;
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
pub struct EditorRow {
|
pub struct EditorRow {
|
||||||
row_chars: String,
|
chars: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl EditorRow {
|
||||||
|
pub fn new(str: &str) -> Self {
|
||||||
|
EditorRow {
|
||||||
|
chars: str.to_owned(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Main structure for the editor
|
/// Main structure for the editor
|
||||||
@ -48,8 +60,6 @@ impl EditorKey<char> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
use self::EditorKey::*;
|
|
||||||
|
|
||||||
// init
|
// init
|
||||||
impl Editor {
|
impl Editor {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
@ -57,6 +67,7 @@ impl Editor {
|
|||||||
let size = instance.get_window_size();
|
let size = instance.get_window_size();
|
||||||
instance.cursor_x = 0;
|
instance.cursor_x = 0;
|
||||||
instance.cursor_y = 0;
|
instance.cursor_y = 0;
|
||||||
|
instance.num_rows = 0;
|
||||||
instance.screen_cols = size.cols as usize;
|
instance.screen_cols = size.cols as usize;
|
||||||
instance.screen_rows = size.rows as usize;
|
instance.screen_rows = size.rows as usize;
|
||||||
|
|
||||||
@ -233,26 +244,35 @@ impl Editor {
|
|||||||
|
|
||||||
fn draw_rows(&mut self) {
|
fn draw_rows(&mut self) {
|
||||||
for y in 0..self.screen_rows {
|
for y in 0..self.screen_rows {
|
||||||
if y == (self.screen_rows / 3) {
|
if y >= self.num_rows {
|
||||||
let mut welcome = format!("Kilo editor -- version {}", env!("CARGO_PKG_VERSION"));
|
if y == (self.screen_rows / 3) {
|
||||||
if welcome.len() > self.screen_cols {
|
let mut welcome =
|
||||||
welcome.truncate(self.screen_cols)
|
format!("Kilo editor -- version {}", env!("CARGO_PKG_VERSION"));
|
||||||
}
|
if welcome.len() > self.screen_cols {
|
||||||
|
welcome.truncate(self.screen_cols)
|
||||||
|
}
|
||||||
|
|
||||||
// Center welcome message
|
// Center welcome message
|
||||||
let mut padding = (self.screen_cols - welcome.len()) / 2;
|
let mut padding = (self.screen_cols - welcome.len()) / 2;
|
||||||
if padding > 0 {
|
if padding > 0 {
|
||||||
|
self.append_out("~");
|
||||||
|
padding -= 1;
|
||||||
|
}
|
||||||
|
while padding > 0 {
|
||||||
|
self.append_out(" ");
|
||||||
|
padding -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.append_out(&welcome);
|
||||||
|
} else {
|
||||||
self.append_out("~");
|
self.append_out("~");
|
||||||
padding -= 1;
|
|
||||||
}
|
}
|
||||||
while padding > 0 {
|
|
||||||
self.append_out(" ");
|
|
||||||
padding -= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.append_out(&welcome);
|
|
||||||
} else {
|
} else {
|
||||||
self.append_out("~");
|
let mut output = self.row.chars.clone();
|
||||||
|
if output.len() > self.screen_cols {
|
||||||
|
output.truncate(self.screen_cols);
|
||||||
|
}
|
||||||
|
self.append_out(&output);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.append_out("\x1b[K");
|
self.append_out("\x1b[K");
|
||||||
@ -286,5 +306,22 @@ impl Editor {
|
|||||||
|
|
||||||
// File I/O
|
// File I/O
|
||||||
impl Editor {
|
impl Editor {
|
||||||
pub fn open(&mut self) {}
|
pub fn open(&mut self, filename: &str) -> io::Result<()> {
|
||||||
|
let file = File::open(filename)?;
|
||||||
|
let buf_reader = BufReader::new(file);
|
||||||
|
|
||||||
|
let mut lines = buf_reader.lines().map(|l| l.unwrap());
|
||||||
|
|
||||||
|
let line = lines.next().unwrap();
|
||||||
|
self.row = EditorRow::new(&line);
|
||||||
|
self.num_rows = 1;
|
||||||
|
|
||||||
|
/*for line in lines {
|
||||||
|
let
|
||||||
|
}*/
|
||||||
|
// let line_res = buf_reader.read_line()
|
||||||
|
// self.row = EditorRow::new("Hello, world!");
|
||||||
|
// self.num_rows += 1;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,13 @@ mod helpers;
|
|||||||
use crate::editor::Editor;
|
use crate::editor::Editor;
|
||||||
use crate::helpers::*;
|
use crate::helpers::*;
|
||||||
use libc::STDIN_FILENO;
|
use libc::STDIN_FILENO;
|
||||||
|
use std::env;
|
||||||
use std::io::Error;
|
use std::io::Error;
|
||||||
use std::result::Result;
|
use std::result::Result;
|
||||||
|
|
||||||
fn main() -> Result<(), Error> {
|
fn main() -> Result<(), Error> {
|
||||||
|
let args: Vec<String> = env::args().collect();
|
||||||
|
|
||||||
// Save original terminal flags
|
// Save original terminal flags
|
||||||
let original_termios = get_termios(STDIN_FILENO);
|
let original_termios = get_termios(STDIN_FILENO);
|
||||||
|
|
||||||
@ -17,6 +20,11 @@ fn main() -> Result<(), Error> {
|
|||||||
// Initialize the editor
|
// Initialize the editor
|
||||||
let mut editor = Editor::new();
|
let mut editor = Editor::new();
|
||||||
|
|
||||||
|
// Open the file if specified, from the command line
|
||||||
|
if args.len() >= 2 {
|
||||||
|
editor.open(&args[1])?;
|
||||||
|
}
|
||||||
|
|
||||||
// Main input loop. Editor::process_keypress uses an Option Enum as a sentinel.
|
// Main input loop. Editor::process_keypress uses an Option Enum as a sentinel.
|
||||||
// `None` is returned on a quit action, in other cases, `Some(())` is returned,
|
// `None` is returned on a quit action, in other cases, `Some(())` is returned,
|
||||||
// continuing the loop
|
// continuing the loop
|
||||||
|
Loading…
Reference in New Issue
Block a user