Get Terminal Breite Haskell

7

Wie bekommt man die Breite des Terminals in Haskell?

Dinge, die ich versucht habe

%Vor%

Dies muss nur unix funktionieren.

Danke

    
Bilal Syed Hussain 09.10.2012, 18:21
quelle

3 Antworten

13

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.

    
hammar 09.10.2012, 19:58
quelle
9

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:

%Vor%

Sie müssen einen Haskell-Datentyp definieren, der diese Informationen enthält, und eine Instanz von Storable machen:

%Vor%

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.

%Vor%

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:

%Vor%

Beachten Sie, dass die 1 sich auf STDOUT bezieht.

Puh!

    
pat 09.10.2012 18:35
quelle
3

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.

    
Levent Erkok 10.10.2012 04:04
quelle