module examples.shell.spinner; import std.stdio; import core.thread; import core.time; import core.stdc.signal : signal, SIGINT; import core.stdc.stdio : fprintf, stderr; import core.stdc.stdlib : exit; // Обработчик сигнала Ctrl+C extern (C) void handleCtrlC(int sig) nothrow @nogc { // Используем fprintf для вывода в stderr fprintf(stderr, "\033[?25h\rInterrupted! \n"); exit(0); } void spinnerShell() { // Устанавливаем обработчик для SIGINT (Ctrl+C) signal(SIGINT, &handleCtrlC); // Расширенный набор брайлевских символов для плавной анимации immutable dchar[] spinner = [ '⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧' ]; ulong i = 0; // Скрываем курсор write("\033[?25l"); // Пример длительного процесса foreach (j; 0 .. 40) { // Выводим текущий символ спиннера writef("\rProcessing... %c", spinner[i]); // Сбрасываем буфер вывода stdout.flush(); // Переключаем символ спиннера i = (i + 1) % spinner.length; // Задержка для анимации Thread.sleep(dur!("msecs")(100)); } // Восстанавливаем курсор и очищаем строку write("\033[?25h\rDone! \n"); }