Jak wyczyścić ekran terminala w Haskell?

93

Jak mogę wyczyścić ekran terminala po wybraniu przez użytkownika opcji z menu mojej aplikacji?

Nubkadiya
źródło
2
Czy możesz bardziej precyzyjnie określić, jakiego systemu interfejsu użytkownika używasz w programie Haskell? Czy masz na myśli, że po prostu czytasz i piszesz tekst na stdin / stdout? Jeśli tak, to nie mają one ukrytej koncepcji „ekranu”. Jeśli zamierzasz program działać przy założeniu, że do stdin / stdout dołączony jest terminal, to powinieneś kodować swój program tak, aby używał jakiegoś pakietu kontrolnego terminala, takiego jak wskazana odpowiedź @ZackS.
MtnViewMark
2
Wybierz poprawną odpowiedź. Ludzie muszą przejść przez wszystkie odpowiedzi!
Shishir Gupta

Odpowiedzi:

198

:! uruchom polecenie powłoki
:! CLS pod oknami
! jasne pod Linuksem i OS X

unieważnić
źródło
2
czy jest jakaś ściągawka do ghci?
tugberk
2
@Peter, przypuszczam, że to dlatego, że nie uważają, że jest to rozwiązanie typu haskell (słusznie; działa tylko w GHCi), nie działa dla nich (zależne od powłoki) lub po prostu uważają odpowiedź ZachSa za lepszą . :! clsjest wystarczające dla mojego przypadku użycia, ale nie działa w przypadku pytającego, ponieważ pytający nie używa GHCi.
John Dvorak
58

Oto, czego możesz szukać:

ansi-terminal: prostego terminala ANSI z kompatybilnością z Windows

Możesz go znaleźć w Hackage i zainstalować za pomocą cabal install ansi-terminal . W szczególności ma funkcje do czyszczenia ekranu, wyświetlania kolorów, przesuwania kursora itp.

Używanie go do czyszczenia ekranu jest łatwe: (to jest z GHCI)

import System.Console.ANSI

clearScreen

ZachS
źródło
4
To jest poprawna odpowiedź. Spróbuj jednak poszukać pakietu w menedżerze pakietów twojego systemu, ponieważ cabal generalnie nie działa z tym i nie oferuje polecenia odinstalowania.
Evi1M4chine
14

Na terminalu, który rozumie sekwencje specjalne ANSI (wierzę, że każdy termin w systemach Unix / Linux) możesz to zrobić po prostu za pomocą:

clear = putStr "\ESC[2J"

2Czyści cały ekran. Możesz użyć odpowiednio 0lub, 1jeśli chcesz wyczyścić od kursora do końca ekranu lub od kursora do początku ekranu.

Jednak nie sądzę, żeby to działało w powłoce Windows.

Federico Squartini
źródło
11

Po prostu naciśnij Ctrl + L (działa w systemie Windows)

mitaness
źródło
1
Działa też na macOS
oluckyman
Działa również na ubuntu + zsh.
Tejaswi Yerukalapudi
8

W systemach uniksowych możesz zrobić, System.system "clear"co po prostu wywołuje narzędzie wiersza poleceń clear. W przypadku rozwiązania, które nie zależy od narzędzi zewnętrznych, potrzebna byłaby biblioteka, która abstrahuje od różnych typów terminali, takich jak na przykład ansi-terminal .

sepp2k
źródło
8
@Pradeep: Tak, i odpowiedziałem w haskell.
wrzesień
8
@Pradeep: Nie musisz krzyczeć. (Zobacz en.wikipedia.org/wiki/All_caps#Internet )
Jared Updike,
5

Szybkim sposobem na Windows byłoby

import System.Process

clear :: IO ()
clear = system "cls"
Boris
źródło
To było najczystsze rozwiązanie dla mnie i dla systemów Linux system "clear.
Iain J. Reid
5

W systemie Windows użyj Ctrl + L dla terminala wiersza polecenia Haskell. A dla GUI użyć Ctrl + S .

Shuvam Shah
źródło
0

Pod Linuksem (przynajmniej Ubuntu) jest to kod, którego używam do czyszczenia terminala:

import qualified System.Process as SP

clearScreen :: IO ()
clearScreen = do
  _ <- SP.system "reset"
  return ()
Stephane Rolland
źródło