Инициализация NCurses без очистки экрана
Я пишу программу, похожую на оболочку. После запуска есть приглашение, и вы вводите некоторые команды, специфичные для приложения.
пока это работает просто отлично. Однако я хочу добавить поддержку истории команд, как в Bash, чтобы пользователь мог нажать стрелку вверх или вниз и увидеть ранее введенные команды.
Я включил библиотеку ncurses, и я сделал простой тест hello world с getch (), чтобы убедиться, что стрелки вверх и вниз сообщаются правильно.
меня беспокоит то, что, похоже, это требование, которое я вызываю initscr (), которое очистит экран, чтобы я мог использовать getch().
ИТАК, ВОПРОС:
кто-нибудь знает способ использовать функцию ncurses getch() без вызова initscr() первым? Если нет, Могу ли я сделать его не очистить экран? В принципе, я хочу, чтобы getch() действовал так же, как getchar (), если это имеет смысл.
спасибо вперед!
EDIT: я думаю, что лучшим примером этого является то, как Python работает в интерактивном режиме.
5 ответов
Curses хочет полностью контролировать экран и оптимизировать запись на экран, особенно по медленным последовательным линиям. Для этого он должен знать, что находится на экране, и единственный разумный способ сделать это с большинством терминалов-начать с пустого экрана и отслеживать, что вы пишете на терминал.
таким образом, я подозреваю, что (n)проклятия-неправильный инструмент для вашей оболочки. Вероятно, вам нужно спуститься на уровень абстракции и использовать terminfo и неблокирующие чтения от терминала (стандартный входной сигнал) вместо.
(Это не очень полезно. Извиняюсь.)
возможно, проще использовать такой интерфейс, как readline () вместо того, чтобы прибегать к полномасштабным ncurses.
вы можете просто позвонить в свою программу из whithin rlwrap и имеют функциональность без боли...
вот еще обсуждение об этом. Предлагаемые решения:
- "функция" filter () " позволяет использовать проклятия Как однострочную."
- " вы можете написать что-то эквивалентное в C, используя setupterm для получения терминальные данные и tparm, tputs для форматирования и вывода."
конечно, есть третий вариант, чтобы получить исходный код ncurses и изменить его, чтобы он больше не очищал экран.
рассматривали ли вы простой способ создания пользовательской записи terminfo или termcap, не имеющей последовательности для очистки экрана, а затем переключения настройки терминала на это право перед запуском программы? Вы также можете просто использовать newterm() и set_term() в ncurses. Раньше это было проще с termcap, так как вы могли включить другой терминал и переопределить некоторые из его возможностей.