บน OS X Lion 10.7.4 ใน Terminal.app ฉันไม่สามารถพิมพ์ "CM- @" หรือ "CM-%" ได้ทำไม


3

สำหรับ MacBook Pro ที่ใช้ OS X Lion 10.7.4 ดูเหมือนว่ามีปัญหาเกี่ยวกับคีย์บอร์ด ฉันสังเกตเห็นปัญหานี้เป็นครั้งแรกเมื่อฉันพยายามใช้การเชื่อมโยงปุ่มเริ่มต้นเพื่อดำเนินการmark-sexpและquery-replace-regexpใน emacs ซึ่งถูกผูกไว้ตามลำดับC-M-@และC-M-%ตามค่าเริ่มต้น เมื่อฉันใช้ emacs มากฉันก็คิดถึงคุณสมบัติที่ทรงพลังทั้งสองนี้มาก

เนื่องจากฉันไม่เคยมีประสบการณ์เกี่ยวกับประเภทเทอร์มินัล ฯลฯ ฉันจึงทำการดีบักอย่างง่าย ๆ ภายใน emacs

  • C-M-fและC-M-bทำงานตามที่คาดไว้ ดังนั้นการควบคุมและตัวเลือกทำงานร่วมกันได้ดี
  • M-%, M-<และM->การทำงานตามที่คาดไว้ ดังนั้นตัวเลือกและเปลี่ยนทำงานร่วมกันได้ดี
  • C-S-backspaceไม่สำเร็จ. (แต่ฉันไม่เคยลองคำสั่งนี้มาก่อนครั้งแรกที่ฉันพบมันในวันนี้เมื่อฉันพบมันในคู่มือ emacs) แต่C-@ทำงานได้ตามที่คาดไว้ ดังนั้นการควบคุมและการเปลี่ยนแปลงอาจทำงานร่วมกันได้ดี
  • ถ้าฉันไม่ผิดคำสั่งdigit-argumentที่ถูกผูกไว้C-9, C-8ฯลฯ ปุ่มเหล่านี้ไม่ทำงานเช่นกัน ฉันได้ตรวจสอบให้แน่ใจว่าใน System Preferences.app ฉันได้ปิดใช้งานคีย์เหล่านี้เพื่อทำการสลับช่องว่าง

ในการตั้งค่า Terminal.app ฉันได้เลือก "ใช้ตัวเลือกเป็นเมตาคีย์" เนื่องจากมันทำให้การพิมพ์ปุ่มลัด emacs ง่ายขึ้น ฉันพยายามปิดการใช้งานตัวเลือกนี้และใช้ ESC แต่ก็ยังไม่มีประโยชน์ ความคิดใด ๆ

PS ฉันเปิดตัว X11.app และในหน้าต่าง xterm ฉันเริ่ม emacs ใช้ ESC เป็นเมตาดาต้าC-M-%และC-M-@ทำงานได้อย่างสมบูรณ์ ใน Emacs เวอร์ชัน Cocoa ทั้งสองทำงานได้อย่างสมบูรณ์แบบเช่นกัน ดังนั้นฉันคิดว่ามันเป็นข้อผิดพลาด Terminal.app หรืออาจจะมีการตั้งค่าหรือสวิตช์การกำหนดค่าฉันสามารถปรับแต่งเพื่อให้งานนี้ใน Terminal.app?

และนี่คือผลลัพธ์ของstty -aเชลล์ emacs หวังว่ามันจะมีประโยชน์ ...

bash-3.2$ stty -a
speed 9600 baud; 0 rows; 0 columns;
lflags: icanon isig iexten -echo echoe -echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost -onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = <undef>; intr = ^C; kill = <undef>;
    lnext = ^V; min = 1; quit = ^\; reprint = ^R; start = ^Q;
    status = ^T; stop = ^S; susp = ^Z; time = 0; werase = ^W;
bash-3.2$ 

คำสั่งเดียวกันโดยตรงจากเชลล์:

$ stty -a
speed 9600 baud; 24 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;
$

(ด้านข้างแสดงความคิดเห็น: ดูเหมือนแปลกที่ไวยากรณ์สำหรับการป้องกันรหัสสี่ช่องว่างก่อนที่ผู้ใช้ StackExchange ทั้งหมดคาดว่าจะทราบวิธีการใช้. paste(1), sed(1)หรือการแก้ไขสี่เหลี่ยม?)


