ใช้ Super in emacs -nw ใน linux


15

ฉันพยายามดิ้นรนหาคำถามที่ง่ายและตรงกับคำตอบดังนั้นฉันจึงตัดสินใจถามที่นี่

ถาม:มีวิธีใช้ Super in Emacs ที่เปิดตัวใน Terminal ใน Linux หรือไม่?

PS : ฉันอ่านข้อมูลจำนวนมากเกี่ยวกับxmodmapแต่ฉันคิดว่ากุญแจคือเทอร์มินัลอีมูเลเตอร์ไม่สามารถแสดงถึงคีย์ Super อย่างไรก็ตามผลตอบแทนบางสิ่งบางอย่างและฉันก็คิดว่าการใช้สิ่งอำนวยความสะดวกของการแปล(kbd "s-SPC") .Xdefaults/Xฉันอยู่บนเส้นทางที่ถูกต้องหรือไม่? จากผลของkbdสิ่งที่ฉันต้องทำในฐานะ XTerm.VT100.translations

คำตอบ:


21

คุณจะสะดวกสบายมากขึ้นใน X11 Emacs ซึ่งสามารถรับการป้อนข้อมูลแป้นพิมพ์และข้อความที่แสดงโดยไม่ต้องผ่านการเข้ารหัสและการถอดรหัสสำหรับขั้ว เหตุผลหลักในการใช้โปรแกรมแก้ไขโหมดข้อความคือการเรียกใช้ภายในหน้าจอหรือ tmux บนเครื่องระยะไกล แต่ต้องขอบคุณ Tramp ซึ่งโดยปกติแล้วการแก้ไขไฟล์ระยะไกลใน Emacs ในพื้นที่ของคุณจะทำได้ง่ายกว่า คุณสามารถทำสิ่งที่คุณต้องการตราบใดที่เทอร์มินัลอีมูเลเตอร์ของคุณร่วมมือซึ่งเป็นกรณีของ Xterm

