เอกสารเกี่ยวกับตัวแปร LESS_TERMCAP_ *?


38

ฉันเห็นสีสวย ๆเหล่านี้ใน manpages ที่ดูน้อยลงเมื่อตั้งกลุ่มตัวแปรเหล่านี้ พวกเขาหมายถึงอะไรเอกสารอยู่ที่ไหน นี่แปลว่าน้อยหรือ termcap?

ภาพหน้าจอ

เอสเอสของหน้าคน

คำตอบ:


45

Termcapเป็นไลบรารีที่ Less ใช้เพื่อเข้าถึงเทอร์มินัล Termcap ส่วนใหญ่ล้าสมัยถูกแทนที่ด้วยTerminfoแต่ Terminfo มีส่วนต่อประสานความเข้ากันได้ของ Termcap กับแอปพลิเคชัน Less คือเนื้อหาที่มีส่วนต่อประสาน Termcap และใช้สิ่งนั้น

ห้องสมุด Termcap เป็นคำอธิบายเกี่ยวกับสิ่งอำนวยความสะดวกของเครื่อง สถานที่แต่ละแห่งจะถูกระบุด้วยรหัสสองตัวอักษร (หรือมากกว่าสองตัวอักษรโดยทั่วไป) ตัวอย่างเช่นhcระบุเทอร์มินัลสำเนาถาวร (เช่นเครื่องพิมพ์ไม่ใช่หน้าจอ) coคือจำนวนคอลัมน์ mdเริ่มแสดงข้อความตัวหนา ความสามารถแต่ละอย่างมีค่าซึ่งสามารถเป็นบูลีน (เช่นเดียวกับhc) จำนวนเต็ม (เช่นเดียวกับco) หรือสตริง (เช่นเดียวกับmd) สตริงจำนวนมากเป็น escape sequences ที่แอ็พพลิเคชันสามารถส่งไปยังเทอร์มินัลเพื่อให้ได้ผลที่แน่นอน

ทำไมลำดับหนี เนื่องจากอินเทอร์เฟซระหว่างเทอร์มินัลและแอปพลิเคชันเป็นสตรีมอักขระ (แม่นยำยิ่งขึ้นสตรีมอักขระหนึ่งตัวในแต่ละทิศทาง: หนึ่งรายการสำหรับผู้ใช้อินพุตหนึ่งรายการสำหรับเอาต์พุตเพื่อแสดง) เมื่อแอปพลิเคชันเขียนอักขระไปยังเทอร์มินัลมักจะปรากฏขึ้น ตัวละครสองสามตัวมีพฤติกรรมที่แตกต่าง: พวกเขาเป็นตัวควบคุมซึ่งทำสิ่งต่าง ๆ เช่นการย้ายเคอร์เซอร์ไปรอบ ๆ สลับการแสดงผลคุณลักษณะ ฯลฯ มีคำสั่งมากกว่าตัวควบคุมดังนั้นคำสั่งส่วนใหญ่จะเข้าถึงได้โดยลำดับหนีซึ่งเริ่มต้นด้วย อักขระพิเศษ (มักจะเป็นอักขระยกเว้นจึงเป็นชื่อ)

ตัวอย่างเช่นเมื่อ Less ต้องการแสดงข้อความที่เป็นตัวหนามันจะค้นหาค่าของmdความสามารถ นี่คือสตริงซึ่ง Less เขียนไปยังเทอร์มินัล เทอร์มินัลรู้จักสตริงนี้เป็นลำดับ escape และปรับสถานะภายในเพื่อให้อักขระที่ตามมาจะแสดงเป็นตัวหนา

ในยุคแรก ๆ ของเทอร์มินัลฮาร์ดแวร์แบรนด์ต่าง ๆ มีลำดับและความสามารถในการหลบหนีที่แตกต่างกัน ฐานข้อมูลและส่วนต่อประสาน Termcap ถูกคิดค้นขึ้นเพื่อให้แอปพลิเคชันไม่จำเป็นต้องรู้เกี่ยวกับเทอร์มินัลทุกรุ่น ปัจจุบันเทอร์มินัลอีมูเลเตอร์ส่วนใหญ่มีความสามารถที่คล้ายกันมาก แต่ฐานข้อมูล Termcap หรือ Terminfo ยังมีประโยชน์ในการรับมือกับความแตกต่างเล็กน้อย

LESS_TERMCAP_*ตัวแปรสามารถตั้งค่าในสภาพแวดล้อมหรือในไฟล์.lesskey มันให้ค่าทางเลือกน้อยลงสำหรับความสามารถของเทอร์มินัล เมื่อ Less ต้องการใช้ความสามารถของเทอร์มินัลพูดสลับเป็นตัวหนาก่อนอื่นตรวจสอบว่ามีLESS_TERMCAP_mdตัวแปรหรือไม่ หากตัวแปรนี้มีอยู่ Less จะใช้ค่าของมันเป็น escape sequence เพื่อเปลี่ยนเป็นตัวหนา มิฉะนั้นจะใช้ค่าจากฐานข้อมูล Termcap กลไกนี้อนุญาตให้ผู้ใช้แทนที่การตั้งค่าฐานข้อมูล Termcap สำหรับ Less

