summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs14
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;