O primeiro passo para entender o que está acontecendo é estar ciente de que existem, de fato, dois caracteres de "nova linha". Há retorno de carro (CR, Ctrl + M ) e < href="https://en.wikipedia.org/wiki/Newline"> avanço de linha (LF, Ctrl + J ). Em um teletipo , o CR move a cabeça da impressora para o início da linha, enquanto o LF move o papel para baixo em uma linha. Para entrada do usuário, há apenas um conceito relevante, que é “o usuário terminou de inserir uma linha”, mas infelizmente houve alguma divergência: sistemas Unix, assim como a muito popular linguagem C, usam alimentação de linha para representar quebras de linha; mas os terminais enviam um retorno de carro quando o usuário pressiona a tecla Retornar ou Enter .
A configuração icrnl
diz ao driver do terminal no kernel para converter o caractere CR para LF na entrada. Dessa forma, os aplicativos só precisam se preocupar com um caractere de nova linha; o mesmo caractere de nova linha que termina as linhas nos arquivos também termina as linhas de entrada do usuário no terminal, portanto, o aplicativo não precisa ter um caso especial para isso.
Por padrão, o ghci, ou melhor, a biblioteca haskeline que ele usa, tem uma ligação de chave para Ctrl + J , ou seja, LF, para parar de acumular entrada e iniciar o processamento. Não tem ligação para Ctrl + M , isto é, CR. Portanto, se o terminal não estiver convertendo CR para LF, o ghci não saberá o que fazer com esse caractere.
O Haskeline instrui o terminal a relatar as teclas do teclado com seqüências de escape. Ele consulta as configurações do terminal do terminal para saber quais são essas seqüências de escape ( kent
entry no banco de dados terminfo). (O banco de dados terminfo também sabe como ativar escapes de teclado: ele envia a seqüência de escape smkx
e envia rmkx
ao sair para restaurar o modo de caractere de teclado padrão.) Quando você pressiona Enter tecla no teclado do ghci, que envia a seqüência de escape \eOM
, que haskeline reconhece como uma ligação para parar de acumular entrada e começar a processá-la.