ความแตกต่างระหว่าง 'setf' และ 'setaf' ของ tput คืออะไร?


17

คำสั่งtputมีสองตัวเลือกที่แตกต่างกันสำหรับการตั้งค่าสีsetfและsetafทั้งคู่ดูเหมือนจะทำงานได้ดีบนคอมพิวเตอร์ของฉัน:

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

ดูเหมือนจะเป็นคู่ที่คล้ายกันด้วยและsetbsetab

ความแตกต่างระหว่างสองตัวเลือกคืออะไร?


1
ดูterminfo(5)หน้าคนที่มาพร้อมกับncursesรายละเอียด
Stéphane Chazelas

คำตอบ:


15

setfจำกัด 8 สีเท่านั้น setafสามารถตั้งค่าได้สูงสุด 256 สี

(ข้อมูลทั้งหมดต่อไปนี้จะเฉพาะเจาะจงกับ urxvt เช่นเดียวกับเทอร์มินัลของฉัน แต่ข้อมูลจะคล้ายกับหากไม่เหมือนกันกับเทอร์มินัลอื่น ๆ )

ทั้งคู่setfและsetafระบุรหัสการยกเว้นที่แตกต่างกัน คุณสามารถดูสิ่งต่อไปนี้:

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

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

จากurxvt(7)หน้าคนของฉัน:

   "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 คุณจะได้รับสีใหม่

ขโมยมาจากวิกิพีเดีย :

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

tputดูเหมือนจะไม่ได้ใช้ช่วงสีตามลำดับ ANSI ที่มีอยู่จริง ไม่n > 7ว่าtput setaf nจะมีผลใด ๆกับข้อความในเทอร์มินัลของฉัน
Kyle Strand

ที่จริงแล้วนั่นอาจเป็นเพียงสิ่งแปลกประหลาดในสภาพแวดล้อมของฉัน สำหรับผมเอาท์พุทจากtput setf 2และtput setaf 2เป็นทั้ง .[32m
Kyle Strand

5

จากคู่มือ: man 5 terminfo

ในการเปลี่ยนสีพื้นหน้าหรือสีพื้นหลังในเทอร์มินัลชนิด Tektronix ให้ใช้setaf (set ANSI foreground) และsetab (set ANSI background) หรือsetf (set foreground) และsetb (set background) สิ่งเหล่านี้ใช้เวลาหนึ่งพารามิเตอร์หมายเลขสี เอกสาร SVr4 อธิบายเฉพาะsetaf / setabเท่านั้น ร่าง XPG4 กล่าวว่า "ถ้าสนับสนุนขั้ว ANSI ลำดับหนีไปยังพื้นหลังชุดและเบื้องหน้าพวกเขาควรจะกำหนดเป็นsetafและsetabตามลำดับ. ถ้าสนับสนุนขั้วลำดับหนีอื่น ๆ ไปยังพื้นหลังชุดและเบื้องหน้าพวกเขาควรจะกำหนดเป็นsetfและsetbตามลำดับ ฟังก์ชั่น vidputs () และฟังก์ชั่นรีเฟรชใช้setafและsetabหากมีการกำหนดไว้ "

ดังนั้นคำตอบคือ: setafหมายถึงSet ANSI เบื้องหน้าเช่นใช้ ANSI escape sequences และsetfหมายถึงSet Foreground (ใช้บาง escape sequences นอกเหนือจาก ANSI)


3

ความสามารถสองชุดใช้ลำดับที่แตกต่างกันสำหรับสีแดง / สีน้ำเงินในรายการสี ANSI

ตามที่ระบุไว้ก็จะมีการอธิบายใน ncurses terminfo หน้าคู่มือ ประวัติบางส่วน:

  • ในช่วงต้น (1990- กลาง) พร้อมใช้งานมากที่สุด"สี"setf/setbคำอธิบายขั้วใช้
  • มีความสับสนกับผู้ใช้ termcap ที่ใช้Sf/Sbรหัสที่เกี่ยวข้องมากกว่าsetaf/setab(และAF/ABสำหรับ termcap) - แต่ใช้ลำดับการหลบหนีของ ANSI (ซึ่งทำงานกับ termcap) แทนที่จะใช้ความสามารถที่ถูกต้องกับความสามารถ ANSI
  • ด้วยเหตุนี้คุณจะพบรายการเทอร์มินัลที่มีสองรายการเช่นmgterm , interix , beterm (รวมถึงรายการหลายรายการในไฟล์ termcap ของ FreeBSD อีกครั้งเนื่องจากความสับสนเริ่มต้นนี้รวมกับการไม่เต็มใจของผู้อื่นเพื่อแก้ไขโปรแกรมของพวกเขา)

มาตรฐาน ANSI setaf/setabถูกเพิ่มค่อนข้างปลายในประวัติศาสตร์ของ terminfo เท่าที่คุณสามารถอนุมานจากตำแหน่งของพวกเขาในรายการของสตริงความสามารถ โปรดจำไว้ว่าสิ่งเหล่านั้นถูกเพิ่มเข้ามาในสเตจในช่วงสองสามปีที่ผ่านมาและบางระบบแตกต่างกัน (ncurses มีตัวอย่างบางอย่างเช่นCaps.hpuxเพื่อให้คอมไพล์ให้เข้ากับระบบเหล่านั้น) ซึ่งคิดเป็นจำนวนน้อยของคำอธิบายเทอร์มินัลที่มีประโยชน์ซึ่งสามารถใช้สำหรับการอ้างอิง

จากทั้งหมดนั้นความจริงที่ว่าsetf/setbสตริงที่มีอยู่ไม่ตรงกับคำสั่ง ANSI ไม่ได้สังเกตเห็นในทันทีซึ่งนำไปสู่การแก้ไขบางอย่างในปี 1998และคำถามที่ถามบ่อยทำไมจึงเป็นสีแดง / สีน้ำเงินเปลี่ยน? .

ในขณะที่มีความเป็นไปได้ที่จะเพิ่มลำดับ ANSI 8 สีเป็น 16 สี (โดยสมมติว่าสี 8-15 เป็นรุ่นที่สว่างกว่า 0-7) ไม่มีเหตุผลที่ดีที่จะประดิษฐ์รูปแบบที่จะขยายsetf/setbผ่าน 16 สีแรก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.