2009-03-17 5 views
9

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

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

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

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

ХОРОШО Таким образом возникает вопрос:

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

Заранее благодарен!

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

ответ

8

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

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

(Это не очень полезно. К сожалению.)

5

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

3

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

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

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

+0

Эта ссылка дает 404 Not Found. :-( –

+0

Отредактировано.К сожалению, Wayback Machine имеет только одну версию, содержащую 404. Спасибо за сообщение мертвой ссылки. – schnaader

+0

Just Googling для темы обсуждения обсуждал, что обсуждение архивировано на более стабильном URL-адресе, отредактированном для повторного введения ссылки. –

0

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

+0

Это действительно уродливый взлом и не приведет к применению приложения, которое можно использовать в системах конечных пользователей. –

+0

Это вздор. Вы можете установить TERMINFO в среде процесса, а установить настраиваемую базу данных TERMINFO по альтернативному пути с небольшим количеством записей во время установки. Затем вы устанавливаете переменную TERM в соответствующую запись . Теоретически возможно сделать это автоматически во время выполнения, используя утилиты terminfo для компиляции альтернативной записи terminfo , хранящейся в нестандартном местоположении, на которое указывает TERMINFO. Если вы это сделаете во время выполнения, вы можете даже основать зараженную запись на текущем терминале. Это некрасиво, но это не так плохо, как вы утверждаете. –

8

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

+0

ncurses и readline имеют разные лицензии. Обязательно проверьте сначала! – sdgfsdh