作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 Rust 中基于终端的经典 REPL 环境项目编写一个最小的 Lisp。
我如何通过箭头键读取用户输入,至少在他们按下 enter
之前允许他们在当前输入行上来回移动?理想情况下,我将能够扩展功能,包括像在任何终端或任何 REPL 中一样移动“返回”以检索旧输入。为清楚起见,这是行为的图像:
我玩过标准库的 io
模块和 termion
crate,但还没有想出这个功能。
这是我目前的工作代码。除了按预期使用 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,
}
}
}
最佳答案
有趣的是,在其他地方没有更容易地建议一些基本/基本的 crate 来解决这样的问题,但值得庆幸的是 @kazemakase通过建议一个到目前为止我还没有找到的 crate 回答了这个问题:rustyline
对自述文件中的示例代码稍加编辑即可得到我想要的结果,包括历史记录、使用箭头键向左/向右导航的能力,甚至可以使用 ctrl-d、ctrl-c 等击键,家等等。这是与所问的问题相结合:
extern crate rustyline;
use rustyline::Editor;
use rustyline::error::ReadlineError;
fn main() {
println!("Rispy Version 0.0.1");
println!("Enter `quit()` to Exit");
let mut reader = Editor::<()>::new();
if let Err(_) = reader.load_history("rispy_history.txt") {
println!("No previous history.");
}
// continuous input
loop {
let readline = reader.readline("rispy>> ");
match readline {
Ok(line) => {
reader.add_history_entry(&line);
println!("input: {}", line);
},
Err(ReadlineError::Interrupted) => {
println!("CTRL-C");
println!("Goodbye");
break
}
Err(ReadlineError::Eof) => {
println!("CTRL-D");
println!("Goodbye");
break
},
Err(err) => {
println!("Error: {:?}", err);
break
}
}
}
reader.save_history("rispy_history.txt").unwrap();
}
关于terminal - 如何为 Rust 终端应用程序启用可编辑的用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46355457/
我是一名优秀的程序员,十分优秀!