Compreendendo Return, Enter e stty icrlf

2

No Ubuntu / gnome-terminal, se eu executar:

$ stty -icrnl

Em seguida, inicie o ambiente interativo do GHC (um console do Haskell):

$ ghci

Em seguida, pressionar Return não envia a linha; no entanto, Enter faz.

No entanto, com:

$ stty icrnl

Ambos Devolver e Introduzir submeter a linha.

Eu realmente não entendo o comportamento; Certamente Return estará enviando o caractere de nova linha em ambos os casos?

    
por Matt R 04.01.2016 / 23:46

2 respostas

4

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.

    
por 05.01.2016 / 02:01
4

Referindo-se a ambos Retornar e Enter soa como se você estivesse descrevendo as teclas respectivamente na parte main do teclado e no numérico teclado, muitas vezes no lado direito da parte principal:

No entanto, somente o primeiro desses corresponde à chave que (não modificada) envia controle M . A tecla no teclado numérico pode enviar um retorno de carro ou qualquer coisa, mas pode realmente enviar uma seqüência de escape, por exemplo, escape O M , para terminais do tipo VT100.

Você pode ver os diferentes valores de chave fazendo eco, por exemplo, usando cat -v .

    
por 04.01.2016 / 23:59

Tags