diff options
-rw-r--r-- | src/main.rs | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/main.rs b/src/main.rs index 527fb8c..8cfd680 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ use poem::{read::Readable, recite::Reciteable, Poem}; mod compose; use buffer::{getline, STDIN}; use compose::Environment; -use termios::{tcsetattr, Termios, ECHO, ICANON, TCSANOW}; +use termios::{tcsetattr, Termios, ECHO, ECHOE, ICANON, TCSANOW}; /// Starts the main shell loop /// @@ -33,16 +33,12 @@ fn repl( ) { // Setup termios flags let mut termios = Termios::from_fd(STDIN).unwrap(); - termios.c_lflag &= !(ICANON | ECHO); // Initial path refresh on startup env.bins = path::refresh(); // Main shell loop loop { - // Reset terminal using proper termios flags - tcsetattr(STDIN, TCSANOW, &mut termios).unwrap(); - // Clear the buffer buffer.lock().unwrap().clear(); @@ -59,6 +55,10 @@ fn repl( // At the prompt *away.lock().unwrap() = false; + // Unset ICANON and ECHO before the prompt + termios.c_lflag &= !(ICANON | ECHO); + tcsetattr(STDIN, TCSANOW, &mut termios).unwrap(); + // Wait for user input let bytes = getline(buffer, pos); @@ -78,6 +78,10 @@ fn repl( continue; } + // Set ICANON and ECHO for other programs after the prompt + termios.c_lflag |= ICANON | ECHO | ECHOE; + tcsetattr(STDIN, TCSANOW, &mut termios).unwrap(); + // Not at the prompt *away.lock().unwrap() = true; |