2009-03-17 5 views
9

Piszę program podobny do powłoki. Po uruchomieniu pojawia się monit i wpisujesz niektóre polecenia specyficzne dla aplikacji.Inicjalizacja NCurses bez czyszczenia ekranu

Na razie to działa dobrze. Jednak chcę dodać obsługę historii poleceń, tak jak w Bash, aby użytkownik mógł nacisnąć strzałkę w górę lub w dół i zobaczyć wcześniej wprowadzone polecenia.

Dołączyłem bibliotekę ncurses, a ja wykonałem prosty test z użyciem getch(), aby upewnić się, że strzałki w górę i w dół są poprawnie zgłaszane.

Rzeczą, która mnie dręczy, jest to, że wydaje mi się, że muszę wywołać metodę initscr(), która wyczyści ekran, aby móc używać getch().

Dobrze więc pytanie brzmi:

Czy ktoś zna sposób na wykorzystanie funkcji ncurses getch() bez wywoływania initscr() w pierwszej kolejności? Jeśli nie, czy mogę sprawić, że nie wyczyści ekranu? Zasadniczo, szukam, aby getch() działał tak samo jak getchar(), jeśli to ma sens.

Z góry dziękuję!

EDYCJA: Myślę, że najlepszym tego przykładem jest to, jak Python działa w trybie interaktywnym.

Odpowiedz

8

Curses chce w pełni kontrolować ekran i optymalizować zapisy na ekranie, szczególnie w przypadku wolnych linii szeregowych. Aby to zrobić, musi wiedzieć, co jest na ekranie, a jedynym rozsądnym sposobem, aby to zrobić w większości terminali, jest rozpoczęcie od pustego ekranu i śledzenie tego, co piszesz do terminala.

Podejrzewam, że (n) curses jest niewłaściwym narzędziem dla twojej powłoki. Prawdopodobnie musisz przejść krok w dół na warstwie abstrakcji i zamiast tego użyć terminfo i nieblokujących odczytów z terminala (standardowe wejście).

(To nie jest bardzo pomocne. Przepraszam.)

5

Możesz po prostu zadzwonić do programu z ciągu, rlwrap i mają funkcjonalność bez bólu ...

3

Oto kolejny discussion na ten temat. Dostarczone rozwiązania są następujące:

  1. "Funkcja" filter() "pozwala używać przekleństw jako pojedynczej linii."
  2. "Możesz napisać coś równoznacznego w C, używając setupterm, aby uzyskać dane terminala , a tparm, tputs dla formatowania i wyjścia."

Oczywiście istnieje trzecia opcja uzyskania kodu źródłowego ncurses i zmodyfikowania go, aby nie usuwał już ekranu.

+0

To łącze daje 404 nie znaleziono. :-( –

+0

Edytowane.Niestety, Wayback Machine ma tylko jedną wersję zawierającą już 404. Dziękujemy za zgłoszenie martwego łącza. – schnaader

+0

Po prostu logując się w temacie dyskusji, dyskusja została zarchiwizowana na bardziej stabilnym adresie URL, edytowanym w celu ponownego wprowadzenia linku. –

0

Czy rozważałeś prosty sposób tworzenia niestandardowego hasła terminfo lub termcap bez sekwencji, aby wyczyścić ekran, a następnie zmienić ustawienia terminala na to prawo przed uruchomieniem programu? Możesz także użyć newterm() i set_term() w ncurses. To było łatwiejsze z termcap, ponieważ mógłbyś dodać inny terminal i nadpisać niektóre jego możliwości.

+0

To naprawdę brzydki hack i nie spowoduje aplikacji, która może być użyta w systemach użytkowników końcowych. –

+0

To nonsens. Możesz ustawić TERMINFO w środowisku procesowym, a zainstalować dostosowaną bazę danych TERMINFO pod alternatywną ścieżką z małą liczbą pozycji w czasie instalacji . Następnie należy ustawić zmienną TERM na odpowiedni wpis . Teoretycznie można to zrobić automatycznie podczas działania, używając narzędzi terminfo do kompilacji alternatywnego wpisu terminfo , przechowywanego w niestandardowej lokalizacji wskazanej przez TERMINFO. Jeśli zrobisz to w czasie wykonywania, możesz nawet oprzeć zaufaną pozycję na bieżącym terminalu. Nie jest ładna, ale nie jest tak źle, jak twierdzisz. –

8

Może być prostsze korzystanie z interfejsu, takiego jak readline(), niż uciekanie się do pełnowymiarowych ncurses.

+0

ncurses i readline mają różne licencje. Pamiętaj, aby najpierw sprawdzić! – sdgfsdh