web-dev-qa-db-ja.com

tputの「setf」と「setaf」の違いは何ですか?

コマンドtputには、色を設定するための2つの異なるオプションsetfsetafがありますが、どちらも私のコンピューターでは問題なく動作するようです。

$ tput setf 2 && echo 'Hello world!'
$ tput setaf 2 && echo 'Hello world!'

setbsetabにも同様の双対性があるようです。

2つのオプションの違いは何ですか?

17
IQAndreas

setfは8色のみに制限されています。 setafは最大256色を設定できます。

(以下のすべての情報は、それが私の端末であるため、urxvtに固有ですが、情報は他の端末と同じではないにしても、類似しています)

setfsetafはどちらも異なるエスケープコードを提供します。これは以下で確認できます。

_# tput setf 2 | xxd  
0000000: 1b5b 3332 6d                             .[32m

# tput setaf 2 | xxd 
0000000: 1b5b 3338 3b35 3b32 6d                   .[38;5;2m
_

私のurxvt(7) manページから:

_   "ESC [ Pm m"
       Character Attributes (SGR)
       ...
       Pm = 30 / 40       fg/bg Black
       Pm = 31 / 41       fg/bg Red
       Pm = 32 / 42       fg/bg Green
       Pm = 33 / 43       fg/bg Yellow
       Pm = 34 / 44       fg/bg Blue
       Pm = 35 / 45       fg/bg Magenta
       Pm = 36 / 46       fg/bg Cyan
       Pm = 37 / 47       fg/bg White
       Pm = 38;5 / 48;5   set fg/bg to colour #m (ISO 8613-6)
_

したがって、上記のxxd出力から、_tput setf 2_が_Pm = 32_を使用し、色を緑に設定することがわかります。一方、_tput setaf 2_は、_Pm = 38;5_を使用します。これは、ISO 8613-6で定義されたカラーコード(緑)を表します。
ISO 8613-6では、色0x00-0x07は標準色と同じで、0x08-0x0fは標準の「太字」色です。 0x10-0xffに到達すると、新しい色が得られます。

盗まれた wikipedia

_0x00-0x07:  standard colors (as in ESC [ 30..37 m)
0x08-0x0f:  high intensity colors (as in ESC [ 90..97 m)
0x10-0xe7:  6*6*6=216 colors: 16 + 36*r + 6*g + b (0≤r,g,b≤5)
0xe8-0xff:  grayscale from black to white in 24 steps
_
16
Patrick

マニュアルから: man 5 terminfo

Tektronixタイプの端末で現在の前景色または背景色を変更するには、setaf(ANSIフォアグラウンドを設定)およびを使用します。 setab(ANSI背景を設定)またはsetf(前景を設定)およびsetb (背景を設定)。これらは、カラー番号という1つのパラメーターを取ります。 SVr4のドキュメントでは、setaf/setab;についてのみ説明しています。 XPG4ドラフトではと表示されています。「端末がANSIエスケープシーケンスをサポートしてバックグラウンドとフォアグラウンドを設定する場合は、setafおよびsetabそれぞれ、端末がバックグラウンドとフォアグラウンドを設定するために他のエスケープシーケンスをサポートしている場合は、としてコーディングする必要があります。 setfsetb、それぞれvidputs()関数と更新関数はsetafおよびsetab定義されている場合。 "

だから答えは:setafANSIフォアグラウンドを設定するつまりANSIエスケープシーケンスを使用し、setfは、Set Foregroundを意味します(ANSI以外のエスケープシーケンスを使用します)。

5
Will Sheppard

2つの機能セットは、ANSIカラーのリストで赤と青の順序が異なります。

すでに述べたように、それはncurses terminfoマニュアルページ で説明されています。いくつかの歴史:

  • 初期(1990年代半ば)、最も利用可能な "color"端末の説明がsetf/setbを使用しました。
  • Sf/Sb(およびtermcapの場合はsetaf/setab)ではなく、対応するAF/ABコードを使用したtermcapユーザーとの混乱がありました。 ANSI機能を備えた正しい機能。
  • そのため、たとえば mgterminterixbeterm の2つの等式の端末エントリが見つかります(FreeBSDのいくつかのエントリも同様です) termcapファイル、これもまた、この最初の混乱と、プログラムを修正する他の人の消極的な姿勢が原因です)。

ANSI setaf/setabは、 機能文字列のリスト での位置から推測できるため、terminfoの歴史のかなり後の方に追加されました。これらは数年かけて段階的に追加され、一部のシステムは異なっていたことに注意してください(ncursesには Caps.hpux などの例があり、それらのシステムに一致するようにコンパイルできます)。これは、参照に使用できる少数の有用な端末記述の説明です。

以上のことから、既存のsetf/setb文字列がANSI順序と一致しないという事実はすぐには気付かず、一部の 1998年の修正 、およびよくある質問 赤と青が入れ替わっていますか?

8色のANSIシーケンスを16色に拡張することは可能でしたが(色8〜15が0〜7の明るいバージョンであると仮定した場合)、setf/setb過去を拡張するスキームを発明する正当な理由はありませんでした。最初の16色。

3
Thomas Dickey