ตามคำพูดของคุณ: ลองใช้ปุ่มที่มีเครื่องหมาย {} ในแถบเครื่องมือของตัวแก้ไข StackExchange เลือกข้อมูลโค้ดของคุณก่อน
Harald Hanche-Olsen

1
ฉันไม่รู้คำตอบสำหรับคำถามของคุณ แต่ถ้าคุณใช้ emacs“ มาก ๆ ” ทำไมคุณถึงทำบนหน้าต่างเทอร์มินัล? คุณสามารถทำให้ emacs ทำงานด้วย GUI ของตัวเองได้ คุณสามารถรับหลายรุ่นได้ที่นี่: emacsformacosx.com
Harald Hanche-Olsen

@ HaraldHanche-Olsen ใช่ในย่อหน้าที่สี่ฉันพูดถึงว่าฉันติดตั้ง emacs.app เวอร์ชัน Cocoa (GUI) แต่รุ่นนั้นมีปัญหาบางอย่างเช่นคอลัมน์ linum ที่เสียหายใน OS X Lion ความเร็วช้าเมื่อเทียบกับเทอร์มินัล ยิ่งไปกว่านั้นถ้าฉันต้องการเรียกใช้ emacs เมื่อฉัน ssh ไปยังเครื่องของฉันจากคอมพิวเตอร์เครื่องอื่น? หรือเมื่อฉันใช้ mutt (1) เพื่อส่งอีเมลหรือ git (1) เพื่อทำการเปลี่ยนแปลง?
kccqzy

รุ่นโกโก้ของ emacs นั้นโบราณใช่ไหม? สิ่งที่ฉันชี้ไปคือรุ่นต่อไปจากแหล่ง GNU emacs ล่าสุด คุณอาจต้องการลอง เมื่อคุณเข้าสู่ระบบจากคอมพิวเตอร์เครื่องอื่นมีตัวเลือกในการใช้ emacs ที่ใช้ X11 หรือถ้าคุณต้องการที่จะรันมันในเทอร์มินัลแล้ว xterm ล่ะ? ฉันคิดว่ามันช่วยให้คุณควบคุมปุ่มลัดได้มากขึ้น
Harald Hanche-Olsen

คำตอบ:


6

โดยทั่วไปแอปพลิเคชั่น Mac ที่คาดหวังว่าการป้อนข้อความจากแป้นพิมพ์จะไม่จัดการชุดค่าผสม CS หรือชุดตัวเลข C หลัก โปรแกรมที่ทำงานกับคอมโบควบคุม shift shift (เหมือนทุกอย่างที่ทำงานภายใต้ X11) ทำได้โดยการจัดการเหตุการณ์สำคัญเป็นเหตุการณ์ไม่ใช่การป้อนอักขระ นี่คือวิธีที่พวกเขาสามารถแยกความแตกต่างระหว่าง Tab และ Ctrl-i ซึ่งทั้งคู่สร้างอักขระ ASCII เดียวกัน (คุณสามารถอ่านรายละเอียดว่า Lion (โกโก้จริงๆ) จัดการกับเหตุการณ์สำคัญได้อย่างไรหากคุณต้องการทราบจริงๆ)

ในอดีต (ย้อนกลับไปในวัน Teletype) มีเพียงตัวอักษรตัวพิมพ์ใหญ่บนแป้นพิมพ์และไม่มีเครื่องหมายรูปหมวก (^) หรือเครื่องหมายขีดล่าง (_) บนแป้นพิมพ์ (แทนที่จะมีลูกศรขึ้นและลูกศรกลับ) ปุ่ม Shift ทำงานโดยการสลับบิต 16 และปุ่มควบคุมทำงานโดยการใส่รหัส ASCII 7 บิตแบบ 64 บิตที่ 64 บิตของคีย์บอร์ดที่ผลิต

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

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

ในขณะที่ปัญหาได้รับการจัดการโดยมีปุ่มควบคุมยังเป็นศูนย์ออกบิต 32 ซึ่งเป็นสิ่งที่แตกต่างตัวอักษรตัวพิมพ์เล็กจากตัวอักษรตัวพิมพ์ใหญ่ แต่ในที่สุด ASCII ก็ถูกแทนที่ด้วย Unicode และการกำหนดคีย์ซ้ำเหล่านั้นเสียพื้นที่แป้นพิมพ์มากเกินไปที่จะได้รับอนุญาตให้ดำเนินการต่อดังนั้นพวกเขาจึงมีการแมปที่แตกต่างกันและบนคีย์บอร์ดมาตรฐาน US US คอมโบ CS ส่วนใหญ่จะไม่ถูกมอบหมาย

