--- /dev/null
+
+require("curses");
+
+function read_cmd()
+ curses.attron(curses.A_BOLD);
+ curses.addstr("Command: ");
+ curses.attron(underline);
+ local s = "";
+ while (true) do
+ local c = string.char(curses.getch());
+ if (c == '\n') then break; end
+ s = s .. c;
+ end
+ curses.attroff(underline);
+ curses.attroff(curses.A_BOLD);
+ curses.addch("\n");
+
+ return s;
+end
+
+
+curses.filter();
+curses.initscr();
+curses.cbreak();
+curses.keypad(curses.stdscr(), TRUE);
+
+if (curses.has_colors()) then
+ curses.start_color();
+ curses.init_pair(1, curses.COLOR_CYAN, curses.COLOR_BLACK);
+ underline = curses.COLOR_PAIR(1);
+else
+ underline = curses.A_UNDERLINE;
+end
+
+while (true) do
+ local s = read_cmd();
+ if (s == "exit") then break; end
+ curses.reset_shell_mode();
+ io.write("\n");
+ io.flush(io.stdout);
+ os.execute(s);
+ curses.reset_prog_mode();
+ curses.touchwin(curses.stdscr());
+ curses.erase();
+ curses.refresh();
+end
+
+curses.endwin();
+