Wie bekommt man die Breite des Terminals in Haskell?
Dinge, die ich versucht habe
%Vor%Dies muss nur unix funktionieren.
Danke
Wenn Sie keine Abhängigkeit von ncurses wünschen, ist hier ein Wrapper der entsprechenden ioctl()
-Anforderung mit dem FFI, basierend auf der akzeptierten Antwort von Terminal-Breite in C bekommen?
TermSize.hsc
%Vor% Dies verwendet den hsc2hs
Präprozessor , um die richtigen Konstanten herauszufinden und Offsets basierend auf den C-Headern, anstatt sie hart zu codieren. Ich denke, es ist entweder mit GHC oder der Haskell Platform verpackt, also haben Sie die Chance, es bereits zu haben.
Wenn du Cabal benutzt, kannst du TermSize.hs
zu deiner .cabal
Datei hinzufügen und es wird automatisch wissen, wie man es aus TermSize.hsc
generiert. Andernfalls können Sie hsc2hs TermSize.hsc
manuell ausführen, um eine .hs
-Datei zu generieren, die Sie dann mit GHC kompilieren können.
Sie könnten hcurses verwenden. Sobald Sie die Bibliothek initialisiert haben, können Sie mit scrSize
die Anzahl der Zeilen und Spalten auf dem Bildschirm ermitteln.
Um System.Posix.IOCtl
zu verwenden, müssen Sie einen Datentyp definieren, der die TIOCGWINSZ
-Anforderung darstellt, die die folgende Struktur ausfüllt:
Sie müssen einen Haskell-Datentyp definieren, der diese Informationen enthält, und eine Instanz von Storable
machen:
Sie müssen jetzt einen Dummy-Datentyp erstellen, um Ihre Anfrage zu repräsentieren:
%Vor% Schließlich müssen Sie Ihre Anfrage eine Instanz von IOControl
eingeben und sie mit dem Datentyp Winsize
verknüpfen.
Sie müssen ??
durch die Konstante TIOCGWINSZ
in Ihren Header-Dateien ersetzen ( 0x5413
auf meinem System).
Nun können Sie ioctl
ausgeben. Dieser Befehl interessiert sich nicht für die Eingabedaten. Daher möchten Sie das ioctl'
-Formular verwenden:
Beachten Sie, dass die 1 sich auf STDOUT bezieht.
Puh!
Da Sie dies nur unter Unix benötigen, würde ich empfehlen:
resizeOutput <- readProcess "/usr/X11/bin/resize" [] ""
Und dann ein bisschen Parsing der Ausgabe. Dies ist möglicherweise nicht 100% portabel, aber ich glaube, dass Sie resize
mit Argumenten versehen können (überprüfen Sie vor allem -u
), damit Sie eine ziemlich konsistente Ausgabe erhalten.
Tags und Links haskell functional-programming console terminal ioctl