Giter VIP home page Giter VIP logo

Comments (4)

jht5945 avatar jht5945 commented on June 29, 2024

I found a magic solution:

  1. add crate ctrlc, just cargo add ctrlc
  2. call ctrlc::set_handler before call dialoguer
let _ = ctrlc::set_handler(move || {
    // DO NOTHING
});
  1. process dialoguer error
use dialoguer::console::Term;
if dialoguer_result.is_err() {
    let _ = Term::stderr().show_cursor();
}

from dialoguer.

mike-lloyd03 avatar mike-lloyd03 commented on June 29, 2024

Thanks for this. It is a much better solution for me with a clap program than showing the cursor in set_handler. My example:

fn main() -> anyhow::Result<()> {
    // Ignore SIGINT so we can handle it ourselves
    ctrlc::set_handler(move || {}).expect("Error setting Ctrl-C handler");

    let app = App::parse();

    match &app.command {
        // Handle clap commands
    }
    .map_err(|e| {
        let _ = Term::stdout().show_cursor();
        e
    })
}

from dialoguer.

mitsuhiko avatar mitsuhiko commented on June 29, 2024

There are two challenges with dialoguer at the moment about this. The underlying console library is now quite decent at restoring terminal state in more cases, even in light of ctrl-c. However in dialoguer the cursor is explicitly hidden in many interactions which results in this sort of behavior.

It would be weird for console to try to install a ctrl-c handler though. One option would be to say the components do not hide the cursor but Term::read_key_no_cursor is added which is like read_key but does not show the cursor. This would result in similar behavior as we have today but it could safely restore the cursor in light of ctrl-c.

from dialoguer.

mitsuhiko avatar mitsuhiko commented on June 29, 2024

Playing with this a bit now I do wonder if it would not be a better solution to just provide a convenient way to reset the terminal on ctrl-c with a utility function.

fn main() -> anyhow::Result<()> {
    ctrlc::set_handler(|| console::reset_terminal(); };
    // ...
}

from dialoguer.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.