aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main.rs35
1 files changed, 26 insertions, 9 deletions
diff --git a/src/main.rs b/src/main.rs
index 25458ed..75a6ebf 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -3,9 +3,25 @@ mod term;
use rope::Rope;
use std::ffi::{OsStr, OsString};
-use std::io::{Read, Write};
+use std::io::{Read, Stdin, Write};
use std::path::Path;
+const CTRL_Q: u8 = 17;
+
+fn read_key(stdin: &mut Stdin) -> Result<u8, String> {
+ let mut buf = vec![0; 1];
+ match stdin.read(&mut buf) {
+ Err(err) => {
+ return Err(format!("read input: {}", err));
+ }
+ Ok(0) => {
+ return Err(String::from("no input"));
+ }
+ _ => (),
+ }
+ return Ok(buf[0]);
+}
+
fn edit(file: &OsStr) -> Result<(), String> {
let _raw_handle = match term::raw() {
Some(h) => h,
@@ -36,15 +52,16 @@ fn edit(file: &OsStr) -> Result<(), String> {
let _ = stdout.flush();
let mut stdin = std::io::stdin();
- let mut buf = vec![0; 1];
- match stdin.read(&mut buf) {
- Err(err) => {
- return Err(format!("read input: {}", err));
+ loop {
+ let c = match read_key(&mut stdin) {
+ Ok(c) => c,
+ Err(err) => {
+ return Err(err);
+ }
+ };
+ if c == CTRL_Q {
+ break;
}
- Ok(0) => {
- return Err(String::from("no input"));
- }
- _ => (),
}
return Ok(());
}