การLESS_TERMCAP_*ตั้งค่าที่มีประโยชน์ที่สุดคือ escape sequences คุณสามารถแมปแอตทริบิวต์กับแอตทริบิวต์ที่แตกต่างกัน คุณสามารถใช้tputคำสั่งเพื่อค้นหาค่าของความสามารถสำหรับเทอร์มินัลปัจจุบันในฐานข้อมูลTermcapหรือTerminfoของระบบ คุณสามารถใช้ลำดับการหลีกเลี่ยงได้โดยตรงหากคุณไม่สนใจว่าจะขึ้นกับเทอร์มินัล ตัวอย่างเช่นการตั้งค่านี้บอกให้น้อยกว่าที่จะแสดงเป็นตัวหนาสีแดงเมื่อได้รับคำสั่งให้แสดงเป็นตัวหนา:

LESS_TERMCAP_md=$(tput md; tput AF 1)

หรือหากtputคำสั่งของคุณไม่สนับสนุนชื่อ Termcap:

LESS_TERMCAP_md=$(tput bold; tput setaf 1)

ผู้ชายส่งข้อความน้อยลงด้วยการจัดรูปแบบที่เรียบง่ายซึ่งสามารถแสดงตัวหนาและตัวเอียงเท่านั้น นอกจากนี้ Less ยังใช้ความสามารถในการจัดรูปแบบต่าง ๆ สำหรับการใช้ภายในเช่นเพื่อเน้นผลการค้นหาและเพื่อแสดงบรรทัดโหมดที่ด้านล่าง ต่อไปนี้คือบางส่วนของ escape sequences ที่ Less use (ฉันแสดงรายการเฉพาะความสามารถที่มีประโยชน์พอสมควรที่จะทำการแมปใหม่):

termcap terminfo  
ks      smkx      make the keypad send commands
ke      rmkx      make the keypad send digits
vb      flash     emit visual bell
mb      blink     start blink
md      bold      start bold
me      sgr0      turn off bold, blink and underline
so      smso      start standout (reverse video)
se      rmso      stop standout
us      smul      start underline
ue      rmul      stop underline

ในการแสดงผลลัพธ์เป็นสีให้ใช้setafความสามารถ (หรือAFด้วย Termcap)

การLESS_TERMCAP_*ตั้งค่าไม่ได้กล่าวถึงในLESSเอกสารประกอบ การอ้างอิงที่ดีที่สุดที่ฉันสามารถให้เป็นคำตอบของฉันที่นี่


8
ขอบคุณ ฉันยังดูสั้น ๆ ที่ซอร์สโค้ดที่น้อยกว่าและพบว่าเมื่อคุณตั้ง LESS_TERMCAP_DEBUG ให้กับบางสิ่งจากนั้นเปิด man คุณจะเห็นสิ่งที่คล้ายกับซอร์สโค้ดของ man page และในแท็กความสามารถทั้งหมดที่ใช้ ทำให้การตัดสินใจเลือกสิ่งที่คุณต้องการเป็นเรื่องง่ายขึ้น
Anselm

1
ดูคำตอบนี้เกี่ยวกับวิธีตั้งค่าLESS_TERMCAP_*env vars ทั้งหมดโดยใช้tputแทนที่จะเป็น chars
Kaushal Modi

3

คำตอบของ Gillesนั้นยอดเยี่ยม แต่สิ่งนี้ทำให้ฉันอยากรู้:

Termcap ส่วนใหญ่ล้าสมัยถูกแทนที่ด้วย Terminfo

  1. หาก Termcap ล้าสมัยฉันต้องการเปลี่ยนเป็น Terminfo

  2. ฉันต้องการเปลี่ยนจาก Termcap เพราะฉันพบข้อผิดพลาด สมมติว่าคุณใส่ตัวแปร termcap ในของคุณ~/.profileหรือคล้ายกัน:

    export LESS_TERMCAP_so=$(printf '\33[5;30;43m')
    export LESS_TERMCAP_se=$(printf '\33[m')
    

    หลังจากนั้นถ้าคุณป้อนsetตัวแปร Termcap ทำให้สีของคุณเสีย

หากต้องการเปลี่ยนเป็น Terminfo คุณสามารถสร้างไฟล์ได้xterm-pretty.ti:

xterm-pretty|xterm with pretty colors,
# exit standout mode
  rmso=\e[m,
# begin standout mode
  smso=\e[5;30;43m,
# similar terminal
  use=xterm,

รวบรวมและติดตั้งไฟล์:

tic xterm-pretty.ti

เพิ่มบรรทัด~/.profileหรือคล้ายกัน:

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