ฉันจะค้นหารายการรหัสเทอร์มินัลคีย์เพื่อทำการแมปทางลัดใน bash ได้ที่ไหน


42

ตัวอย่างเช่น:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

ฉันรู้เพียงเศษ ๆ ชิ้น ๆ เช่น\eย่อมาจาก Escape และC-for Ctrlแต่ตัวเลขเหล่านี้ ( 1) และตัวอักษร ( Z) คืออะไร อะไรคือ;, [และ-ป้ายบอก?

มีเพียงการทดลองและข้อผิดพลาดหรือมีรายการรหัสทุบตีที่สมบูรณ์และคำอธิบายของไวยากรณ์หรือไม่


2
เคล็ดลับเพิ่มเติมสำหรับรายการที่เกิดขึ้นจริงที่ ReadLine ผูกbind -pของเปลือกเป็น

1
เทอร์มินัลของคุณส่วนใหญ่ตีความเช่นนั้น อ่านเกี่ยวกับรหัสหลบหนี ANSIบน Wikipedia สำหรับรายชื่อที่มีขนาดใหญ่
chepner

stty -a แสดงการตั้งค่าบรรทัดของเทอร์มินัล
ข้อผิดพลาด

คำตอบ:


52

นี่คือลำดับของอักขระที่ส่งโดยเทอร์มินัลของคุณเมื่อคุณกดปุ่มที่กำหนด ไม่มีอะไรเกี่ยวข้องกับการทุบตีหรือ readline ต่อ se แต่คุณต้องการที่จะรู้ว่าลำดับของตัวละครที่ได้รับคีย์หรือการรวมกันของคีย์ที่ส่งถ้าคุณต้องการกำหนดค่าreadlineให้ทำอะไรบางอย่างเมื่อกดปุ่มที่กำหนด

เมื่อคุณกดAปุ่มโดยทั่วไปเทอร์มินัลส่งaอักขระ (0x61) หากคุณกด<Ctrl-I>หรือ<Tab>โดยทั่วไปแล้วจะส่ง^Iอักขระที่รู้จักกันในชื่อTABหรือ\t(0x9) ส่วนใหญ่ของการทำงานและการนำกุญแจทั่วไปส่งลำดับของตัวละครที่เริ่มต้นด้วย^[(ควบคุม [) ยังเป็นที่รู้จักESCหรือ\e(0x1b, 033 ฐานแปด) แต่ลำดับที่แน่นอนแตกต่างกันไปจากสถานีไปยังสถานี

วิธีที่ดีที่สุดในการค้นหาว่าคีย์หรือคีย์ผสมส่งอะไรให้เทอร์มินัลของคุณทำงานsed -n lหรือพิมพ์ตามด้วยEnterคีย์บอร์ด จากนั้นคุณจะเห็นสิ่งที่ชอบ:

$ sed -n l
^[[1;5A
\033[1;5A$

บรรทัดแรกเกิดจากสถานีภายในที่echoทำโดยอุปกรณ์ปลายทาง (อาจไม่น่าเชื่อถือเนื่องจากการตั้งค่าอุปกรณ์ปลายทางจะส่งผลกระทบต่อ)

sedบรรทัดที่สองคือการส่งออกโดย $ไม่ได้ที่จะถูกรวมอยู่ก็เพียงเพื่อที่จะแสดงให้คุณที่ท้ายบรรทัดคือ

ดังกล่าวข้างต้นหมายถึงว่าCtrl-Up(ซึ่งผมได้กด) ส่ง 6 ตัวอักษรESC, [, 1, ;, 5และA(0x1b 0x5b 0x31 0x3b 0x35 0x41)

terminfoฐานข้อมูลบันทึกจำนวนของลำดับสำหรับจำนวนของคีย์ที่พบบ่อยสำหรับจำนวนของขั้ว (ขึ้นอยู่กับ$TERMค่า)

ตัวอย่างเช่น

TERM=rxvt tput kdch1 | sed -n l

จะบอกคุณว่าลำดับหนีคือการส่งโดยrxvtเมื่อกดDeleteคีย์

คุณสามารถค้นหาคีย์ที่สอดคล้องกับลำดับที่กำหนดกับเทอร์มินัลปัจจุบันของคุณด้วยinfocmp(นี่คือncursesinfocmp):

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

การผสมคีย์เช่นCtrl-Upไม่มีรายการที่สอดคล้องกันในterminfoฐานข้อมูลดังนั้นเพื่อค้นหาสิ่งที่พวกเขาส่งอ่านแหล่งข้อมูลหรือเอกสารประกอบสำหรับเทอร์มินัลที่เกี่ยวข้องหรือลองใช้ด้วยsed -n lวิธีที่อธิบายไว้ข้างต้น


นี่คือคำอธิบายที่ดีขอบคุณ! ตอนนี้ทุกอย่างตกลงไป\e-1\C-iเป็นแท็บย้อนกลับเพราะcontrolและiแทรกแท็บแล้วescapeตามด้วย-1ทุบตีว่าจะทำมันย้อนหลังครั้งเดียว (ฉัน goggled นี้และพบบางสิ่งเกี่ยวกับdigit-arguments)
ข้อผิดพลาด

$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx

3
@vib นั่นคือตัวพิมพ์เล็ก L ไม่ใช่ตัวเลข 1
Stéphane Chazelas

1
@ user367890 ที่ลงไปที่โหมดปุ่มกด คุณอาจจะพบว่าหลังจากtput smkxนั้นเทอร์มินัลของคุณจะส่ง\e[OD( kcub1) และหลังจากtput rmkxนั้น\e[D( cub1รหัสเดียวกันกับลำดับที่เลื่อนเคอร์เซอร์ไปทางซ้ายเพื่อให้เสียงก้องของคีย์เหล่านั้นเลื่อนเคอร์เซอร์ลองstty -echoctl; tput rmkx; sleep infและคุณจะเห็น ปุ่มลูกศรจะเลื่อนเคอร์เซอร์เมื่อไม่อยู่ในโหมดปุ่มกด )
Stéphane Chazelas

1
@ user367890 จากสิ่งที่โทมัส (ผู้ดูแล ncurses และ xterm) กล่าวไว้ในคำตอบที่คุณลิงค์ใช่มันควรจะทำงาน โหมดปุ่มกดหรือโหมดแอปพลิเคชันอ้างถึงสิ่งเดียวกันดังนั้น (ตามโทมัส) อีกครั้งข้อกำหนดคุณสมบัติหลักในฐานข้อมูล terminfo ใช้เมื่อเปิดใช้งาน smkx
Stéphane Chazelas

4

มันมีให้ผ่านห้องสมุด Readline gnu คุณควรมองหาแมนไลน์ 3เพื่อหาคำอธิบาย

ดูเหมือนว่าคุณต้องการข้อมูลเกี่ยวกับรหัส escspe ที่มีความ\[Aหมายเช่นกัน คุณสามารถค้นหาข้อมูลนี้ได้ในวิกิพีเดียบทความANSI esacape code


นี่ไม่ได้อธิบายตัวอย่างของฉัน
ข้อผิดพลาด

ดูเหมือนว่ามันจะเข้าใจผิดเล็กน้อย โปรดดูการปรับปรุงคำตอบ
เร่ง

ไม่มีข้อมูลเกี่ยวกับตัวอย่างเฉพาะของฉันในบทความ การค้นหาหน้าสำหรับ "[A" ไม่ได้แสดงผลลัพธ์ใด ๆ เช่นกัน
ข้อผิดพลาด

1
@bug โปรดอ่านบทความอย่างละเอียด \[Aอยู่ในตาราง "รหัส CSI" ภายในแถว: "CSI n A"
เร่งด่วน

ขอบคุณรีบเร่ง แต่ที่ฉันจะหาคำอธิบาย[Z, [1;5Cหรือ-1?
ข้อผิดพลาด

3

รหัสเหล่านี้มาจากแหล่งเดียวกันหรือไม่ อันสุดท้ายดูเหมือนว่าการโยง readline ของ GNU นั่นคือสิ่งที่ผู้ใช้ส่งไปทุบตี (ดูคำตอบเร่งด่วน) อย่างไรก็ตามสองรายการแรกมีลักษณะเหมือนลำดับการควบคุมเทอร์มินัล (แม้ว่าลำดับแรกจะเป็นลำดับที่ไม่ดี) นั่นคือสิ่งที่ทุบตีหรือโปรแกรมอื่นส่งกลับไปที่เทอร์มินัลอีมูเลเตอร์เพื่อควบคุมการเคลื่อนไหวของเคอร์เซอร์สีข้อความและสิ่งที่คล้ายกัน


ฉันพบ "\ e [1; 5C" ที่จะใช้สำหรับการเคลื่อนย้ายคำ ctrl- ลูกศรไปข้างหน้าและ "\ e [Z" และ "\ e-1 \ Ci" สำหรับเมนูแบบย้อนหลังในบทเรียนอื่น ๆ มีการใช้งานทั้งหมดภายในไฟล์. inputrc
ข้อผิดพลาด

ตกลงถ้าพวกเขาถูกตีความโดย readline จะต้องมีเทอร์มินัลอีมูเลเตอร์บางส่วนที่ลำดับการควบคุมเหล่านี้ถูกผูกไว้กับการรวมกันของ ctrl, alt และ / หรือ shift ด้วยปุ่มฟังก์ชันหรือลูกศร (ผมไม่ทราบว่าเป็นที่หนึ่ง.)
Uwe

0

วิธีที่ง่ายที่สุดที่ฉันได้พบเพื่อตรวจสอบลำดับการหลบหนีที่สร้างขึ้นโดยคีย์หรือคำสั่งผสมคีย์คือการกดCtrl+ vในเทอร์มินัลแล้วกดคีย์ / คอมโบที่คุณต้องการทราบ

คุณจะได้รับลำดับเหมือน^[Oaและคุณจะมีการแปล^[ลงใน\eหรือ\033หรือ\x1bหรือสิ่งที่เป็นตัวแทนอื่น ๆ ที่คาดว่าระบบปุ่มลัดของคุณสำหรับตัวหนี

มันเริ่มเป็นฟังก์ชั่น Emacs ที่ตั้งชื่อquoted-insertและเนื่องจาก keybinds เริ่มต้นสำหรับ Bash และ Zsh เลียนแบบ Emacs พวกเขาจึงคัดลอกมัน

Bash นำไปใช้ผ่านไลบรารีอินพุตของ GNU Readline ซึ่งสิ่งอื่น ๆ เช่นimport rlcompleterการปรับปรุงของ Python ก็ใช้เช่นกัน

นี่คือคำอธิบายจากคู่มือ Readline :

quoted-insert( C-qหรือC-v)

เพิ่มอักขระถัดไปที่พิมพ์ลงในบรรทัดคำต่อคำ นี่คือวิธีการแทรกลำดับคีย์C-qเช่น

ที่ควรทำงานในสิ่งใดก็ได้ตาม GNU Readline

สำหรับ Zsh ซึ่งใช้ทางเลือกของตัวเองชื่อ ZLE นั้นจะให้เกียรติกับ Emacs ดั้งเดิมเท่านั้นC-qเมื่ออยู่ในโหมด Vi, แดกดันพอ แต่C-vก็ยังใช้งานได้ในโหมดอินพุตแบบเหมือนของ Emacs (ค้นหาquoted-insertในzshzleหรือ zshall` manpages และคู่ที่สองของผลลัพธ์ควรแสดงรายการ keybinds เริ่มต้น)

สำหรับช่วยในการจำฉันแนะนำให้คิดถึงCtrl+ vตามที่ขอให้v erbatim

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