Zapobiegaj zmianie rozmiaru ekranu GNU

21

Za każdym razem, gdy uruchamiam ekran (screen -A) lub próbuję połączyć się z już działającą sesją screen (screen -Ax), mój terminal zmienia rozmiar na 80 kolumn. Chcę zapobiec zmianie rozmiaru ekranu przez terminal.

Używam iTerm na Snow Leopard, a moje sesje ekranowe są na maszynie centos (używam bash jako mojej powłoki).

czarne skrzydło
źródło

Odpowiedzi:

30

Spróbuj dodać to (z /etc/screenrc) do ~/.screenrc:

# Change the xterm initialization string from is2=\E[!p\E[?3;4l\E[4l\E>
# (This fixes the "Aborted because of window size change" konsole symptoms found
#  in bug #134198)
termcapinfo xterm* 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'

Być może trzeba zmienić „xterm”, aby pasował do twojego $TERM.

termcapinfoLinii ustala is(ciąg ininitialization) dla każdego terminala nazwy zaczynające się od „terminalach” sekwencji kodów ewakuacji. \Ereprezentuje, escapea kody są następujące:

\E[r       - set scrolling region to default (full size of window)
\E[m       - reset all resources (keyboard) to their initial values
\E[2J      - Erase in Display (ED). 2 -> Erase All.
\E[H       - set cursor position to default (1, 1)
\E[?7h     - DEC Private Mode Set. 7 -> Wraparound Mode
\E[?1;4;6l - DEC Private Mode Reset. 1 -> Normal Cursor Keys; 4  -> Jump (Fast) Scroll; 6 -> Normal Cursor Mode

Zastąpiona linia miała następujące kody:

\E[!p      - Soft terminal reset
\E[?3;4l   - DEC Private Mode Reset. 3 -> 80 Column Mode; 4 -> Jump (Fast) Scroll
\E[4l      - Reset Mode. 4 -> Replace Mode
\E>        - Normal keypad

(źródło: Sekwencje kontrolne XTerm )

Dennis Williamson
źródło
dzięki! dodał tę odpowiedź do serverfault.com/questions/158508/…
Joshua D'Alton
Czy miałbyś coś przeciwko dekodowaniu linii termcapinfo?
Huckle,
2
@Huckle: Dodałem wyjaśnienie kodów ucieczki.
Dennis Williamson
1

Wyjaśnienie (i sugerowane odpowiedniki) ciągu inicjującego xterm nie jest całkowicie dokładne.

Począwszy od ciągu z opisu terminala xterm:

is2=\E[!p\E[?3;4l\E[4l\E>

mamy

CSI ! p   Soft terminal reset (DECSTR).
CSI ? Pm l
      DEC Private Mode Reset (DECRST).
...
        Ps = 3  -> 80 Column Mode (DECCOLM).
        Ps = 4  -> Jump (Fast) Scroll (DECSCLM).
CSI Pm l  Reset Mode (RM).
...
        Ps = 4  -> Replace Mode (IRM).
ESC >     Normal Keypad (DECKPNM).

Ale DECSTRresetuje kilka rzeczy, których nie znaleziono w zamianie:

  • kształt i wygląd kursora
  • zestawy znaków
  • inne tryby klawiaturowe związane z aplikacji / normalne tryby ( DECCKM, KAM, DECKPAM)
  • zawijanie (i odwracanie)
  • tryb początkowy

Ponadto nie usuwa ekranu.

Powodem używania DECSTR( od 1997 r. ) Jest utrzymanie rozmiarów termcap na tyle małych, aby mieściły się w limicie 1024 bajtów termcap.

Ustawienie screenpochodzi z pakietu Debian; raport o błędzie wymieniony w komentarzu to Debian # 134198 - screen: ma jakiś dziwny problem emulacji najbardziej zauważalny w irssi i konsoli od 2002 roku. screennie rozpoznaje tej sekwencji, a przy okazji konsola KDE nie implementuje tej sekwencji, jak widać w KDE # 134892 , a jednocześnie jego programiści stwierdzają w KDE # 145977 , że wolą nie używać innej TERMwartości niż xterm. Ponieważ niektórzy użytkownicy mogą chcieć opisu terminala, który pasuje do możliwości konsoli, jest to w ncurses konsole, np.

is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8

przeciw

is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l

Po usunięciu fałszywego przezroczystego ekranu odpowiednia część dostosowania ekranu to

is2=\E[r\E[m\E[?7h\E[?1;4;6l

więc to, co zostało pominięte, to (poza DECCOLM) \E[4l.

\E7I \E8w ciągu inicjującym zapisu / odczytu pozycji kursora podczas ustawiania marginesów przewijania. Podobnie jak w trybie wstawiania, niektórzy użytkownicy zauważą brak tej funkcji.

Celem dostosowania jest wyeliminowanie przełączania DECCOLM(kolumna 80/132), a praca po wycięciu ekranu i raczej starych dostosowaniach może nie działać, podobnie jak dostosowanie z opisu terminalu napisanego dla terminala.

Dalsza lektura:

Thomas Dickey
źródło