Return、Enter、stty icrlfについて学ぶ

Return、Enter、stty icrlfについて学ぶ

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は端末にエスケープシーケンスを使用してキーボードのキーストロークを報告するように指示します。端末に問い合わせます。用語情報の設定これらのエスケープシーケンスが何であるかを調べます(kentterminfoデータベースのエントリ)。 (terminfoデータベースはキーボードエスケープを有効にする方法も知っています。smkxエスケープシーケンスを送信し、終了時にデフォルトのrmkxキーボード文字モードを復元します。)Enterエスケープシーケンスはghci \eOM、hasklineでキーボードのキーを押すと送信されます。入力の蓄積を停止し、処理を開始するバインディングとして認識します。

答え2

キーボードのキーをそれぞれ説明するように言及してReturn音を出します。Enter基本キーボードと数字キーパッドの一部は通常、メインセクションの右側にあります。

ここに画像の説明を入力してください。

しかし、ただ最初(変更されていない)送信されたキーに対応しますcontrolM。テンキーのキー可能キャリッジリターンなどを送信しますが、実際にはescapeOMVT100などの端末の場合はエスケープシーケンスを送信することもできます。

たとえば、を使用して他のキー値をエコーすることができますcat -v

関連情報