Como faço para limpar a tela do terminal em Haskell?

93

Como posso limpar uma tela de terminal depois que meu usuário selecionar uma opção do menu do meu aplicativo?

Nubkadiya
fonte
2
Você pode ser mais claro sobre o sistema de interface do usuário que está usando no programa Haskell? Você quer dizer que está simplesmente lendo e escrevendo texto em stdin / stdout? Nesse caso, eles não têm nenhum conceito implícito de "tela". Se você pretende que seu programa funcione assumindo que há um terminal conectado a stdin / stdout, então você deve codificar seu programa para usar algum pacote de controle de terminal, como a resposta indicada de @ZackS.
MtnViewMark
2
Escolha a resposta correta. As pessoas têm que passar por todas as respostas!
Shishir Gupta

Respostas:

195

:! execute o comando shell
:! CLS no Windows
: limpar no Linux e OS X

vazio
fonte
2
existe algum cheatsheet para ghci?
tugberk de
2
@Peter, meu melhor palpite é que eles não acham que seja uma solução haskell (com razão; funciona apenas no GHCi), não funciona para eles (dependente de shell) ou eles apenas consideram a resposta de ZachS uma melhor . :! clsé suficiente para o meu caso de uso, mas não funciona para o caso do autor da pergunta, pois o autor da pergunta não está usando GHCi.
John Dvorak
58

Isso é o que você pode estar procurando:

ansi-terminal: Suporte a terminal ANSI simples, com compatibilidade com Windows

Você pode encontrá-lo em Hackage e instalar usando cabal install ansi-terminal. Ele tem funções específicas para limpar a tela, exibir cores, mover o cursor, etc.

Usá-lo para limpar a tela é fácil: (isso é com GHCI)

import System.Console.ANSI

clearScreen

ZachS
fonte
4
Essa é a resposta correta. Tente procurar o pacote no gerenciador de pacotes do seu sistema, pois o cabal geralmente não funciona com isso e não oferece um comando de desinstalação.
Evi1M4chine
13

Em um terminal que entende sequências de escape ANSI (acredito que todos os termos em sistemas Unix / Linux), você pode fazer isso simplesmente com:

clear = putStr "\ESC[2J"

o 2 limpa a tela inteira. Você pode usar 0ou, 1respectivamente, se desejar limpar do cursor ao final da tela ou do cursor ao início da tela.

No entanto, não acho que isso funcione no shell do Windows.

Federico Squartini
fonte
11

Basta pressionar Ctrl + L (funciona no Windows)

mitaness
fonte
1
Funciona no macOS também
oluckyman
Funciona no ubuntu + zsh também.
Tejaswi Yerukalapudi
8

Em sistemas Unix, você pode fazer o System.system "clear"que apenas invoca o utilitário de linha de comando clear. Para uma solução que não dependa de ferramentas externas, você precisaria de uma biblioteca que abstraia sobre diferentes tipos de terminais como, por exemplo, ansi-terminal .

sepp2k
fonte
8
@Pradeep: Sim, e respondi em haskell.
sepp2k de
8
@Pradeep: Não precisa gritar. (Veja en.wikipedia.org/wiki/All_caps#Internet )
Jared Updike
5

Uma maneira rápida no Windows seria

import System.Process

clear :: IO ()
clear = system "cls"
Boris
fonte
Esta foi a solução mais limpa para mim e para uso em sistemas Linux system "clear.
Iain J. Reid
5

No Windows, use Ctrl + L para o terminal de prompt de comando Haskell. E, por GUI usar Ctrl + S .

Shuvam Shah
fonte
0

No Linux (Ubuntu pelo menos), esse é o código que uso para limpar o terminal:

import qualified System.Process as SP

clearScreen :: IO ()
clearScreen = do
  _ <- SP.system "reset"
  return ()
Stephane Rolland
fonte