Ubuntu/gnome-terminal で以下を実行すると:
$ stty -icrnl
次に、GHC対話型環境(Haskellコンソール)を起動します。
$ ghci
その後、キーを押すと行はReturnコミットされませんEnter。
ただし、次の場合:
$ stty icrnl
両方の行がReturnコミットされますEnter。
私はこの動作をよく理解していません。確かにどちらの場合も改行が適用されますかReturn?
答え1
何が起こっているのかを理解する最初のステップは、実際に2つの「改行」文字があることに気づくことです。持つ入力する(CR、Ctrl+ M)と改行(LF、Ctrl+ J)。以前のテレタイププライター、 CR はプリントヘッドを行の先頭に移動し、LF は用紙を 1 行下に移動します。ユーザー入力には「ユーザーが行入力を完了しました」という1つの関連概念がありますが、残念ながらいくつかの違いがあります。 Unixシステムと非常に広く使用されているC言語は、ユーザーが改行を表すために改行を使用します。端末は、Returnまたはキーを押すとEnterキャリッジリターン文字を送信します。
このicrnl
設定は、入力時にCR文字をLFに変換するようにカーネルのターミナルドライバに指示します。これにより、アプリケーションは1つの改行を心配するだけです。ファイルの行を終了するのと同じ改行は、ユーザーが端末に入力した行も終了するため、アプリケーションはこれに特別なケースを持つ必要はありません。
基本的にghciかむしろハスケリオン使用するライブラリには、入力の蓄積を停止して処理を開始するために、Ctrl+、LFへのキーバインディングがあります。 CRの+へのバインディングはJありません。したがって、端末がCRをLFに変換しないと、ghciはその文字をどのように処理するかを知ることができません。CtrlM
Haskelineは端末にエスケープシーケンスを使用してキーボードのキーストロークを報告するように指示します。端末に問い合わせます。用語情報の設定これらのエスケープシーケンスが何であるかを調べます(kent
terminfoデータベースのエントリ)。 (terminfoデータベースはキーボードエスケープを有効にする方法も知っています。smkx
エスケープシーケンスを送信し、終了時にデフォルトのrmkx
キーボード文字モードを復元します。)Enterエスケープシーケンスはghci \eOM
、hasklineでキーボードのキーを押すと送信されます。入力の蓄積を停止し、処理を開始するバインディングとして認識します。