Apa perbedaan antara 'setf' dan 'setaf' tput?

17

Perintah ini tputmemiliki dua opsi berbeda untuk mengatur warna, setfdan setaf, namun keduanya tampaknya bekerja dengan baik di komputer saya:

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

Tampaknya ada dualitas serupa dengan setbdan setab.

Apa perbedaan antara dua opsi?

IQAndreas
sumber
1
Lihat terminfo(5)halaman manual yang datang dengan ncursesdetail.
Stéphane Chazelas

Jawaban:

15

setfterbatas hanya 8 warna. setafdapat mengatur hingga 256 warna.

(semua informasi berikut akan spesifik untuk urxvt, karena itu adalah terminal saya, tetapi infonya akan serupa dengan, jika tidak sama, seperti terminal lainnya)

Keduanya setfdan setafmemberikan kode pelarian yang berbeda. Anda dapat melihatnya di berikut ini:

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

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

Dari urxvt(7)halaman manual saya :

   "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)

Jadi dari xxdoutput di atas , kita bisa melihat yang tput setf 2menggunakan Pm = 32, yang akan mengatur warna menjadi hijau. tput setaf 2di sisi lain menggunakan Pm = 38;5, yang akan mewakili kode warna yang didefinisikan dalam ISO 8613-6 (juga hijau).
Dalam ISO 8613-6, warna 0x00-0x07 sama dengan warna standar, dan 0x08 - 0x0f adalah warna standar "tebal". Setelah Anda mendapatkan 0x10-0xff Anda mendapatkan warna baru.

Dicuri dari 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
Patrick
sumber
tputtampaknya tidak benar-benar menggunakan rentang urutan warna ANSI yang tersedia. Untuk apa pun n > 7, tput setaf ntidak berpengaruh pada teks di terminal saya.
Kyle Strand
Sebenarnya, itu bisa menjadi kekhasan lingkungan saya; bagi saya output dari tput setf 2dan tput setaf 2yang kedua .[32m .
Kyle Strand
5

Dari manual: man 5 terminfo

Untuk mengubah warna latar depan atau latar belakang saat ini pada terminal tipe Tektronix, gunakan setaf (atur latar ANSI) dan setab (atur latar ANSI) atau setf (atur latar depan) dan setb (atur latar belakang). Ini mengambil satu parameter, nomor warna. Dokumentasi SVr4 hanya menjelaskan setaf / setab ; rancangan XPG4 mengatakan bahwa "Jika terminal mendukung urutan pelarian ANSI untuk mengatur latar belakang dan latar depan, mereka harus dikodekan sebagai setaf dan setab , masing-masing. Jika terminal mendukung urutan pelarian lain untuk mengatur latar belakang dan latar depan, mereka harus dikodekan sebagai setf dan setbmasing-masing. Fungsi vidputs () dan fungsi refresh menggunakan setaf dan setab jika didefinisikan. "

Jadi jawabannya adalah: setaf berarti Set ANSI foreground , yaitu menggunakan ANSI escape sequence, dan setf berarti Set Foreground (menggunakan beberapa sequence escape selain ANSI).

Will Sheppard
sumber
3

Dua set kemampuan menggunakan urutan berbeda untuk merah / biru dalam daftar warna ANSI.

Seperti disebutkan, dijelaskan di halaman buku panduan ncurses terminfo . Beberapa sejarah:

  • Awal (pertengahan 1990-an), kebanyakan deskripsi terminal "warna" tersedia setf/setb.
  • Ada beberapa kebingungan dengan pengguna termcap yang menggunakan Sf/Sbkode yang sesuai daripada setaf/setab(dan AF/ABuntuk termcap) - tetapi menggunakan urutan escape ANSI (yang bekerja dengan termcap) daripada menggunakan kemampuan yang benar dengan kemampuan ANSI.
  • Karena itu, Anda akan menemukan entri terminal dengan dua yang disamakan, misalnya, mgterm , interix , beterm (serta beberapa entri dalam file termcap FreeBSD, lagi-lagi karena kebingungan awal ini dikombinasikan dengan keengganan orang lain untuk mengubah program mereka).

ANSI setaf/setabditambahkan cukup terlambat dalam sejarah terminfo karena Anda dapat menyimpulkan dari posisi mereka dalam daftar string kemampuan . Ingatlah bahwa semua itu ditambahkan secara bertahap selama beberapa tahun, dan beberapa sistem berbeda (ncurses memiliki beberapa contoh seperti Caps.hpuxmembiarkannya dikompilasi agar sesuai dengan sistem tersebut). Itu menyumbang sejumlah kecil deskripsi terminal berguna yang dapat digunakan untuk referensi.

Dengan semua itu, fakta bahwa setf/setbstring yang ada tidak cocok dengan urutan ANSI tidak segera diperhatikan, yang menyebabkan beberapa perbaikan pada tahun 1998 , dan faq Mengapa merah / biru dipertukarkan? .

Meskipun dimungkinkan untuk memperpanjang urutan ANSI 8-warna menjadi 16-warna (dengan mengandaikan bahwa warna 8-15 adalah versi yang lebih cerah dari 0-7), tidak ada alasan yang baik untuk menciptakan skema untuk memperpanjang setf/setbmelewati 16 warna pertama.

Thomas Dickey
sumber