2017-11-11 1 views
-1

Zum Beispiel; gehen Sie voran und öffnen Sie ein Terminalfenster und geben Sie ein:Wie schreibt man eine Befehlszeilenschnittstelle in Swift 4 mit Funktionen, die Unix-Manpages ähneln?

man ls 

Schauen Sie sich um; Beachten Sie, dass Sie durch den Text mit den Pfeiltasten nach oben und unten gehen können und dass der Terminalverlauf nun fehlt.

Mit "q" beenden.

Der Terminalverlauf wird jetzt zurückgegeben.

Ich versuche zu verstehen, wie eine Schnittstelle zu schreiben, die die oben tut: mit dem Terminal Geschichte verschwindenden und wieder erscheinen am Ausgang und vor allem mit der Schnittstelle Tastendrücke als Eingabe zu übernehmen in der Lage statt readline verwenden ().

Auf dem Bildschirm Clearing Front ich ein ANSI-Escape-Code haben es geschafft:

die den Bildschirm löscht und startet den Cursor von unten ist aber nur dann wirklich Zeilenumbrüche und schob den alten Inhalt aus dem Bildschirm Umsetzung Im Gegensatz zu den man-Seiten, die den scrollbaren Verlauf entfernen. Also momentan nicht was ich erreichen will.

Wie für Tastendrücke als Eingabe nehmen, ich habe viel, aber Foundation nicht in der Lage gewesen zu hat 3 Referenzen zu finden:

standardInput

Die Entwicklerdokumentation listet sie in FileHandle, NSUserUnixTask & Prozess. Ich hoffe, vielleicht ist einer von ihnen in der Lage, auf Tastendrücke zu hören und dann mit einer Benachrichtigung zu reagieren, die ich verwenden kann, um meine Oberfläche mit dem richtigen Bildschirm zu aktualisieren und den Text neu zu positionieren oder eine Aktion auszuführen (z normale Aufforderung wie "Mann" tut mit dem Drücken von "q").

Würde mich freuen, etwas Hilfe zu haben, danke!

+0

FYI - wenn Sie laufen 'man ls' und dann mit dem Ausgang in Wechselwirkung treten, Sie laufen eigentlich jetzt den' more' (oder 'less') Befehl auf dem Wert der' PAGER' Umgebung abhängig Variable. Was Sie also fragen, ist, wie Sie etwas implementieren, das den Befehlen "more" oder "less" ähnlich ist. – rmaddy

+0

@rpaddy Das ist richtig; Allerdings bin ich hauptsächlich darauf bedacht, wie sie die beiden oben genannten Hauptmerkmale umsetzen. – ANoobSwiftly

Antwort

0

Die Standardoberfläche von macOS Cocoa verwendet Ereignisse; Darstellen von Mausklicks, Tastaturdrücken usw .; um Benutzereingaben an Ihre App zu übermitteln. Lesen Sie die Ereignisbehandlung und Sie können Ihre App beenden, wenn der Benutzer ein "q" eingibt. Dies ist der zugrunde liegende Mechanismus für die Tastatureingabe und die Alternative zu Ihrem readLine().

Allerdings ist das, was Sie beschreiben, mehr als nur Tastendruck Handhabung, Sie möchten Terminal-Bildschirm-Steuerung; Zurückscrollen, Löschen des Bildschirms, usw. Die ursprüngliche Art, dies unter Unix zu tun, war die Verwendung von Low-Level-Geräteschnittstellen und die Ausgabe von Steuercodes, die die Bildschirme selbst verstehen. Das moderne System besteht häufig darin, dieselben Steuercodes in Ihrer Cocoa-Schnittstelle zu implementieren. Dies ermöglicht die Ausgabe der Standardbefehle auf Unix-Ebene. z.B. Mann et al; interpretiert werden. Dies ist, was Terminal.app tut. Die standardmäßigen Cocoa-Textsteuerelemente implementieren auch Unterstützung für einige davon, insbesondere wird eine Teilmenge der Emacs-artigen Cursorbewegung unterstützt.

Die Open-Source-iTerm2 eine Objective-C Alternative zu Terminal.app ist, ist die Quelle auf GitHub zur Verfügung. Wenn Sie dies lesen, können Sie lernen, wie Sie eine Terminal-Fenster-Schnittstelle in Cocoa in Objective-C implementieren, Sie müssen das Swift-Äquivalent herausfinden.

HTH

Verwandte Themen