เมื่อคุณกดปุ่มหรือคีย์ผสมในเทอร์มินัลจะถูกส่งไปยังแอปพลิเคชันที่ทำงานในเทอร์มินัลตามลำดับอักขระหนึ่งตัวหรือมากกว่า ตัวอย่างเช่นเมื่อคุณกดแอพลิเคชันที่ได้รับa aเมื่อคุณกดEnterแอพลิเคชันที่ได้รับตัวละครCR(aka ^M(ออกเสียง“ควบคุม EMM”) หรือที่รู้จักตัวละครจำนวน 13 อาคา\rหรือ\015) คีย์ผสมที่เกี่ยวข้องAltจะถูกส่งมักจะเป็นตัวอักษรESC( a.ka. ^[aka \eหรือ\033) Altตามด้วยลำดับสำหรับคีย์หรือการรวมกันโดยไม่ต้องคีย์ ปุ่มฟังก์ชั่และชุดอื่น ๆ ที่สำคัญจะถูกส่งเป็นลำดับหนีเริ่มต้นด้วยหรือ\e[\eO

ลำดับ escapes ไม่ได้มาตรฐานอย่างสมบูรณ์และโดยทั่วไปแล้วเทอร์มินัลจะไม่สนใจคุณลักษณะบางอย่างสำหรับคีย์บางอย่าง ตัวอย่างเช่นตัวดัดแปลงไฮเปอร์และซุปเปอร์มักจะถูกละเว้น คุณสามารถเห็นสิ่งที่เทอร์มินัลของคุณส่งสำหรับชุดคีย์โดยกดCtrl+ Vตามด้วยชุดคีย์ในเชลล์พรอมต์หรือC-qหรือC-h cตามด้วยชุดคีย์ใน Emacs

xterm ช่วยให้คุณสามารถกำหนดค่าลำดับหนีสำหรับแต่ละคีย์ผ่านทรัพยากร X การตั้งค่าส่วนใหญ่จะอ่านทรัพยากรจาก~/.Xresourcesเมื่อ X เริ่มทำงานและคุณสามารถโหลดไฟล์ด้วยตนเองxrdb -merge ~/.Xresourcesได้

XTerm.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <Key> Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <Key> percent: string("\033[37;6~")

หลักการทั่วไปใช้ลำดับการยกเว้นของฟอร์มESC [ number1 ; number2 ~สำหรับปุ่มฟังก์ชันที่มีตัวดัดแปลง number1แสดงให้เห็นปุ่มฟังก์ชัน ( 15เพื่อ24สำหรับF5การF12- สำหรับเหตุผลทางประวัติศาสตร์ F1 ผ่านF4มีลำดับหนีแตกต่างกัน) และnumber2แสดงให้เห็นเครื่องปรับ ( 2สำหรับShift, 5สำหรับCtrl, 3สำหรับMeta, 8สำหรับCtrl+ Metaและเพิ่ม 1 สำหรับ + Shift- ไม่มันไม่สอดคล้องมาก)

คุณจะต้องระบุไฮเปอร์และซูเปอร์ปรับเปลี่ยนผ่านหมายเลขของพวกเขาเช่นผ่านMod1 Mod5รันxmodmap -pmเพื่อดูการแม็พของ keysyms กับตัวดัดแปลง ตัวอย่างเช่นหากSuper_Lผูกพันกับ Mod5 ดังนั้นบรรทัดต่อไปนี้ (ใช้กรณีที่แน่นอนนี้) จะกำหนดการรวมสำหรับSuper+ Space:

    ~Ctrl ~Meta Mod5 <Key> space: string("\033[32;16~") \n\

Emacs แปล escape sequences เป็นการนำเสนอคีย์ภายในผ่านinput-decode-mapหรือlocal-function-key-map (หรือfunction-key-mapก่อน Emacs 23)

(define-key local-function-key-map "\033[32;16~" [(super ?\ )])

โพสต์นี้ทำจากวัสดุรีไซเคิล 80% จากมีขั้ว linux ใดบ้างที่สามารถจัดการชุดคีย์ทั้งหมดได้


นี่เป็นคำตอบที่ดีครอบคลุมความรู้ทั้งหมดที่ฉันพบกระจัดกระจาย แค่คำถามเดียว: คุณหาได้ที่ไหน / คุณเลือก 32; 16 ~ และทำไมมันไม่ตรงกับ emacs ด้านล่าง? ผมเข้าใจที่มาของตัวเลข แต่ผมอยากจะถามคุณว่าคุณสามารถเชื่อมโยงไปยังที่ใดที่หนึ่งตาราง mapping สำหรับตัวเลข 1และตัวเลข 2
Andrea Richiardi

@AndreaRichiardi ฉันเลือก 32 เพราะเป็นค่า ASCII / Unicode สำหรับอักขระช่องว่างและ 16 เนื่องจากการผูกมาตรฐานใช้ค่าสูงสุด 8 สำหรับ Ctrl, Meta และ Shift 33 ด้านล่างเป็นตัวพิมพ์ผิด คุณสามารถเลือกอะไรก็ได้ตราบใดที่มันไม่ขัดแย้งกับปุ่มอื่น
Gilles 'หยุดชั่วร้าย'

(global-set-key "\033[32;16~" 'set-rectangular-region-anchor)ผมต้องผูกลำดับเพื่อฟังก์ชั่นเพื่อให้ฉันแก้ไขด้วยชั่วขณะ แต่เพื่อให้เสร็จสมบูรณ์ฉันลองใช้วิธีการdefine-keyด้านบน แต่ไม่สามารถเรียก(global-set-key (kbd "s-SPC") 'set-rectangular-region-anchor)ได้ มันเป็นเพียงการพิมพ์ 16 ~ ในบัฟเฟอร์ มันจะเป็นการดีที่จะผูกลำดับนั้นกับ (kbd "s-SPC") เพื่อที่ฉันจะได้ลำดับคีย์ที่ถูกผูกไว้และฉันสามารถกำหนดมันให้กับคำสั่งอื่นได้อีกครั้ง
Andrea Richiardi

C-h lส่งกลับค่าต่อไปนี้เมื่อกด s-SPC ทันที ESC [ 3 2 ; 1 6 ~แต่ emacs ยังคงบ่นว่าM-[ 32 is undefined
Andrea Richiardi

@AndreaRichiardi หลังจากแก้ไขข้อผิดพลาดเพิ่มเติมในส่วน xterm (ซึ่งคุณดูเหมือนว่าจะได้รับการแก้ไขเนื่องจาก Emacs ได้รับลำดับตัวละครที่ตั้งใจ) มันใช้งานได้สำหรับฉัน มันใช้งานได้ถ้าคุณใช้function-key-mapแทนlocal-function-key-map? อาจเป็นเรื่องของเมื่อคุณตั้งค่าlocal-function-key-mapเนื่องจากมันขึ้นอยู่กับเทอร์มินัล
Gilles 'หยุดความชั่วร้าย'

0

หากคุณยินดีที่จะติดตั้งแพคเกจ Emacs และกำหนดค่าเทอร์มินัลของคุณฉันเขียนแพ็คเกจ Emacs ซึ่งสามารถสอน Emacs และเทอร์มินัลได้ว่าจะจำแป้นคีย์บอร์ดพีซีทั้งหมดและปุ่มตัวดัดแปลงคีย์ได้อย่างถูกต้องหรือไม่

https://github.com/CyberShadow/term-keys

การเข้ารหัสซุปเปอร์โมเดอเรเตอร์ไม่ได้ถูกเปิดใช้งานตามค่าเริ่มต้น แต่แพ็คเกจนั้นสามารถปรับแต่งได้และอนุญาตให้กำหนดค่าการรวมคีย์คีย์ของตัวดัดแปลง หากต้องการเปิดใช้งานการเข้ารหัสคีย์ผสมที่มีตัวปรับแต่งพิเศษให้ตั้งค่าterm-keys/want-key-p-funcเป็นฟังก์ชันที่ส่งคืนtเมื่อ(elt mods 3)ไม่มีข้อมูล (ดูการใช้งานเริ่มต้นสำหรับคำอธิบาย)


0

ฉันมีสิ่งต่อไปนี้ในไฟล์ init ของฉัน:

(global-set-key [f7] nil)
(global-set-key [f8] nil)
(define-key function-key-map [(f7)] 'event-apply-super-modifier)
(define-key function-key-map [(f8)] 'event-apply-hyper-modifier)

สิ่งนี้ทำให้ฉันสามารถส่งปุ่มซุปเปอร์และไฮเปอร์ได้โดยใช้ปุ่มฟังก์ชั่น


-1

คำตอบสั้น: Konsoleการใช้งาน

คำอธิบาย:

  • Emacs' local-function-key-mapมีการทำแผนที่รายการเพื่อC-x @ sevent-apply-super-modifier
  • Konsoleแม็พSuper(ปุ่มโลโก้ Windows) ไปยังลำดับการหลบหนี^X@s(ซึ่งดูเหมือนว่าจะไม่มีการบันทึกไว้ที่ใดเลยฉันค้นพบโดยบังเอิญ) คุณสามารถลองนี้โดยการเปิดและกดเช่นKonsoleCtrl-v Win-o

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