Linie terminali systemu OS X nie przechodzą do przewijania

12

Mam problem, który pojawia się, gdy używasz terminala Mac OS X (TERM = xterm): czasami przechodzi w stan, w którym linie przewijające się od góry nie są dodawane do bufora przewijania. Nie używam screenlub podobny; jest to zwykła powłoka bash wewnątrz zakładki Terminal.

Nie robi tego natychmiast po otwarciu nowej karty. Wierzę, że to efekt uboczny czegoś, co uruchomiłem w zakładce problemu. Domyślam się, że ma to coś wspólnego z emulacją xterm, być może regionem przewijania.

Co nie zadziałało:

  • Miękki i twardy reset za pomocą menu Shell
  • Uruchamianie resetna karcie

Czy istnieje niezawodny sposób na zresetowanie terminala i / lub stanu xterm?

Czy ktoś może wyjaśnić, co się dzieje, nawet jeśli jedynym rozwiązaniem jest zamknięcie karty i otwarcie nowej?

Steve Madsen
źródło
Z jakiej wersji Mac OS X korzystasz? Czy masz bufor na czymś mniejszym niż „nieograniczony”, a brakujące linie są po prostu najstarszymi liniami, które wypadły z tylnego końca bufora?
Spiff
Mac OS X 10.6.2, a bufor wynosi 10 000 linii, jednak utracone linie to te przewijane tuż poza ekranem. Jeśli przewijam stronę o jeden ekran, linii tych nie ma, a ponieważ linie przewijają się u góry, najnowsza strona przewijania nigdy się nie zmienia.
Steve Madsen

Odpowiedzi:

19

Oznacza to, że terminal używa alternatywnego bufora ekranu. Istnieje ekran główny, który przewija się do dziennika przewijania, i ekran alternatywny, który nie. Programy „Pełny ekran” lub „zorientowane na ekran”, takie jak top, less, emacs, vim i screen domyślnie przełączają terminal na alternatywny ekran.

Każdy ekran ma własną zawartość i stan. Posiadanie alternatywnego ekranu pozwala programom przejąć cały ekran, a następnie przywrócić poprzednią zawartość po wyjściu, przełączając z powrotem na ekran główny.

Począwszy od systemu Mac OS X Lion 10.7, Terminal ma pozycję menu, za pomocą której można ręcznie przełączać ekrany:

Widok> Pokaż / ukryj alternatywny ekran

Ma to przede wszystkim na celu wyświetlanie lub kopiowanie tekstu z alternatywnego ekranu po wyjściu z programu „pełnoekranowego”. Xterm ma podobne polecenie.

Można go również użyć do ręcznego wymuszenia na programie użycia określonego ekranu, aby na przykład kontrolować, czy dane wyjściowe trafiają do dziennika przewijania. Jeśli jednak obecnie używasz programu, który jawnie przełącza się na alternatywny ekran, możesz go pomylić lub uzyskać nieoczekiwane wyniki, jeśli narzucisz go na główny ekran podczas działania programu, więc używaj go ostrożnie.

W zależności od programu może on mieć argument wiersza polecenia lub inny sposób skonfigurowania go do korzystania z ekranu głównego. np less -X.

Niektóre wpisy terminfo są specjalnie zaprojektowane w celu pomijania przy użyciu alternatywnego ekranu, np xterm1. TERM=xterm1 emacsuruchomi Emacsa na ekranie głównym. Nie polecam używać na xterm1stałe, ponieważ wyłącza wiele innych przydatnych funkcji w porównaniu do domyślnej xterm-256colorw Lionie.

Możesz także przełączać ekrany za pomocą tputpolecenia, aby wydawać sekwencje specjalne z wnętrza powłoki lub skryptu. tput smcupprzełącza na alternatywny ekran i tput rmcupprzełącza z powrotem na główny ekran.

Aby zobaczyć, który program jest obecnie uruchomiony, spójrz na nazwę programu wyświetlaną w oknie Terminala lub w tytule karty lub w oknie Inspektora ( Shell> Pokaż inspektora ). Ostatnim procesem na liście w Inspektorze jest (zwykle) bieżący program korzystający z ekranu. To właśnie musisz skonfigurować, aby zamiast tego używać głównego ekranu.

Chris Page
źródło
1
To brzmi jak bardzo obiecująca odpowiedź. Czy uzasadnione jest wytłumaczenie, że program może zakończyć się nienormalnie, pozostawiając aktywny ekran alternatywny?
Steve Madsen,
Jeśli wrócisz do powłoki po uruchomieniu programu „pełnoekranowego”, tak, jest to możliwe, chociaż większość popularnych programów, takich jak te, które wymieniłem, jest niezawodna w czyszczeniu po sobie. W przypadku awarii programu „pełnoekranowego” terminal może pozostać na alternatywnym ekranie. Powiedziałeś jednak, że próbowałeś Shell> Wyślij twardy reset , który obejmuje powrót do ekranu głównego. Jeśli to się powtórzy, możesz spróbować użyć tego polecenia, aby przełączyć się z powrotem:tput rmcup
Chris Page
Inną możliwością jest to, że program opuścił terminal z „regionem przewijania”. Istnieją kody, które każą terminalowi przewijać tylko podzakres linii podczas przewijania. Programy używają tego do wyświetlania na przykład linii stanu, które nie przewijają ekranu. Jeśli region przewijania nie zawiera górnego wiersza, tekst nie będzie przewijany do dziennika przewijania. Znów jednak powiedziałeś, że próbowałeś twardego resetu, który również powinien to wyczyścić.
Chris Page
2
W moim przypadku zdarzyło się, że zdarzyło się, że moja sshsesja na zdalnym komputerze nie powiodła się (upłynął limit czasu?), Kiedy byłem w viśrodku, najwyraźniej pozostawiając terminal na alternatywnym ekranie (ponieważ vinigdy nie dano szansy na wyczyszczenie). Następnie każda nowa sshsesja w tym samym terminalu wykazywałaby problem opisany przez OP, dopóki nie rozwiązałem problemu, wybierając pozycję Widok> Ukryj ekran alternatywny .
Hefajstos
Dziękujemy, Widok> Pokaż / Ukryj alternatywny ekran pomógł. Ma kombinację klawiszy, którą musiałem nieświadomie uderzyć i nie wiedziałem, co się stało ani jak cofnąć
aexl