Moved the rest of file loading/saving into Buffer.

This commit is contained in:
Nathan Vegdahl 2015-02-07 23:35:25 -08:00
parent 8a077bf4d0
commit 2d50906f43
6 changed files with 15 additions and 116 deletions

View File

@ -3,9 +3,9 @@
use std::mem; use std::mem;
use std::old_path::Path; use std::old_path::Path;
use std::old_io::fs::File; use std::old_io::fs::File;
use std::old_io::{IoResult, BufferedReader}; use std::old_io::{IoResult, BufferedReader, BufferedWriter};
use self::line::Line; use self::line::{Line, line_ending_to_str};
use self::node::{BufferNode, BufferNodeGraphemeIter, BufferNodeLineIter}; use self::node::{BufferNode, BufferNodeGraphemeIter, BufferNodeLineIter};
use self::undo_stack::{UndoStack}; use self::undo_stack::{UndoStack};
use self::undo_stack::Operation::*; use self::undo_stack::Operation::*;
@ -84,6 +84,18 @@ impl Buffer {
return Ok(buf); return Ok(buf);
} }
pub fn save_to_file(&self, path: &Path) -> IoResult<()> {
let mut f = BufferedWriter::new(try!(File::create(path)));
for l in self.line_iter() {
let _ = f.write_str(l.as_str());
let _ = f.write_str(line_ending_to_str(l.ending));
}
return Ok(());
}

View File

@ -6,7 +6,6 @@ use formatter::LineFormatter;
use formatter::RoundingBehavior::*; use formatter::RoundingBehavior::*;
use std::old_path::Path; use std::old_path::Path;
use std::cmp::{min, max}; use std::cmp::{min, max};
use files::{save_buffer_to_file};
use string_utils::grapheme_count; use string_utils::grapheme_count;
use self::cursor::CursorSet; use self::cursor::CursorSet;
@ -85,7 +84,7 @@ impl<T: LineFormatter> Editor<T> {
pub fn save_if_dirty(&mut self) { pub fn save_if_dirty(&mut self) {
if self.dirty && self.file_path != Path::new("") { if self.dirty && self.file_path != Path::new("") {
let _ = save_buffer_to_file(&self.buffer, &self.file_path); let _ = self.buffer.save_to_file(&self.file_path);
self.dirty = false; self.dirty = false;
} }
} }

View File

@ -1,19 +0,0 @@
use std::old_io::{IoResult, BufferedWriter};
use std::old_io::fs::File;
use std::old_path::Path;
use buffer::line::{line_ending_to_str};
use buffer::Buffer as TextBuffer;
pub fn save_buffer_to_file(tb: &TextBuffer, path: &Path) -> IoResult<()> {
// TODO: make save atomic
let mut f = BufferedWriter::new(try!(File::create(path)));
for l in tb.line_iter() {
let _ = f.write_str(l.as_str());
let _ = f.write_str(line_ending_to_str(l.ending));
}
return Ok(());
}

View File

@ -107,93 +107,3 @@ pub trait LineFormatter {
} }
} }
//====================================================================
// UNIT TESTS
//====================================================================
//#[cfg(test)]
//mod tests {
// #![allow(unused_imports)]
// use buffer::line::{Line, LineGraphemeIter};
// use super::LineFormatter;
//
// pub struct TestLineFormatIter<'a> {
// grapheme_iter: LineGraphemeIter<'a>,
// f: &'a TestLineFormatter,
// pos: (usize, usize),
// }
//
// impl<'a> Iterator for TestLineFormatIter<'a> {
// type Item = (&'a str, (usize, usize), usize);
//
// fn next(&mut self) -> Option<(&'a str, (usize, usize), usize)> {
// if let Some(g) = self.grapheme_iter.next() {
// let pos = self.pos;
// self.pos = (pos.0, pos.1 + 1);
// return Some((g, pos, 1));
// }
// else {
// return None;
// }
// }
// }
//
// pub struct TestLineFormatter {
// tab_width: u8
// }
//
// impl TestLineFormatter {
// pub fn new() -> TestLineFormatter {
// TestLineFormatter {
// tab_width: 4,
// }
// }
// }
//
// impl<'a> LineFormatter<'a, TestLineFormatIter<'a>> for TestLineFormatter {
// fn single_line_height(&self) -> usize {
// 1
// }
//
// fn iter(&'a self, line: &'a Line) -> TestLineFormatIter<'a> {
// TestLineFormatIter {
// grapheme_iter: line.grapheme_iter(),
// f: self,
// pos: (0, 0),
// }
// }
// }
//
//
// #[test]
// fn simple_iterator() {
// let line = Line::new_from_str("Hello!");
// let mut f = TestLineFormatter::new();
// let mut iter = f.iter(&line);
//
// let (a,_,_) = iter.next().unwrap();
// assert_eq!(a, "H");
//
// let (a,_,_) = iter.next().unwrap();
// assert_eq!(a, "e");
//
// let (a,_,_) = iter.next().unwrap();
// assert_eq!(a, "l");
//
// let (a,_,_) = iter.next().unwrap();
// assert_eq!(a, "l");
//
// let (a,_,_) = iter.next().unwrap();
// assert_eq!(a, "o");
//
// let (a,_,_) = iter.next().unwrap();
// assert_eq!(a, "!");
//
// let a = iter.next();
// assert_eq!(a, None);
// }
//}//

View File

@ -21,7 +21,6 @@ use term_ui::formatter::ConsoleLineFormatter;
mod string_utils; mod string_utils;
mod buffer; mod buffer;
mod formatter; mod formatter;
mod files;
mod editor; mod editor;
mod term_ui; mod term_ui;
//mod font; //mod font;

View File

@ -25,6 +25,4 @@
- File opening by entering path - File opening by entering path
- UI that wraps editors, for split view. - UI that wraps editors, for split view.
- Persistent infinite undo - Persistent infinite undo
- Saving/loading files to/from buffers should be the Buffer's job, since it
knows its own internals and can optimize things better.
- "Projects" - "Projects"