J'écris un Lisp minimal avec un projet d'environnement REPL basé sur un terminal classique dans Rust. Comment lire l'entrée utilisateur à l'aide des touches fléchées, en leur permettant d'avancer et de reculer sur leur ligne d'entrée actuelle au moins avant d'avoir appuyé sur enter
? Idéalement, je serai en mesure d'étendre les fonctionnalités pour inclure "revenir" pour récupérer les anciennes entrées comme vous le feriez dans n'importe quel terminal ou REPL. Voici une image du comportement pour plus de clarté:Comment activer l'entrée utilisateur modifiable pour une application de terminal Rust?
J'ai joué avec le module de bibliothèque standard io
et la caisse termion
mais n'ont pas compris cette fonctionnalité out.
Voici mon code de travail actuel. Il prend effectivement en entrée et l'imprime immédiatement à l'utilisateur en plus de quitter comme prévu avec quit()
.
use std::io::prelude::*;
use std::io;
fn main() {
println!("Rispy Version 0.0.1");
println!("Enter `quit()` to Exit");
let mut input: String;
// continuous input til ctrl-c or quit()
loop {
print!("rispy>> ");
io::stdout().flush().unwrap();
input = String::new();
io::stdin().read_line(&mut input)
.expect("Error reading line");
print!("input: {}", input);
match input.as_ref() {
"quit()\n" => {
println!("\nGoodbye");
break;
},
_ => continue,
}
}
}
La manière la plus simple serait d'utiliser une caisse existante. Par exemple, [readline] (https://crates.io/crates/readline) encapsule GNU readline, ou [rustyline] (https://crates.io/crates/rustyline) est une implémentation de rouille. – kazemakase
@kazemakase Voici la réponse. Vous devriez le poster comme une réponse réelle. – Boiethios
@Boiethios J'hésite à publier des liens vers des bibliothèques comme réponses parce que cela pourrait impliquer que la question est hors-sujet, bien qu'allumer une bibliothèque n'était pas l'intention du PO ... La façon dont j'ai lu la question du PO pourrait en fait * veulent * l'implémenter eux-mêmes. – kazemakase