gpt4 book ai didi

terminal - 如何为 Rust 终端应用程序启用可编辑的用户输入?

转载 作者:行者123 更新时间:2023-11-29 08:02:55 27 4
gpt4 key购买 nike

我正在用 Rust 中基于终端的经典 REPL 环境项目编写一个最小的 Lisp。

我如何通过箭头键读取用户输入,至少在他们按下 enter 之前允许他们在当前输入行上来回移动?理想情况下,我将能够扩展功能,包括像在任何终端或任何 REPL 中一样移动“返回”以检索旧输入。为清楚起见,这是行为的图像:

enter image description here

我玩过标准库的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com