diff options
Diffstat (limited to '')
-rw-r--r-- | matrix-bin/src/repl.rs | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/matrix-bin/src/repl.rs b/matrix-bin/src/repl.rs index 1b5addc..f2964d4 100644 --- a/matrix-bin/src/repl.rs +++ b/matrix-bin/src/repl.rs @@ -1,9 +1,9 @@ use std::{io::Write, sync::atomic::Ordering}; use matrix::{value::Value, vm::Interupt}; -use rustyline::Config; +use rustyline::{Config, EditMode, ColorMode, Editor, CompletionType}; -use crate::State; +use crate::{State, helper::MatrixHelper}; pub struct Repl<'a> { state: State<'a> @@ -17,24 +17,39 @@ impl<'a> Repl<'a> { pub fn run(&mut self) { - let interupt = self.state.vm.interupt(); + let interupt = self.state.vm.borrow().interupt(); ctrlc::set_handler(move || { interupt.store(Interupt::KeyboardInterupt as usize, Ordering::SeqCst); }).unwrap(); let config = Config::builder() .check_cursor_position(true) + .completion_type(CompletionType::List) + .edit_mode(EditMode::Emacs) + .color_mode(if self.state.color { ColorMode::Enabled } else { ColorMode::Disabled }) .build(); - let mut rl = rustyline::DefaultEditor::with_config(config).unwrap(); + + let helper = MatrixHelper::new(self.state.vm.clone()); + + let mut rl = Editor::with_config(config).unwrap(); + rl.set_helper(Some(helper)); + loop { let Ok(line) = rl.readline(">> ") else { break; }; + if let Err(_) = rl.add_history_entry(&line) { + break; + }; match self.state.execute(line) { - Err(err) => crate::error(err), + Err(err) => crate::error(err, &self.state), Ok(val) => { if val != Value::Nil { - println!("{val}"); + if self.state.color { + println!("{val:#}"); + } else { + println!("{val}"); + } } } } |