Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I unbuffer input with the D programming language in linux?

By default you can't get the terminal input in Unix without waiting for the User to press enter. How can I get the input instantly? I am using gdc on debian Linux so I can't use ncurses. Thanks.

like image 313
Soren Van den berg Avatar asked Feb 28 '26 12:02

Soren Van den berg


1 Answers

ncurses is a good solution that should work on almost any linux installation with any compiler...

But if you don't want to use ncurses, there's a few other options:

  • My terminal.d offers it and works on most terminals, but not as many as ncurses (I'd say I cover 98% of typical setups but there's a LOT of variations out there and i didn't try to be as comprehensive as ncurses): https://github.com/adamdruppe/misc-stuff-including-D-programming-language-web-stuff/blob/master/terminal.d

Look near the bottom of the file for a version(Demo) void main(). RealTimeConsoleInput gives you an event loop with instant input and other info if you want it (mouse, resize, etc.).

  • You can also just change the terminal mode with the proper tcgetattr and tcsetattr calls and then do everything else normally. You'll want to import core.sys.posix.termios; and import core.sys.posix.unistd; for the functions, then the rest is done the same as in C.

Here's how to do that:

 termios old;
 tcgetattr(1, &old);
 scope(exit) tcsetattr(1, TCSANOW, &old); // put the terminal back to how it was
 auto n = old;
 n.c_lflag &= ~ICANON; // turn off canonical mode
 tcsetattr(1, TCSANOW, &n); // do the change

Then you can use the input instantly.

like image 55
Adam D. Ruppe Avatar answered Mar 03 '26 05:03

Adam D. Ruppe



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!