Input 在铁锈中,什么';当存在默认值时,请求输入是一种很好的方法,应该可以使用空输入?

Input 在铁锈中,什么';当存在默认值时,请求输入是一种很好的方法,应该可以使用空输入?,input,terminal,rust,stdin,Input,Terminal,Rust,Stdin,我想请求用户输入,用户还应该能够指定一个空值,并且应该能够只使用默认值 Enter a value ("default"): 如果按enter键给出默认值default,则上述问题存在:用户将如何指定空字符串作为输入 我的一些想法是显示默认输入并允许用户在需要时退格,或者使用键盘快捷键使用默认值。在这两种方法中,我认为第一种更好,但我不知道如何实现它。我试着用几条板条箱来至少实现第二条,就像和一样,但我没能做到 使用交叉术语输入,我尝试了以下方法: let mut use_default =

我想请求用户输入,用户还应该能够指定一个空值,并且应该能够只使用默认值

Enter a value ("default"):
如果按enter键给出默认值
default
,则上述问题存在:用户将如何指定空字符串作为输入

我的一些想法是显示默认输入并允许用户在需要时退格,或者使用键盘快捷键使用默认值。在这两种方法中,我认为第一种更好,但我不知道如何实现它。我试着用几条板条箱来至少实现第二条,就像和一样,但我没能做到

使用
交叉术语输入
,我尝试了以下方法:

let mut use_default = false;
if let Ok(_raw) = RawScreen::into_raw_mode() {
    let input = input();
    let mut stdin = input.read_sync();

    if let Some(key_event) = stdin.next() {
        match key_event {
            InputEvent::Keyboard(k) => match k {
                KeyEvent::Ctrl(c) => match c {
                    if c == 'y' {
                        // use the default value
                        use_default = true;
                    }
                },
                _ => {},
            },
            _ => {},
        };
    }
}
let signals = Signals::new(&[SIGINT]).unwrap();

let mut use_default = false;
thread::spawn(move || {
    for sig in signals.forever() {
        println!("Received signal {:?}", sig);
        use_default = true;
    }
});
这确实可以正确识别ctrl+y,但当它进入原始模式时,其他按键也会被忽略,直到
\u raw
超出范围。 使用
信号钩
,我尝试了以下方法:

let mut use_default = false;
if let Ok(_raw) = RawScreen::into_raw_mode() {
    let input = input();
    let mut stdin = input.read_sync();

    if let Some(key_event) = stdin.next() {
        match key_event {
            InputEvent::Keyboard(k) => match k {
                KeyEvent::Ctrl(c) => match c {
                    if c == 'y' {
                        // use the default value
                        use_default = true;
                    }
                },
                _ => {},
            },
            _ => {},
        };
    }
}
let signals = Signals::new(&[SIGINT]).unwrap();

let mut use_default = false;
thread::spawn(move || {
    for sig in signals.forever() {
        println!("Received signal {:?}", sig);
        use_default = true;
    }
});
但这只能识别ctrl+c,我想这是因为在给
Signals::new()
的数组中只有
SIGINT
。然后,我意识到,
signalhook
似乎只支持识别终端默认处理的信号


那么,什么是获得我想要的功能的好方法呢?

一如既往,展示您尝试过的解决方案是很好的,但如果您问XY问题,请展示实际问题的代码,而不是展示您试图解决第一个问题的问题的代码。目前你的问题很混乱。@Stargateur我没有真正解决问题的代码;我只是有一个问题,我尝试了解决方案的代码。。。请告诉我我还应该包括什么!你的问题自相矛盾。在提交空值的同时,用户如何指示使用默认值?@TheIncorrigible1在我给出的示例解决方案中,默认值存在,但用户可以将其退格以提交空值,这将起作用。为什么它会自相矛盾?在任何一种情况下,用户只提交一个空值、默认值或其他自定义值。@Cubetastic在通过键绑定提交默认值的同时拥有一个空值的目的是什么?这是上面提到的“XY问题”。