Инициализация NCurses без очистки экрана

Я пишу программу, похожую на оболочку. После запуска есть приглашение, и вы вводите некоторые команды, специфичные для приложения.

пока это работает просто отлично. Однако я хочу добавить поддержку истории команд, как в Bash, чтобы пользователь мог нажать стрелку вверх или вниз и увидеть ранее введенные команды.

Я включил библиотеку ncurses, и я сделал простой тест hello world с getch (), чтобы убедиться, что стрелки вверх и вниз сообщаются правильно.

меня беспокоит то, что, похоже, это требование, которое я вызываю initscr (), которое очистит экран, чтобы я мог использовать getch().

ИТАК, ВОПРОС:

кто-нибудь знает способ использовать функцию ncurses getch() без вызова initscr() первым? Если нет, Могу ли я сделать его не очистить экран? В принципе, я хочу, чтобы getch() действовал так же, как getchar (), если это имеет смысл.

спасибо вперед!

EDIT: я думаю, что лучшим примером этого является то, как Python работает в интерактивном режиме.

5 ответов


Curses хочет полностью контролировать экран и оптимизировать запись на экран, особенно по медленным последовательным линиям. Для этого он должен знать, что находится на экране, и единственный разумный способ сделать это с большинством терминалов-начать с пустого экрана и отслеживать, что вы пишете на терминал.

таким образом, я подозреваю, что (n)проклятия-неправильный инструмент для вашей оболочки. Вероятно, вам нужно спуститься на уровень абстракции и использовать terminfo и неблокирующие чтения от терминала (стандартный входной сигнал) вместо.

(Это не очень полезно. Извиняюсь.)


возможно, проще использовать такой интерфейс, как readline () вместо того, чтобы прибегать к полномасштабным ncurses.


вы можете просто позвонить в свою программу из whithin rlwrap и имеют функциональность без боли...


вот еще обсуждение об этом. Предлагаемые решения:

  1. "функция" filter () " позволяет использовать проклятия Как однострочную."
  2. " вы можете написать что-то эквивалентное в C, используя setupterm для получения терминальные данные и tparm, tputs для форматирования и вывода."

конечно, есть третий вариант, чтобы получить исходный код ncurses и изменить его, чтобы он больше не очищал экран.


рассматривали ли вы простой способ создания пользовательской записи terminfo или termcap, не имеющей последовательности для очистки экрана, а затем переключения настройки терминала на это право перед запуском программы? Вы также можете просто использовать newterm() и set_term() в ncurses. Раньше это было проще с termcap, так как вы могли включить другой терминал и переопределить некоторые из его возможностей.