2013-06-04 4 views
7

Wenn Sie Eingabeaufforderung in Windows ausgeführt wird, können Sie den clear Befehl geben Sie den Bildschirm zu löschen. Wie machen Sie dasselbe, wenn Sie Swipl Prolog (indem Sie in der Eingabeaufforderung swipl eingeben) in Windows?Clearing-Bildschirm in Swipl Prolog in Fenstern

Antwort

14

Auf Unix-Terminals gibt es die Ressource library(tty), und diese hat tty_clear/0, aber Windows-Terminals unterstützen die Terminal-Bibliothek nicht. Sie unterstützen jedoch ANSI Escape Codes.

Escape-Codes sind Zeichenfolgen, beginnend mit dem ESC (Escape) -Zeichen, ASCII 0x1B = 27. Die meisten beginnen mit dem Kontrollsequenzeinführer, der das Escape gefolgt von einem linken Bracker ist: ESC [, bekannt als CSI.

So können Sie die Code-Sequenz für einen Bildschirm klar, auszustellen, die die ED (Erase Data) Befehl, der die Form:

CSI 2 J -- which expands to: ESC [ 2 J 

Von SWI-Prolog kann dies mit Hilfe der format/2 primitiven ausgestellt .

format('~c~s', [0x1b, "[2J"]). % issue CSI 2 J 

Der ED-2-Befehl, voller Terminal klar über die Handhabung MSDOS ANSI setzt den Cursor nach oben links, aber das ist nicht unbedingt der Fall an allen Terminals, also am besten mit dem CUP (Cursorposition zu kombinieren) Befehl, der als Reset nach Hause einfach lautet: CSI H.

format('~c~s~c~s', [0x1b, "[H", 0x1b, "[2J"]). % issue CSI H CSI 2 J 

Update: Vereinfachung

Dank @CapelliC für eine alternative und klare Form, mit dem \e Escape-Code für die Flucht!

Plain klar Bildschirm:

cls :- write('\e[2J'). 

Oder mit nach Hause zurück:

cls :- write('\e[H\e[2J'). 
+2

Nizza zu fangen. Ich habe ANSI-Sequenzen vergessen. Sie können ESC like \ e ausdrücken und so in SWI-Prolog-Konfigurationsdatei die Prozedur speichern: 'cls: - write ('\ e [2J').' Oder 'cls: - write ('\ e [H \ e [ 2J '). ' – CapelliC

+0

@ CapelliC: Nützlich, ich wusste nicht, es unterstützt' \ e', eine viel sauberere Verfeinerung. – Orbling

+0

@CapelliC: '\ e' ist kein ISO und wird von GNU und SICStus abgelehnt. Verwenden Sie stattdessen "\ 33 \". – false