เมื่อฉันกด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;3AAlt-Up
เมื่อส่งไปยังเทอร์มินัลลำดับนั้นจะเลื่อนเคอร์เซอร์ขึ้น (พารามิเตอร์ที่สอง (3) จะถูกละเว้น) ไม่มีที่สอดคล้องกันเป็นปุ่มกดที่สำคัญดังนั้นจึงเป็นลำดับเดียวกันส่งเมื่อAlt-Upเข้าหรือออกจากโหมดปุแอพลิเคชัน
ตอนนี้ไม่ว่าจะเป็น\033\033[Aหรือ\033[1;3Aแอปพลิเคชันจำนวนมากไม่รู้ว่าลำดับเหล่านั้นมีไว้เพื่ออะไร ฐานข้อมูล terminfo จะไม่ช่วยให้พวกเขาเพราะไม่มีความสามารถดังกล่าวที่กำหนดสิ่งที่ตัวละครที่ส่งคีย์ผสม
พวกเขาจะพยายามอย่างเต็มที่เพื่อตีความลำดับนั้น bashเช่นจะแปลเป็นลำดับหนีไม่ทราบอะไรเกี่ยวกับมันจึงไม่ทำอะไรเลยตามมาด้วย\033[1;3 จะหยุดอ่านทันทีที่พบว่าไม่มีลำดับอักขระที่ตรงกันที่ทราบ ไม่มีลำดับการหลบหนีที่รู้ว่าเริ่มต้นด้วยดังนั้นมันจะข้ามสิ่งนั้นและอ่านส่วนที่เหลือ: และแทรกส่วนนั้นในตัวแก้ไขบรรทัดAzsh\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 เป็นพาริตี้และโดยปกติจะถูกล้าง ถ้าสตริงที่มีอยู่เพื่อเปิดการทำงานนี้โหมด "เมตา" และปิดที่พวกเขาจะได้รับเป็นและsmmrmm
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เปรียบเทียบกับการจับคู่สตริงที่ได้รับจึงอาจสับสนสร้างการจับคู่บางส่วน (เช่นตัวอักขระเลี่ยงเอง)
อ่านเพิ่มเติม: