Moved the rest of file loading/saving into Buffer.
This commit is contained in:
parent
8a077bf4d0
commit
2d50906f43
|
@ -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(());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
19
src/files.rs
19
src/files.rs
|
@ -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(());
|
|
||||||
}
|
|
|
@ -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);
|
|
||||||
// }
|
|
||||||
//}//
|
|
|
@ -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;
|
||||||
|
|
2
todo.md
2
todo.md
|
@ -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"
|
Loading…
Reference in New Issue
Block a user