80列のコンソールには、タブストップが9つしかありません。
最初にコメントを拡大しましょう。あなたは、実際にテストしていない任意のコンソールを。これらはすべてGUI 端末エミュレータプログラムです。幸いなことに、実際のコンソール(少なくともLinuxとFreeBSD上)でもこの動作が見られます。
しかし、それはあなたが主張する行動ではありません。11個のタブストップは示されていません。9を示します。
タブストップを適切に理解するには、「常にN個のスペースに展開する」を捨てる必要があります。アイデア。タブストップを備えた機械式タイプライターを使用できる場合は、その仕組みを確認してください(タブがキャリッジの突き出たピンによって設定される)。UnixおよびLinuxの世界では、端末のタブストップはこのように機能します。
(端末に到達する前に、出力ストリームのタブ文字をスペース文字に置き換えて、ソフトタブを有効にするように回線制御を設定できます。ここでは、回線制御ではなく端末自体によって実行されるハードタブについて説明します。。ハードタブでTAB
は、ボーンフィードキャラクターが端末に送信されます。逆に、ソフトタブでは、最初に説明した動作が発生しません。設定stty tab3
してみてください。
初期化されたように、端末にはタブストップがまったく設定されていません。早い段階でgetty
、またはreset
コマンドまたはそれに類するもの(システムによって異なる)は、特定の列にタブストップを設定する一連のスペース文字とエスケープシーケンスを出力します。列とエスケープシーケンスでさえも配線されている場合があります。ただし、ほとんどの場合、コマンドはtermcap / terminfoデータベースの情報を検索します。すべてのタブをクリアするためのエスケープシーケンスを提供するterminfo機能はtbc
;です。このhts
機能は、現在の列にタブを設定するためのエスケープシーケンスを提供します。この it
機能は、デフォルトでタブストップ間の列数を指定します。termcapのために、同等の機能でありit
、ct
およびst
。
このコマンドは端末サイズを取得し(カーネル、システムコール、またはterminfo / termcapレコードの別の部分から)、列数を調べ、it
スペースとそれに続くできるだけst
多くの列のシーケンスを繰り返し出力します。、最後にキャリッジリターンを出力して列#0に戻ります。これはまさに 1は、多くの機械式タイプライターでタブストップのセットを設定方法:スペースを繰り返し、次のタブストップに、ヒット、ピンを押し出し右マージンまで繰り返し、左に戻ってキャリッジをプッシュするレバーを「タブストップ設定」 。
it
通常は8として与えられる80列幅の端末では、コマンドはこれを9回行い、8、16、24、32、40、48、56、64、および72列にタブストップを設定します。
列0にはタブストップ(プログラムのバグを除く)はありません。これが最初のカウントミスです。また、列80にタブストップはありません。これは2回目のカウントミスです。「なぜ」、「それですか?」できないため、まず、それがあることタブストップを設定する欄80に。カーソルは、80列の端末で列0から列79に移動します。
第二に、TAB
キャラクターの行動について考えなければなりません。一般的な考えに反して、次の8列の倍数に移動するのに十分なスペースに拡張されません。UnixおよびLinux端末は、機械的なタイプライターのように機能します、覚えておいてください。メカニカルタイプライターの世界では、タブキーはキャリッジをタブストップピンまたは右マージンで停止するまで移動します。(いくつかの巧妙な詰まりは、この時点でマージンリリースに言及するかもしれません。これは、明白な理由のために、UnixおよびLinux端末にはない機械式タイプライターにはあるものです。)
TAB
UnixおよびLinux端末の文字は、実際にはまったく同じように機能します。それに応じて、端末は次の設定されたタブストップまたは右端の列に到達するまでスペースを出力します。それがここで起こっていることです。カーソルが79列目にあるとき、TAB
好きなだけ文字を書くことができ、何も起こりません。右端の列を超えるタブ移動はありません。
termcap / terminfoシステムでは、設定可能なハードタブをオプションにすることができます。しかし、すべてでテストしたプログラムは、「xterm」タイプのターミナルエミュレータを提供します。(理解できるエスケープシーケンスxterm
は、termcap / terminfoデータベースのエントリ/エントリで指定されたものです。)また、最近では、FreeBSD仮想コンソールのターミナルエミュレータも同様です。Linux仮想コンソールのターミナルエミュレーターは、実際にはわずかに異なるターミナルタイプで、と指定されていlinux
ます。(これはFreeBSD仮想コンソールにも当てはまりました。cons25
タイプ。FreeBSDは、仮想コンソールでUTF-8サポートを取得するプロジェクトの一環として、カーネルターミナルエミュレーターをバージョン9.0でxterm互換に変更しました。タブ機構。
(ソースを読んで楽しむ人のために:を見てTabNext()
とTabToNextStop()
の関数tabs.c
でxterm
ソースコード。)
自分で試してみることができます。次のコマンドを実行します。
tbc=$(tput tbc) hts=$(tput hts)
printf '%s\r%s\r\n' "${tbc}" "a${hts}aaa${hts}aaaaaaa${hts}aaaaaaaaaaaaa${hts}aaaaaaaaaaaaaaaaaa${hts}"
その後、コマンドを再度実行します。正確に5つのタブストップが設定されています。${hts}
コマンドでを数えるか、a
文字の行を見てください。5番目を超えて、このTAB
文字は、その比phor的なタイプライターの馬車に、残りのすべてを右マージンまでむしゃむしゃさせます。
次の(印刷する、非TAB
)文字は、左マージンへの自動キャリッジリターン、および次の行への改行を引き起こします。termcap / terminfoの用語では、xterm
端末タイプには自動マージンがあります。理論的には、UnixとLinuxは自動マージンのない端末で動作します。あなたのprintf
コマンドは、キャリッジリターンを書いたまで、どのくらいのより多くのあなたの出力は関係ない、コラム79で動けなくなるでしょう。実際には、このようなデバイスは、今日のほとんどの人の心を揺さぶるでしょう。