Терминальные текстовые редакторы, такие как emacs
, vim
, joe
или даже nano
, имеют возможность отображать произвольные элементы пользовательского интерфейса внутри командной строки без полного переписывания всего пользовательского интерфейса каждый раз, но переписывая то, что в настоящее время является их интерфейсом.Как реализован интерфейс пользовательских текстовых редакторов?
С регулярными выходными потоками вы можете использовать только возвращаемый символ '\r'
, чтобы перейти к началу текущей строки вывода и написать над ним, но из того, что я нашел, вы не можете вскакивать по нескольким линиям, cout << "\r\r\r\r\r\r";
имеет тот же эффект, как cout << '\r'
, поэтому все, за которым следует новая линия, очевидно, брошено в камень.
Другие приложения делают что-то подобное, например $dpkg-reconfigure ca-certificates
на Ubuntu или aptitude
графический менеджер пакетов. Они также рисуют контуры элементов интерфейса, которые, вероятно, являются просто специальными символами. Но все же им придется перезаписать несколько строк вывода консоли.
Как они это делают? Является ли поведение переносимым для платформ Windows?
Вероятно, реализация для каждого эмулятора терминала различна. –
@AndersonGreen Из того, что я прочитал, похоже, существуют escape-последовательности ANSI, которые позволяют установить курсор на терминал в произвольное положение. Curses или Ncurses обертывают эти последовательности в удобный интерфейс, поэтому вы можете написать более портативный код. – iFreilicht