ดังนั้นสิ่งที่คุณต้องทำคือการสนับสนุนแบบเดิมสำหรับอินพุตคีย์บอร์ดที่ใช้งานได้นานถึง Teletype days อักขระเทอร์มินัล (และแอพ OS X อื่น ๆ ) ไม่รองรับคือตัวอักษรที่คุณไม่สามารถพิมพ์บนคีย์บอร์ด Teletype จากหลักฐานนี้โปรดทราบว่า CS-2 (C- @), CS-6 (C- ^) และ CS-- (C-_) ทำงานทั้งหมดเนื่องจากคีย์เหล่านั้นถูกแมปใหม่ตั้งแต่ ASR-33 โดยที่ S-2 คือ "(และ @ คือ SP), S-6 คือ &, และ S-- คือ =, แต่โดยทั่วไปคอมโบเปลี่ยนชุดควบคุมจะไม่สร้างตัวละครทุกชนิด


คำตอบที่ดี! ในความเป็นจริงค่อนข้างอ่านสนุกและการศึกษาที่มีรายละเอียดทางประวัติศาสตร์ที่อธิบายอย่างชัดเจนว่าทั้งหมดนี้เกิดขึ้นได้อย่างไร แม้ว่ามันจะไม่ได้เป็นทางออก แต่ฉันก็ค่อนข้างพอใจกับคำตอบนี้
kccqzy

1
@ kccqzy ฉันลืมที่จะพูดถึงว่าdigit-argumentมันถูกผูกไว้กับ M- หลัก (และแน่นอน Cu) และคุณควรตรวจสอบiTerm2แทน Terminal ฉันยังไม่ได้ลอง แต่ฉันคิดว่ามันจัดการกับคีย์บอร์ดตามที่ Emacs ต้องการ
โปรเก่า

ใช่ฉันเดาว่าคนส่วนใหญ่คุ้นเคยกับการเรียกใช้digit-argumentM-digit และฉันก็เช่นกันฉันใช้ M-digit มาเป็นเวลานานโดยไม่ทราบว่า C-digit นั้นถูกกล่าวถึงในคู่มือด้วย iTerm2 ดูมีแนวโน้ม ใช้การตั้งค่าเริ่มต้นใช้ESC C-@งานได้ แต่ไม่ใช่ESC C-%แต่ฉันคิดว่ามันน่าจะเป็นไปได้ที่จะปรับแต่งนี้ ขอบคุณ!
kccqzy

พบบทความที่ยอดเยี่ยมบนเว็บ แต่เขียนเป็นภาษาญี่ปุ่น: bit.ly/tLOFe1พยายาม Google แปลภาษาและเข้าใจสิ่งที่พูดถึงเป็นส่วนใหญ่ การใช้event-apply-modifierเป็นความคิดที่ดีอย่างแท้จริง เมื่อรวมกับ iTerm2's (ขอขอบคุณเป็นความสามารถส่วนหนึ่งของซอฟต์แวร์ที่ยอดเยี่ยม) ในการส่งเลขฐานสิบหกโดยพลการพร้อมลำดับสำคัญใด ๆ ฉันสามารถC-M-%ทำงานได้อย่างถูกต้อง (ในที่สุด) แต่สิ่งที่แปลกคือC-M-@ไม่ทำงาน ค่อนข้างลึกลับดังที่ emacs บอกC-M-@ว่าไม่ได้กำหนดไว้เมื่อฉันใช้describe-keyแต่ESC C-@ใช้ได้ผล
kccqzy

0

เพียงแบ่งปัน

ฉันพยายามปรับแต่งคีย์เหล่านั้นและเปลี่ยนoptionไปcommandเป็นmetaแต่ไม่ประสบความสำเร็จ

สิ่งที่ฉันรู้คือ Terminal.app ไม่รู้จักปุ่ม 4 พร้อมกัน หรืออย่างน้อยฉันก็คิดว่ามันไม่ได้

อย่างไรก็ตามสิ่งนี้อาจช่วยให้คุณตั้งค่าการเชื่อมโยงคีย์ผ่านซอฟต์แวร์

ฉันยังพบการสนทนาอื่น ๆ ที่เกี่ยวข้องกับเรื่องนี้เช่นกัน

(btw digit-argumentทำงานร่วมกับ M- {1..9} ไม่ได้กับ C- {1..9} เช่นที่กล่าวถึงแปลก ๆ )

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