Sự khác biệt giữa 'setf' và 'setaf' là gì?


17

Lệnh tputnày có hai tùy chọn khác nhau để cài đặt màu, setfsetafcả hai đều có vẻ hoạt động tốt trên máy tính của tôi:

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

Dường như có một sự đối ngẫu tương tự với setbsetab.

Sự khác biệt giữa hai lựa chọn là gì?


1
Xem terminfo(5)trang người đàn ông đi kèm ncursesđể biết chi tiết.
Stéphane Chazelas

Câu trả lời:


15

setfđược giới hạn chỉ 8 màu. setafcó thể thiết lập tối đa 256 màu.

(tất cả các thông tin sau sẽ được dành riêng cho urxvt, vì đó là thiết bị đầu cuối của tôi, nhưng thông tin sẽ tương tự, nếu không giống như các thiết bị đầu cuối khác)

Cả hai setfsetafcung cấp một mã thoát khác nhau. Bạn có thể xem điều này trong các điều sau đây:

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

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

Từ urxvt(7)trang người đàn ông của tôi :

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

Do đó, từ xxdđầu ra trên , chúng ta có thể thấy rằng tput setf 2sử dụng Pm = 32, sẽ đặt màu thành màu xanh lá cây. tput setaf 2mặt khác, sử dụng Pm = 38;5, đại diện cho mã màu được xác định trong ISO 8613-6 (cũng là màu xanh lá cây).
Trong ISO 8613-6, màu 0x00-0x07 giống với màu tiêu chuẩn và 0x08 - 0x0f là màu "đậm" tiêu chuẩn. Khi bạn nhận được 0x10-0xff, bạn sẽ có được màu sắc mới.

Lấy cắp từ 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

tputTuy nhiên, dường như không thực sự sử dụng các dải màu ANSI có sẵn. Đối với bất kỳ n > 7, tput setaf nkhông có hiệu lực trên văn bản trong thiết bị đầu cuối của tôi.
Kyle Strand

Thật ra, đó có thể chỉ là một trò chơi trong môi trường của tôi; cho tôi các đầu ra từ tput setf 2tput setaf 2cả hai .[32m .
Kyle Strand

5

Từ hướng dẫn: man 5 terminfo

Để thay đổi màu nền trước hoặc màu nền hiện tại trên thiết bị đầu cuối kiểu Tektronix, hãy sử dụng setaf (đặt nền trước ANSI) và setab (đặt nền ANSI) hoặc setf (đặt nền trước) và setb (đặt nền). Những cái này lấy một tham số, số màu. Tài liệu SVr4 chỉ mô tả setaf / setab ; bản nháp XPG4 nói rằng "Nếu thiết bị đầu cuối hỗ trợ các chuỗi thoát ANSI để đặt nền và tiền cảnh, thì chúng phải được mã hóa lần lượt là setafsetab . Nếu thiết bị đầu cuối hỗ trợ các chuỗi thoát khác để đặt nền và tiền cảnh, chúng nên được mã hóa thành setfsetb, tương ứng. Hàm vidputs () và các hàm làm mới sử dụng setafsetab nếu chúng được xác định. "

Vì vậy, câu trả lời là: setaf có nghĩa là Đặt tiền cảnh ANSI , tức là sử dụng các chuỗi thoát ANSI và setf có nghĩa là Đặt Tiền cảnh (sử dụng một số chuỗi thoát khác với ANSI).


3

Hai bộ khả năng sử dụng thứ tự khác nhau cho màu đỏ / xanh trong danh sách các màu ANSI.

Như đã lưu ý, nó được giải thích trong trang hướng dẫn terminfo của ncurses . Một số lịch sử:

  • Đầu năm (giữa những năm 1990), hầu hết các mô tả thiết bị đầu cuối "màu" có sẵn được sử dụng setf/setb.
  • Có một số nhầm lẫn với người dùng termcap đã sử dụng các Sf/Sbmã tương ứng thay vì setaf/setab(và AF/ABcho termcap) - nhưng sử dụng các chuỗi thoát ANSI (hoạt động với termcap) thay vì sử dụng các khả năng chính xác với các khả năng ANSI.
  • Do đó, bạn sẽ tìm thấy các mục cuối cùng với hai mục tương đương, ví dụ: mgterm , interix , beterm (cũng như một số mục trong tệp thuật ngữ của FreeBSD, một lần nữa do sự nhầm lẫn ban đầu này kết hợp với sự miễn cưỡng của người khác để sửa đổi chương trình của họ).

ANSI setaf/setabđã được thêm vào khá muộn trong lịch sử của terminfo vì bạn có thể suy ra từ vị trí của chúng trong danh sách các chuỗi khả năng . Hãy nhớ rằng những cái đó đã được thêm vào trong các giai đoạn trong một vài năm và một số hệ thống khác nhau (ncurses có một số ví dụ như Caps.hpuxđể cho nó được biên dịch để phù hợp với các hệ thống đó). Điều đó chiếm số lượng nhỏ các mô tả thiết bị đầu cuối hữu ích có thể được sử dụng để tham khảo.

Với tất cả những điều đó, thực tế là các setf/setbchuỗi hiện tại không khớp với thứ tự ANSI đã không được chú ý ngay lập tức, dẫn đến một số bản sửa lỗi vào năm 1998 và faq Tại sao lại có màu đỏ / xanh? .

Mặc dù có thể mở rộng chuỗi ANSI 8 màu thành 16 màu (bằng cách giả sử rằng các màu 8-15 là phiên bản sáng hơn của 0-7), không có lý do chính đáng nào để phát minh ra một sơ đồ để setf/setbvượt qua 16 màu đầu tiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.