Ubuntu/gnome-terminal에서 다음을 실행하면:
$ stty -icrnl
그런 다음 GHC 대화형 환경(Haskell 콘솔)을 시작합니다.
$ ghci
그런 다음 키를 누르면 Return행이 커밋되지 않습니다 Enter.
그러나 다음과 같은 경우:
$ stty icrnl
두 행 모두 Return커밋됩니다 Enter.
나는 이 동작을 잘 이해하지 못합니다. 확실히 두 경우 모두 개행이 적용됩니까 Return?
답변1
무슨 일이 일어나고 있는지 이해하는 첫 번째 단계는 실제로 두 개의 "줄 바꿈" 문자가 있다는 것을 깨닫는 것입니다. 가지다입력하다(CR, Ctrl+ M) 및개행(LF, Ctrl+ J). 이전의텔레타이프라이터, CR은 프린트 헤드를 줄의 시작 부분으로 이동하고 LF는 용지를 한 줄 아래로 이동합니다. 사용자 입력에는 "사용자가 줄 입력을 완료했습니다"라는 단 하나의 관련 개념이 있지만 불행히도 몇 가지 차이점이 있습니다. Unix 시스템과 매우 널리 사용되는 C 언어는 사용자가 줄 바꿈을 나타내기 위해 줄 바꿈을 사용합니다 . 터미널은 Return또는 키를 누르면 Enter캐리지 리턴 문자를 보냅니다 .
이 icrnl
설정은 입력 시 CR 문자를 LF로 변환하도록 커널의 터미널 드라이버에 지시합니다. 이렇게 하면 애플리케이션은 하나의 개행만 걱정하면 됩니다. 파일의 줄을 끝내는 동일한 개행은 사용자가 터미널에 입력한 줄도 끝나므로 애플리케이션은 이에 대한 특별한 경우를 가질 필요가 없습니다.
기본적으로 ghci 또는 오히려하스켈리온사용하는 라이브러리에는 입력 축적을 중지하고 처리를 시작하기 위해 Ctrl+, LF에 대한 키 바인딩이 있습니다. CR인 + 에 대한 바인딩이 J없습니다 . 따라서 터미널이 CR을 LF로 변환하지 않으면 ghci는 해당 문자를 어떻게 처리할지 알 수 없습니다.CtrlM
Haskeline은 터미널에 이스케이프 시퀀스를 사용하여 키보드 키 입력을 보고하도록 지시합니다. 터미널에 쿼리합니다.용어 정보 설정이러한 이스케이프 시퀀스가 무엇인지 알아보세요( kent
terminfo 데이터베이스의 항목). (terminfo 데이터베이스는 키보드 이스케이프를 활성화하는 방법도 알고 있습니다. smkx
이스케이프 시퀀스를 보내고 종료 시 rmkx
기본 키보드 문자 모드를 복원합니다.) Enter이스케이프 시퀀스는 ghci \eOM
, haskline 에서 키보드의 키를 누를 때 전송됩니다. 입력 축적을 중지하고 처리를 시작하는 바인딩으로 인식합니다.