เมื่อฉันกดAltUp, A
พิมพ์หน้าจอขั้ว สิ่งเดียวกันเกิดขึ้นเมื่อฉันกดAltDownแต่B
พิมพ์แทน
ตัวละครอื่น ๆ ที่ฉันรู้
AltLeft= D
และAltRight=C
วัตถุประสงค์ของคำสั่งเหล่านี้คืออะไร?
เมื่อฉันกดAltUp, A
พิมพ์หน้าจอขั้ว สิ่งเดียวกันเกิดขึ้นเมื่อฉันกดAltDownแต่B
พิมพ์แทน
ตัวละครอื่น ๆ ที่ฉันรู้
AltLeft= D
และAltRight=C
วัตถุประสงค์ของคำสั่งเหล่านี้คืออะไร?
คำตอบ:
ขึ้นอยู่กับว่าสถานีมีการกำหนดค่าการพิมพ์Alt+Keyเป็นเหมือนการพิมพ์EscและKeyปุ่มในลำดับดังนั้นจึงส่งตัวอักษรปุ่ม ESC (aka \e
หรือ^[
หรือ\033
) Keyตามด้วยตัวอักษรหรือลำดับของตัวอักษรที่ส่งไปเมื่อกดที่
เมื่อทำการกดตัวUpเลียนแบบเครื่องเทอร์มินัลส่วนใหญ่จะส่งอักขระสามตัว\033[A
หรือ\033OA
ขึ้นอยู่กับว่าพวกเขาอยู่ในโหมดแป้นพิมพ์ของแอปพลิเคชันหรือไม่
อันแรกตรงกับลำดับหนีซึ่งเมื่อออกไปยังเทอร์มินัลให้เลื่อนเคอร์เซอร์ขึ้น ถ้าคุณทำ:
printf '\nfoo\033[Abar\n\n'
คุณจะเห็นbar
เขียนหลังจากfoo
แถวหนึ่งขึ้นไป ถ้าคุณทำ:
stty -echoctl; tput rmkx; read foo
คุณจะเห็นว่าปุ่มลูกศรเลื่อนเคอร์เซอร์ไปมา
เมื่อโปรแกรมประยุกต์เหมือนzsh
หรือvi
อ่านลำดับของตัวละครจากสถานีนั้นก็ตีความว่าเป็น "ขึ้น" การกระทำเพราะมันรู้จากฐานข้อมูลที่ terminfo ( kcuu1
ความสามารถ) Upว่ามันเป็นลำดับหนีส่งเมื่อกด
ตอนนี้สำหรับAlt-Upอาคารบางอย่างเช่นrxvt
และอนุพันธ์ของมันเช่นeterm
ส่ง\033
ตามลำดับหนีสำหรับUp(นั่นคือ\033\033[A
หรือ\033\033OA
) ในขณะที่คนอื่น ๆ บางคนชอบxterm
หรือgnome-terminal
มีลำดับหนีแยกต่างหากสำหรับประเภทที่ของคีย์เมื่อนำมาใช้กับการรวมกันปุ่มชอบAlt, ,ShiftCtrl
ผู้ที่มักจะจะส่งเมื่อ\033[1;3A
Alt-Up
เมื่อส่งไปยังเทอร์มินัลลำดับนั้นจะเลื่อนเคอร์เซอร์ขึ้น (พารามิเตอร์ที่สอง (3) จะถูกละเว้น) ไม่มีที่สอดคล้องกันเป็นปุ่มกดที่สำคัญดังนั้นจึงเป็นลำดับเดียวกันส่งเมื่อAlt-Upเข้าหรือออกจากโหมดปุแอพลิเคชัน
ตอนนี้ไม่ว่าจะเป็น\033\033[A
หรือ\033[1;3A
แอปพลิเคชันจำนวนมากไม่รู้ว่าลำดับเหล่านั้นมีไว้เพื่ออะไร ฐานข้อมูล terminfo จะไม่ช่วยให้พวกเขาเพราะไม่มีความสามารถดังกล่าวที่กำหนดสิ่งที่ตัวละครที่ส่งคีย์ผสม
พวกเขาจะพยายามอย่างเต็มที่เพื่อตีความลำดับนั้น bash
เช่นจะแปลเป็นลำดับหนีไม่ทราบอะไรเกี่ยวกับมันจึงไม่ทำอะไรเลยตามมาด้วย\033[1;3
จะหยุดอ่านทันทีที่พบว่าไม่มีลำดับอักขระที่ตรงกันที่ทราบ ไม่มีลำดับการหลบหนีที่รู้ว่าเริ่มต้นด้วยดังนั้นมันจะข้ามสิ่งนั้นและอ่านส่วนที่เหลือ: และแทรกส่วนนั้นในตัวแก้ไขบรรทัดA
zsh
\033[1
;3A
การใช้งานหลายคนต้องการvi
, zsh
หรือreadline
ตามคนที่ชอบgdb
หรือbash
( แต่ระวังbash
การใช้งานฉบับแก้ไขreadline
) ช่วยให้คุณสามารถเพิ่มการผูกลำดับของตัวอักษรใด ๆ
ยกตัวอย่างเช่นในzsh
คุณอาจต้องการที่จะผูกAlt-Up, Alt-Downเช่น:
bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward
สิ่งเหล่านี้คือการค้นหาประวัติย้อนหลังและไปข้างหน้าสำหรับบรรทัดคำสั่งที่เริ่มต้นอย่างใดอย่างหนึ่งในปัจจุบันจนถึงตำแหน่งปัจจุบันของเคอร์เซอร์ซึ่งค่อนข้างสะดวกในการจำคำสั่งก่อนหน้า
คุณสามารถใช้Crtl+ vเพื่อส่งคืนรหัสอินพุตของแป้นพิมพ์ของคุณ ถ้าคุณทำที่สำหรับปุ่มลูกศร, คุณจะได้รับ[[D^
, [[C^
, [[A^
และ[[B
ค่า ไม่มีการผูกค่าเริ่มต้นสำหรับAlt+ แป้นลูกศรดังนั้นดูเหมือนว่าการกระทำที่ดำเนินการจะพิมพ์รหัสตัวอักษรเพียงอย่างเดียว ถ้าคุณสร้างไฟล์กำหนดค่าไลบรารี Readline ในท้องถิ่นของคุณ:
$ cp /etc/inputrc ~/.inputrc
และเพิ่มบรรทัด:
"\e[1;3C": "sometexthere"
[1;3C
รหัสป้อนข้อมูลของAlt+ อยู่ที่ไหน→(คุณสามารถรับแบบเดียวกับก่อนใช้Crtl+ vทางลัด) จากนั้นรีสตาร์ทเครื่องจากนั้นทางลัดCrtl+ →จะคืนข้อความให้คุณ "บางครั้ง" และAltปุ่มลัด + ลูกศรอื่น ๆจะหยุดส่งคืนอักขระ
ข้อความแทนคุณสามารถส่งคำสั่ง bindable ได้จากhttp://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commandsเช่น
"\e[1;3C": unix-line-discard
เพื่อให้มีผลเหมือนกันเช่นCrtl+ u(ลบบรรทัด)
ข้อมูลเพิ่มเติมที่นี่: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html
Altที่สำคัญมักจะถูกนำมาใช้เป็นmetaปรับปรุง เคอร์เซอร์ - และฟังก์ชั่น - ปุ่มถูกอ้างถึงว่าเป็นคีย์พิเศษเนื่องจากมันอาจส่งหลายตัวอักษร - และตัวอักษรที่ถูกส่งสามารถเปลี่ยนแปลงได้
ผู้ใช้บางคนเช่นbash
คาดว่าการกดAltจะส่งคีย์นำหน้าด้วยอักขระเลี่ยง ฟีเจอร์ "meta" ที่ทำเป็นเอกสาร (ดูterminfo(5)
) เกี่ยวข้องกับบิตที่แปด:
หากเทอร์มินัลมี "เมตาคีย์" ซึ่งทำหน้าที่เป็นปุ่ม Shift ให้ตั้งค่าบิตที่ 8 ของอักขระใด ๆ ที่ส่งความจริงข้อนี้สามารถระบุ
km
ได้ มิฉะนั้นซอฟต์แวร์จะถือว่าบิตที่ 8 เป็นพาริตี้และโดยปกติจะถูกล้าง ถ้าสตริงที่มีอยู่เพื่อเปิดการทำงานนี้โหมด "เมตา" และปิดที่พวกเขาจะได้รับเป็นและsmm
rmm
bash
รู้เกี่ยวกับสิ่งนั้นเช่นกัน (ดูคำถามที่พบบ่อยเกี่ยวกับncurses ) แต่มีผู้ใช้ไม่กี่คนที่สนใจคุณสมบัตินี้ อย่างไรก็ตามพวกเขาคุ้นเคยกับการอ้างถึงAltเป็น "เมตา" แม้ว่าโหมดเมตาจะถูกปิด ทั้ง rxvt และ xterm มีคุณลักษณะนี้ตั้งแต่ (อย่างน้อย) ต้นปี 1990
ผู้ใช้รายอื่น (นับตั้งแต่xterm
เปิดตัวฟีเจอร์ในแพ็ตช์ # 94, 1999 ) อาจคาดว่าข้อมูลตัวดัดแปลงจะถูกเข้ารหัสเป็นพารามิเตอร์ในลำดับของอักขระที่คีย์พิเศษจะส่ง เอกสารของ XTerm อ้างถึงคีย์ที่ปรับเปลี่ยนเหล่านี้เป็นปุ่มฟังก์ชั่น"PC-style"เพื่อแยกความแตกต่างจาก"VT220-style" (ซึ่งไม่มีตัวดัดแปลง) เคอร์เซอร์คีย์ที่ไม่มีการแก้ไขอาจส่งESC[Aแต่ก็เป็นเรื่องถูกกฎหมายที่จะมีพารามิเตอร์เช่นESC[5Aซึ่งแอปพลิเคชันควรเข้าใจว่าการทำซ้ำห้าครั้งนั้น รุ่นแรกของxterm
's พีซีแบบปุ่มใช้ว่า '5' เพื่อแสดงถึงcontrolและรุ่นที่ใหม่กว่าเปลี่ยนไปเพื่อหลีกเลี่ยงความสับสนกับจำนวนการทำซ้ำ ดังนั้น...
ESC[5A
แนะนำว่าแอพพลิเคชั่นเลื่อนเคอร์เซอร์ขึ้น 5 แถวขณะที่
ESC[1;5A
แนะนำว่ามันเลื่อนขึ้นหนึ่งแถวโดยบอกแอปพลิเคชันว่าcontrolกดแป้นแล้ว
ชุดค่าผสมที่มีประโยชน์อยู่ในฐานข้อมูล ncurses terminfo ตั้งแต่ปี 2004 :
# 2004-07-17
# * add xterm-pc-fkeys -TD
ฐานข้อมูล terminfo แสดงเวอร์ชันปัจจุบันของxterm + pcfkeysพร้อมความคิดเห็นที่แสดงวิธีเข้ารหัสตัวดัดแปลง:
# This fragment describes as much of XFree86 xterm's "pc-style" function
# keys as will fit into terminfo's 60 function keys.
# From ctlseqs.ms:
# Code Modifiers
# ---------------------------------
# 2 Shift
# 3 Alt
# 4 Shift + Alt
# 5 Control
# 6 Shift + Control
# 7 Alt + Control
# 8 Shift + Alt + Control
# ---------------------------------
# The meta key may also be used as a modifier in this scheme, adding another
# bit to the parameter.
(Alt และเมตาไม่จำเป็นต้องเป็นคีย์เดียวกัน) นั่นคือBuilding Block (ซึ่งประกอบไปด้วย Building Block อื่น ๆ ) ซึ่งxterm
จะอธิบายคำอธิบายขั้ว มันใช้ส่วนขยายที่ให้ไว้ใน ncurses ตั้งแต่ปี 1999ซึ่งช่วยให้ชื่อที่ผู้ใช้กำหนด เนื่องจาก termcap สนับสนุนชื่อ 2 อักขระเท่านั้นและคำอธิบาย 1,023- ไบต์จึงไม่มีเหตุผลที่จะทำให้ชื่อเพิ่มเติมเหล่านี้พร้อมใช้งานผ่านทางอินเตอร์เฟสtermcap พร้อมใช้งานสำหรับแอปพลิเคชันที่ใช้อินเตอร์เฟสterminfo
ตอนนี้เป็นเรื่องยาก: มีหลายวิธีที่แอปพลิเคชั่นจะกำหนดลำดับคีย์ดังนี้:
ไม่กี่โปรแกรมที่จะทำก่อน บางบรรณาธิการข้อความจะทำสอง (ที่จริงผมทำนี้สำหรับded
ในช่วงปลายทศวรรษ 1980 ) นักพัฒนาสำหรับการใช้งานเช่นการbash
เลือกเส้นทางที่สามโดยสมมติว่าข้อมูลส่วนใหญ่อยู่ในtermcap อีกทางเลือกหนึ่งพวกเขาอาจเลือกที่จะสร้างตารางที่มีข้อมูล termcap / terminfo และใช้อินเตอร์เฟสที่ให้ข้อมูลที่ดีที่สุด xterm
ทำสิ่งนี้สำหรับคุณลักษณะtcap-queryโดยvim
มีการกำหนดคีย์ฟังก์ชันจริง
เนื่องจากไม่มีสตริงที่bash
เปรียบเทียบกับการจับคู่สตริงที่ได้รับจึงอาจสับสนสร้างการจับคู่บางส่วน (เช่นตัวอักขระเลี่ยงเอง)
อ่านเพิ่มเติม: