เมตาคีย์ของ bash คืออะไร?


16

ฉันพยายามใช้xmodmapแมปMETA_LไปยังMENUคีย์ แต่ดูเหมือนว่าจะไม่ได้รับการยอมรับจากbashเมตาคีย์ ดังนั้นฉันสงสัยว่าองค์ประกอบเหล่านี้ (คีย์บอร์ด, X, xterm, bash) เกี่ยวข้องกันอย่างไรในส่วนของ Meta- และ Super-Keys คำอธิบายใด ๆ ที่จะได้รับการชื่นชม

ขอผมใช้อีกวิธีนี้ หน้าคนทุบตีกล่าวว่าเช่นว่าฟังก์ชั่นงัด-ที่ n-หาเรื่องถูกผูกไว้และจะทำงานเมื่อฉันกดM-C-y Esc-Control-yแต่ฉันคิดว่ามันค่อนข้างยุ่งยาก ดังนั้นฉันจะทำให้ bash ยอมรับคีย์อื่นเป็นMeta(เช่นMenu) สำหรับการผูกค่าเริ่มต้นทั้งหมดได้อย่างไร


MENUคีย์ของคุณถูกสังเกตเห็นโดย X หรือไม่? คุณใช้ตัวจัดการหน้าต่างอะไร - บางตัวสามารถช่วยคุณกำหนดคีย์ได้
choroba

คำตอบ:


11

การแมปจากแป้นคีย์บอร์ดไปยังตัวดัดแปลงเช่นMetaและControlจัดการโดยเซิร์ฟเวอร์ X (เช่นส่วนต่ำของ GUI) การแมปนี้สามารถจัดการผ่านxmodmapคำสั่งแบบเก่าหรืออินเตอร์เฟสXKBแบบใหม่หรือผ่านเครื่องมือการกำหนดค่า GUI ที่ใช้หนึ่งในสิ่งเหล่านี้ภายใต้ประทุน

โดยค่าเริ่มต้นในการตั้งค่าที่มากที่สุดที่สำคัญคือกุญแจสำคัญที่มีข้อความMeta Altนี้เป็นเพราะในอดีตเวิร์คสเตชั่ยูนิกซ์หลายคนสำคัญที่มีข้อความที่เครื่องคอมพิวเตอร์ได้ที่สำคัญที่ระบุว่าMeta Altดังนั้นถ้าคุณได้ผูกพันสำหรับM-C-yกดCtrl+ +AltY

ในการตรวจสอบการเชื่อมปัจจุบันของคุณให้เริ่มxevโปรแกรมในเทอร์มินัล เมื่อหน้าต่าง xev โฟกัสแล้วให้กดปุ่ม; คุณจะเห็นบันทึกเหตุการณ์ที่สร้างขึ้นในเทอร์มินัล

การสื่อสารระหว่างเทอร์มินัลอีมูเลเตอร์ (หรืออุปกรณ์เทอร์มินัลที่สอดคล้องกับเทอร์มินัลทางกายภาพ) และแอปพลิเคชันใช้ตัวอักษร เมื่อคุณกดA, terminal ได้รับข้อมูล“ Aที่สำคัญไม่มีการปรับปรุง” aแต่สิ่งที่มันจะส่งไปยังโปรแกรมประยุกต์ที่ทำงานอยู่ในสถานีที่เป็นตัวอักษร เมื่อคุณกดปุ่มฟังก์ชั่นเช่นUpหรือF1ไม่มีตัวอักษรที่ตรงกัน; เทอร์มินัลส่งลำดับอักขระที่เริ่มต้นด้วยอักขระเลี่ยง (ไบต์ 27 บางครั้งเขียน\eหรือ^[) เมื่อมีการจำลอง terminal เช่น xterm ได้รับการจัดกิจกรรมกดปุ่มที่มีMetaตัวปรับแต่งมันแปลสำคัญที่จะตัวหนีตามด้วยฟังก์ชั่นที่สำคัญของพื้นฐานเช่น\ea(หนีตัวพิมพ์เล็ก) เมื่อคุณกด+MetaA

ความแตกต่างที่แน่นอนระหว่าง 'terminal', 'shell', 'tty' และ 'console' คืออะไร? อาจเป็นพื้นหลังที่มีประโยชน์


5

เหตุการณ์สำคัญถูกสร้างขึ้นโดยเซิร์ฟเวอร์ X (ตามที่กำหนดโดยxmodmap) และถูกส่งไปยังแอปพลิเคชัน X ของคุณ เครื่องมือจัดการหน้าต่างของคุณสามารถดักจับสิ่งนี้ก่อนที่มันจะถูกส่งไปที่ xterm ในทางกลับกัน XTerm จะแปลเหตุการณ์เป็นบางไบต์และส่งไบต์ไปยัง pseudo-tty ที่จัดสรรโดยเชลล์ของคุณทุบตี

โปรดทราบว่าเหตุการณ์บางอย่างไม่ได้รับการแปลโดยตรงเป็นไบต์โดย XTerm เช่น, Ctrlและshiftปุ่ม, สร้างเหตุการณ์ X keyboard ด้วยตัวเอง, แต่ XTerm ไม่ส่งอะไรไปยังเชลล์ (หรือแอปพลิเคชั่นอื่น) ที่ทำงานอยู่ภายใน ซึ่งรวมถึงMetaกุญแจด้วยตัวเอง แต่ไม่ใช่Menuกุญแจ อย่างไรก็ตามเหตุการณ์ที่สร้างโดยการกดMeta- eจะทำให้ XTerm ส่งไบต์ 0xE5 หรือลำดับสองไบต์ 0x1B 0x65 ขึ้นอยู่กับการตั้งค่าทรัพยากร XTerm.VT100.metaSendsEscape


2

คีย์เมตาของ Bash เดิมถูกกำหนดเช่นนี้ ( lib/readline/ChangeLog):

Mon Jul 13 11:34:07 1992  Brian Fox  (bfox@cubit)
        * readline.c: (rl_variable_bind) New variable "meta-flag" if "on"
        means force the use of the 8th bit as Meta bit.  Internal variable
        is called meta_flag.

ที่เกิดขึ้นจะเป็นวิธีที่จะตีความด้วยncursesและxterm ไม่กี่ขั้วที่จัดไว้ให้สำหรับการทำอุปกรณ์เสริมคุณลักษณะนี้ (ด้านที่ไม่ได้เป็นที่แพร่หลายมากที่สุดของอาคารที่คุณจะพบการใช้พฤติกรรม hardcoded (และไม่น่าสนใจมาก) เดอะ.. terminfoเอกสารหน้าคู่มือเหล่านี้ความสามารถในสถานี:

   has_meta_key              km     km   Has a meta key
                                         (i.e., sets 8th-bit)
   meta_off                  rmm    mo   turn off meta mode
   meta_on                   smm    mm   turn on meta mode
                                         (8th-bit on)

และอธิบายคุณสมบัติ:

หากเทอร์มินัลมี "เมตาคีย์" ซึ่งทำหน้าที่เป็นปุ่ม Shift ให้ตั้งค่าบิตที่ 8 ของอักขระใด ๆ ที่ส่งผ่านความจริงข้อนี้สามารถระบุkmได้ มิฉะนั้นซอฟต์แวร์จะถือว่าบิตที่ 8 เป็นพาริตี้และโดยปกติจะถูกล้าง ถ้าสตริงที่มีอยู่เพื่อเปิดการทำงานนี้โหมด "เมตา" และปิดที่พวกเขาจะได้รับเป็นและsmmrmm

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

lib/readline/callback.c            
        - use _rl_dispatch_callback and a chain of _rl_keyseq_contexts to
          simulate the recursion used to decode multicharacter key sequences
          (even things like ESC- as meta-prefix

Meta เป็นกรณีพิเศษของคีย์ตัวปรับแต่ง ชอบcontrolและshiftคุณกดมันในเวลาเดียวกันเป็นกุญแจสำคัญอีกครั้งและคาดว่าจะเห็นบางสิ่งบางอย่างที่แตกต่างจากการกดปุ่มด้วยตัวเอง X จัดเตรียมสำหรับคีย์ตัวดัดแปลงโดยการกำหนดบิตในค่าตัวแก้ไขที่ส่งผ่านไปในเหตุการณ์ X สำหรับคีย์ การกดปุ่มสามารถเป็นเหตุการณ์ X หลายรายการได้ X จัดเตรียมฟังก์ชันสำหรับการรวมเหตุการณ์เหล่านี้ในขณะที่ยังคงตัวดัดแปลง

X กำหนดสัญลักษณ์สำหรับแต่ละปุ่มที่อาจปรากฏบนแป้นพิมพ์ของคุณ มันให้ค่าอื่น ๆ (เช่น Unicode) โดยการจัดการพิเศษในฟังก์ชั่นที่รวมเหตุการณ์

แต่ "เมตา" เป็นกรณีพิเศษ

แอ็พพลิเคชัน X ไม่มีmetaคีย์ยกเว้นโดยการประชุม X ไม่มีคำจำกัดความสำหรับคีย์เมตาหรือตัวดัดแปลงเมตา อัตภาพขั้วมองหาAlt-key และ / หรืออย่างใดอย่างหนึ่งของการปรับเปลี่ยนที่รู้จักกันไปเช่นxmodmap คุณลักษณะxkb ในmod2ภายหลังทำให้สิ่งต่าง ๆ มีความซับซ้อน (แต่ไม่ได้ปรับปรุงให้ดีขึ้นเมื่อเทียบกับการสนทนานี้) โดยการให้ข้อมูลอีกชั้นหนึ่งเพื่อค้นหากุญแจAlt

การประชุมของหลักสูตรสามารถนำคุณเพียงเพื่อให้ห่างไกลที่ได้รับค่าxmodmapมิได้xkbรู้อะไรโดยเฉพาะอย่างยิ่งเกี่ยวกับเมตา ตัวอย่างเช่น xterm สามารถกำหนดค่าได้และผู้ใช้บางคนไม่ต้องการกำหนดค่าเมตาด้วยวิธีเดียวกัน ตัวอย่างเช่นAltอาจไม่ใช่เมตาคีย์ที่ตั้งใจเช่นหากมีการใช้ในtranslationทรัพยากร ที่สำคัญอีกประการหนึ่งที่อาจจะเป็นกุญแจสำคัญ meta แต่ผู้ใช้ (โดยเฉพาะผู้ที่ใช้ลำดับหนีในทุบตี) Altอาจต้องการตัวหนีไปเมื่อผู้ใช้กด แต่โปรดจำไว้ว่าหากไม่มีการกำหนดค่าเป็นตัวดัดแปลงจะไม่มีสิ่งใดเกิดขึ้น: xterm ไม่ได้รวมเหตุการณ์เข้าด้วยกัน

xterm มีการตั้งค่าทรัพยากรหลายอย่าง (บันทึกไว้ในหน้าคู่มือ ):

  • altIsNotMetaและaltSendsEscape(เพิ่มในปี 2550 )
  • eightBitInputตั้งแต่ปี 2549สอดคล้องกับความรู้สึกดั้งเดิมของโหมดเมตาและมีลำดับการยกเว้นสำหรับสิ่งนี้ซึ่งให้ความสามารถในการเทอร์มินัลsmmและrmm(ตั้งค่า / ลบเมตาโหมด)
  • eightBitInputได้รับการแก้ไขในปี 2003เพื่อนำ UTF-8 มาพิจารณาด้วยการเปลี่ยนค่า Unicode ที่ถอดรหัสแล้วเป็น 128 แทนที่จะเป็นไบต์อินพุตดิบ
  • metaSendsEscapeวันที่จากปี 1999
  • eightBitInputmetaSendsEscapeเป็นเรื่องที่เก่ากว่า ที่มีการใช้งานตัวเลือกระหว่างโหมดเมตา (เพิ่มบิตที่แปด) หรือนำหน้าคีย์ด้วยescapeตั้งแต่ X11R4 (1989) แต่คุณสมบัติถูกกำหนดเมื่อเริ่มต้น: มันถูกตรวจสอบในระหว่างการเริ่มต้นเพื่อตรวจสอบว่าอินพุตถูกตั้งค่าให้อนุญาต 8 บิตหรือ 7 เท่านั้นหลังจากนั้นมันไม่เปลี่ยนแปลง

บางคนถือเอาสอง ( 8th-bitและ escape-prefix) ซึ่งอ้างถึงหลังเป็นโหมดเมตา ขึ้นอยู่กับมุมมองของคุณในเรื่องการeightBitInputตั้งค่าทรัพยากรของ xterm เป็นส่วนหนึ่งของการแก้ปัญหาเพื่อรับเมตาคีย์ที่ใช้การได้

อ่านเพิ่มเติม:

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