cat
ターミナルのシェルプロンプトで実行すると、cat
stdinから読み取った内容をstdoutに書き込むことになっていて、を押すaとa
、ターミナルドライバーによってエコーバックが表示されますが、それcat
は書き込まれませんa
( 1つのみa
、ターミナルドライバによってエコーされるもの)。
ただし、a Backspace b Enterをcat
入力するとa\010b\015
、の出力は表示されませんが、b\012
(b
および改行)が表示されます。
それは、ターミナルドライバ(カーネル内のソフトウェアではなく、カーネル内のソフトウェアxterm
)が標準モードの場合に非常に基本的なラインエディタを実装するためです。ターミナルドライバーは、コマンドを使用するときなどのシステムコールを使用して構成できます。たとえば、標準モードを終了するには、を実行できます。もしあなたがそうするなら:ioctl()
stty
stty -icanon
stty -icanon; cat
次に、echo
(で無効にすることもできますstty -echo
)とcat
出力の両方が同時に表示されます。
そのエディターはラインエディターです。つまり、ユーザーがを押すと、端末デバイスを読み取るアプリケーションに送信されるまで、1行のテキストを編集できますEnter。
そのエディターの編集機能は非常に限られています。ほとんどの実装では、4つの編集キー(実際には文字)のみが設定可能stty
です。
- erase(
^H
または^?
通常):前の文字を消去します
- kill(
^U
通常):空(kill)これまでに入力された行
- werase(
^W
):前の単語を消去します
- lnext(
^V
):次の文字をそのまま入力します(上記すべての特別な意味をキャンセルします)
昔は、ターミナルドライバーのラインエディターがより優れた機能で拡張されると考えられていました。そのため、初期のシェルにはコマンドライン編集機能がありません(cat
上記のように実行した場合よりもシェルプロンプトで同じ行編集機能を使用できます)。
しかし、それは実際には起こりませんでした。おそらく、いくつかのキーを押しても異なる端末が同じ文字を送信しないという混乱が原因で、カーネル空間に実装すべきではないことが明らかになりました。
そのため、一部のシェルは、ターミナルドライバーの標準モードを削除し、独自のラインエディターを実装し始めました。当時、emacs
とvi
完全に異なるキーバインディングや運転モードで最も人気のある視覚的なテキストエディタでした。にはvi
、テキストを入力するモードと編集するモードがあります。ではemacs
、常にテキストモードになりますが、編集はキーの組み合わせを押すことで行われます(^b
文字を後方に移動するなど)。
当時、シェルが独自の異なるキーバインディングを考案することは意味がありませんでした。それは人々が別のものを学ばなければならないためにフラストレーションを引き起こしたでしょう。ただし、一方のスタイル(emacs
またはvi
)を他方のスタイルよりも選択することは、他のエディターのユーザーを疎外する確実な方法でした。
https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.aによると:
kshの一般的なインライン編集機能(viおよびemacsモード)は、Bell Laboratoriesのソフトウェア開発者によって作成されました。Pat Sullivanによるviライン編集モード、Mike Veachによるemacsライン編集モード。それぞれが独自にBourneシェルを変更してこれらの機能を追加し、両方とも、kshにそれぞれのインラインエディターがある場合にのみkshを使用したい組織にいました。元々、コマンドライン編集をkshに追加するというアイデアは、行編集がターミナルドライバーに移行することを期待して拒否されました。ただし、これがすぐに発生する可能性が低いことが明らかになったとき、両方の行編集モードがkshに統合され、端末インターフェイスの一部として編集を提供するシステムで無効にできるようにオプションになりました。
そのため、代わりに、両方と、ユーザーが2つから選択するためのインターフェイスを実装しました。ksh
ほとんどの場合、80年代前半に最初に(上記のように個別に記述されたコードを再利用してviモードとemacsモードをBourneシェルに追加)、その後tcsh
(tcsh
最初にemacs
キーバインドのみがあり、vi
モードは後で追加されました)および後でbash
そしてzsh
90年代初期。
あなたは、2つのモードを切り替えbash
、zsh
またはksh
持つset -o vi
かset -o emacs
、ととbindkey -e
やbindkey -v
中tcsh
またはzsh
。
POSIXは、実際に指定するvi
モードとないemacs
ためのモードsh
(物語があることがあるリチャード・ストールマンが指定POSIXに反対emacs
するためのモードをsh
)。
デフォルトのモードではbash
、パブリック・ドメインは、の変異体ksh
(pdkshの、mksh、oksh)、tcsh
およびzsh
Emacsのモード(とかかわらずであるzsh
、それはですvi
あなたの場合$EDITOR
、IS vi
AT&Tにいる間、) ksh
、それはだダムない限り、モード$EDITOR
または$VISUAL
言及vi
かemacs
。
ksh
また、後で異なる方法で処理されるgmacs
Goslingのユーザーに対応するモードを追加しました。emacs
Ctrl+T
今の取扱い^W
中emacs
または中tcsh
のemacsモードは、おそらく以前からwerase
私たちは本当にその約私の陳述のためにそれらを責めることはできないので、ターミナルラインエディタで文字を「...出発」誤解を招くとして見ることができます。を入力したときに、他のすべてのものとは異なる動作をしたりemacs
、他のすべての動作と異なる動作をしtcsh
たりinfo
すると、イライラするだけですCtrl-W。あなたがタイプしたときにいくつかのアプリケーションがウィンドウを閉じ始めたとき、私はそれがはるかにイライラすることを発見したと想像できます Ctrl-W。