Woher kennt Less die Terminalauflösung?

Woher kennt Less die Terminalauflösung?

Jedes Mal, wenn jemand eine andere Größe für eine virtuelle Konsole einstellt, lesserkennt er die Fensterauflösung (das nehme ich an ...); dementsprechend ändert sich, wie viele Textzeilen angezeigt werden sollen. Wie wird dieser Parameter berechnet?

Antwort1

Wenn Sie nach einer Möglichkeit suchen, die Prüfung über ein Skript durchzuführen, haben Sie folgende Möglichkeiten:

  • Führen Sie tput colsund aus tput lines, wie manatwork vorschlägt
  • Überprüfen Sie die Werte von $LINES und $COLUMNS

Aber wenn Sie die Einzelheiten wissen möchten, hier sind sie:

Für virtuelle Terminals (xterm usw.) gibt es einen ioctl()Systemaufruf, der Ihnen die Fenstergröße mitteilt. Wenn möglich, lesswird dieser Aufruf verwendet. Wenn Sie die Fenstergröße ändern, erhält außerdem alles, was in diesem Fenster ausgeführt wird, ein SIGWINCHSignal, das Sie darüber lessinformiert, dass es nach einer neuen Fenstergröße suchen soll. Ich habe beispielsweise einen lesslaufenden gestartet (mit der Prozess-ID 16663), mich mit ihm verbunden straceund die Fenstergröße geändert. Das ist, was ich gesehen habe:

$ strace -p 16663
Process 16663 attached - interrupt to quit
read(3, 0xbfb1f10f, 1)                  = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
rt_sigaction(SIGWINCH, {0x805cf10, [WINCH], SA_RESTART}, {0x805cf10, [WINCH], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(2, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0

Dies ist auch das, was tput colssie tput lineshinter den Kulissen tun, wenn sie können. Weitere Informationen zu dieser Methode finden Sie unter man tty-ioctlTIOCGWINSZ. Suchen Sie dort nach TIOCGWINSZ.

Bei anderen Terminals, beispielsweise solchen, die an serielle Schnittstellen angeschlossen sind, gibt es jedoch keine Möglichkeit, diese Informationen direkt abzurufen. In diesem Fall lessbeginnt man mit der Suche nach Hinweisen in den Umgebungsvariablen.

  • LINESund COLUMNSwird oft auf die Terminalabmessungen eingestellt. Wenn bashoder zshdie Terminalabmessungen ermitteln kann, werden diese Variablen automatisch selbst eingestellt, damit auch weniger clevere Programme die Terminalgröße leicht erkennen können. Die meisten anderen Shells, einschließlich dashund tcsh, setzen diese Variablen jedoch nicht.
  • TERMwird normalerweise auf den Terminaltyp eingestellt. In diesem Fall kann die Terminfo-Datenbank die erwartete Größe des Terminals enthalten. Wenn tput rowsIOCTL nicht verwendet werden kann (beispielsweise wenn Sie über einen seriellen Port verbunden sind), wird auf die hier aufgezeichneten Werte zurückgegriffen. Bei einem Terminal, dessen Größe sich ändern kann, ist dies nur eine Schätzung und wahrscheinlich falsch.

Weitere Informationen finden Sie man tputunter Befehl zur Steuerung des Terminals und man terminfounter einer Liste der Befehle, die Sie dem Terminal erteilen können.

Antwort2

Wenn Sie einen Blick auf den Quellcode werfen, werden Sie lessAufrufe ioctl()zum Abrufen der Fenstergröße unter Linux kennen.

#ifdef TIOCGWINSZ
    {
        struct winsize w;
        if (ioctl(2, TIOCGWINSZ, &w) == 0)
        {
            if (w.ws_row > 0)
                sys_height = w.ws_row;
            if (w.ws_col > 0)
                sys_width = w.ws_col;
        }
    }
#else
#ifdef WIOCGETD
    {
        struct uwdata w;
        if (ioctl(2, WIOCGETD, &w) == 0)
        {
            if (w.uw_height > 0)
                sys_height = w.uw_height / w.uw_vs;
            if (w.uw_width > 0)
                sys_width = w.uw_width / w.uw_hs;
        }
    }
#endif

Antwort3

Ich bin nicht sicher, ob dies die Informationen sind, nach denen Sie suchen. Ich vermute, es lessregistriert einen Signalhandler für SIGWINCH. Wenn sich die Dimension des Terminals ändert, erhält es ein SIGWINCHSignal und prüft die TTY-Informationen für die aktuelle Dimension des Terminals. http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html

verwandte Informationen