NCurses инициализация без очистки экрана - PullRequest
9 голосов
/ 17 марта 2009

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

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

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

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

Ладно, ТАК ВОПРОС:

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

Заранее спасибо!

РЕДАКТИРОВАТЬ: я думаю, лучший пример этого - как Python работает в интерактивном режиме.

Ответы [ 5 ]

9 голосов
/ 19 марта 2009

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

9 голосов
/ 17 марта 2009

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

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

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

5 голосов
/ 17 марта 2009

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

3 голосов
/ 17 марта 2009

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

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

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

0 голосов
/ 18 марта 2009

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

...