ปัญหาเกี่ยวกับปุ่มลัดเมื่อใช้งานเทอร์มินัล


30

ฉันมีบรรทัดต่อไปนี้ในinit.el:

(global-set-key [(control \;)] 'comment-region)

มันทำงานได้ดีมากในหน้าต่าง GUI แต่ถ้าemacsถูกเรียกด้วย-nwตัวเลือกนั้นC-;จะไม่แสดงความคิดเห็นในภูมิภาคให้ใส่เฉพาะ;อักขระเท่านั้น M-x comment-region RETทำงานได้ดี แต่

ฉันพยายามทำตามคำตอบนี้กับปัญหาที่คล้ายกัน แต่C-q C-;ผลตอบแทนเพียงและฉันเห็นได้ชัดว่าไม่ต้องการที่จะผูกเปลือย;;

วิธีการบรรลุผลที่ต้องการ?


4
เป็นไปได้ว่าเทอร์มินัลของคุณ (คุณกำลังใช้อะไรอยู่) ไม่รู้จักลำดับคำสั่งนั้น ลองใช้C-;คอมโบแล้วใช้M-x view-lossageดูว่ามันถึง Emacs หรือไม่
ด่าน

ฉันกำลังใช้gnome-terminalและM-x view-lossageส่งคืน:ESC [ > 1 ; 2 8 0 2 ; 0 c ; ESC x v i e w - l o s s a g e RET
WeSenseASoulInSearchOfAnswers

3
ดูเหมือนว่าปัญหาขั้ว: หากการรวมกันที่สำคัญได้ถึง Emacs มันจะดูเหมือนC-;มากกว่าc ;(หรืออย่างน้อยฉันได้รับC-;)
แดน

@ ด่าน: คุณช่วยตอบคำถามนี้ได้ไหม? นั่นจะทำเครื่องหมายคำถามว่าตอบแล้วทำให้ง่ายขึ้นที่จะเห็นวิธีแก้ปัญหาซึ่งดีสำหรับคนอื่นที่มีปัญหาเดียวกัน ขอบคุณ!
Tikhon Jelvis

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

คำตอบ:


17

ก่อนอื่นปัญหาที่พบบ่อย: เทอร์มินัลอีมูเลเตอร์มักถูก จำกัด ในลำดับการควบคุมและหลบหนีที่สามารถส่งได้ ดังนั้นอาจเป็นไปได้ว่าเทอร์มินัลกลืนตัวละครพิเศษของคุณก่อนที่จะถึง Emacs เป็นการวินิจฉัยทั่วไปคุณสามารถกดC-h l(หรือM-x view-lossage) เพื่อดูว่าการผสมคีย์ของคุณทำให้เป็น Emacs หรือไม่

สำหรับการอภิปรายเพิ่มเติมของปัญหานี้ให้ดูที่หัวข้อ Stack Overflowและลิงก์ในนั้น

ในการสรุปการกลับไปกลับมาในความคิดเห็นปัญหาเฉพาะของคุณแนะนำว่ามันเป็นเทอร์มินัลแทนที่จะเป็น Emacs ที่เป็นปัญหา เมื่อคุณพยายามC-;แล้วที่คุณได้M-x view-lossage blah blah blah c ; ESC v i e w - l o s s a g e RETที่ดูเหมือนว่าปัญหาขั้ว: ถ้าคีย์ผสมถูกถึง Emacs ที่ส่วนหนึ่งจะมีลักษณะc ;C-;


33

ในShift + Up Emacs ไม่รู้จักในเทอร์มินัลฉันอธิบายว่าเทอร์มินัลแปลปุ่มฟังก์ชั่นส่วนใหญ่เป็นลำดับการหลบหนีได้อย่างไรเนื่องจากอินเตอร์เฟสระหว่างแอปพลิเคชันและเทอร์มินัลส่งอักขระ (หรือค่อนข้างไบต์) การรวมตัวดัดแปลง + ชุดอักขระเพียงไม่กี่ตัวมีตัวละครของตัวเอง:

  • Ctrlบวกตัวอักษรหรือหนึ่งใน@[\]^_ผลัดกันเป็นไบต์ 0–31 (อักขระควบคุม ASCII )
  • บ่อยครั้งที่Ctrl+ ?กลายเป็นไบต์ 127 และCtrl+ Spaceเท่ากับCtrl+ @(ไบต์ 0)
  • บางปุ่มฟังก์ชันเทียบเท่ากับการควบคุมตัวอักษร: Tab= Ctrl+ I, Return= Ctrl+ M, Esc= +Ctrl[
  • และBackspace= Ctrl+ HหรือCtrl+ ?ขึ้นอยู่กับการกำหนดค่า Ctrl+ ?สะดวกยิ่งขึ้นสำหรับ Emacs เนื่องจากCtrl+ Hเป็นความช่วยเหลือ
  • Meta+ characterจะถูกส่งเป็นEscตามด้วยตัวอักษร

ดังนั้นสิ่งที่เกี่ยวกับชุดอื่น ๆ เช่นCtrl+ ;หรือCtrl+ Shift+ letter? เนื่องจากไม่มีอักขระที่สอดคล้องกันเทอร์มินัลจึงต้องนำอักขระมาใช้ซ้ำหรือส่งลำดับการหลีกเลี่ยง เทอร์มินัลจำนวนมากเพิกเฉยต่อตัวดัดแปลงเมื่อไม่มีตัวอักษรที่สอดคล้องกันดังนั้นคุณจะได้Ctrl+ ;ส่ง;, Ctrl+ Shift+ letterเทียบเท่ากับCtrl+ letterฯลฯ

ผู้ขายเทอร์มินัลยังคงทำสิ่งที่ง่ายมาเป็นเวลานาน ไม่มีมาตรฐานสำหรับ escape sequences ซึ่งเป็นแบบถาวรด้วยตนเอง - ผู้จำหน่ายเทอร์มินัลไม่ใช้มันแอปพลิเคชันไม่รองรับผู้ใช้ไม่คาดหวัง เทอร์มินัลอีมูเลเตอร์บางตัวสามารถกำหนดค่าให้ส่งลำดับ escape ตามอำเภอใจดังนั้นหากคุณทำได้คุณสามารถกำหนดค่าและประกาศลำดับเอสเคปไปที่ Emacs (เพิ่มเติมในภายหลัง)

เมื่อเร็ว ๆ นี้สถานการณ์กำลังเปลี่ยนแปลงไปเนื่องจากมีข้อเสนอสองรายการที่จะสร้างมาตรฐานในลำดับการยกเว้น หนึ่งคือlibtermkey LeoNerd ของกับไวยากรณ์ อีกประการหนึ่งคือxterm โทมัสผ้ากันเปื้อนกับไวยากรณ์ เวอร์ชันปัจจุบันของ xterm (≥216) สามารถกำหนดค่าสำหรับไวยากรณ์ใดก็ได้โดยการตั้งค่าทรัพยากร ต้องเปิดใช้งานคุณสมบัตินี้โดยตั้งค่าเป็นค่าที่ไม่ใช่ศูนย์ESC [ codepoint ; modifier uESC [ 2 7 ; modifier ; codepoint ~formatOtherKeysmodifyOtherKeys

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

ตั้งแต่ Emacs 24.4 Emacs จะเปิดmodifyOtherKeysคุณสมบัติโดยอัตโนมัติเมื่อตรวจพบว่าเทอร์มินัลคือ xterm เวอร์ชั่น≥216 การตรวจสอบ Emacs local-function-key-mapของลำดับหนีคีย์การเข้ารหัสทำงานผ่านตัวแปร ในฐานะของ Emacs 24.4 ไม่สนับสนุนลำดับการยกเว้นทั้งหมด คุณสามารถใช้รหัสต่อไปนี้ในไฟล์ init เพื่อทำงานให้เสร็จสมบูรณ์

;; xterm with the resource ?.VT100.modifyOtherKeys: 1
;; GNU Emacs >=24.4 sets xterm in this mode and define
;; some of the escape sequences but not all of them.
(defun character-apply-modifiers (c &rest modifiers)
  "Apply modifiers to the character C.
MODIFIERS must be a list of symbols amongst (meta control shift).
Return an event vector."
  (if (memq 'control modifiers) (setq c (if (or (and (<= ?@ c) (<= c ?_))
                                                (and (<= ?a c) (<= c ?z)))
                                            (logand c ?\x1f)
                                          (logior (lsh 1 26) c))))
  (if (memq 'meta modifiers) (setq c (logior (lsh 1 27) c)))
  (if (memq 'shift modifiers) (setq c (logior (lsh 1 25) c)))
  (vector c))
(defun my-eval-after-load-xterm ()
  (when (and (boundp 'xterm-extra-capabilities) (boundp 'xterm-function-map))
    (let ((c 32))
      (while (<= c 126)
        (mapc (lambda (x)
                (define-key xterm-function-map (format (car x) c)
                  (apply 'character-apply-modifiers c (cdr x))))
              '(;; with ?.VT100.formatOtherKeys: 0
                ("\e\[27;3;%d~" meta)
                ("\e\[27;5;%d~" control)
                ("\e\[27;6;%d~" control shift)
                ("\e\[27;7;%d~" control meta)
                ("\e\[27;8;%d~" control meta shift)
                ;; with ?.VT100.formatOtherKeys: 1
                ("\e\[%d;3u" meta)
                ("\e\[%d;5u" control)
                ("\e\[%d;6u" control shift)
                ("\e\[%d;7u" control meta)
                ("\e\[%d;8u" control meta shift)))
        (setq c (1+ c))))))
(eval-after-load "xterm" '(my-eval-after-load-xterm))

หากTERMไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมเป็นxtermหรือตัวแปรเช่นxterm-256colorEmacs จะไม่เปิดใช้งานลำดับเหล่านั้น หาก Emacs แล้วมีการสนับสนุนค่าของคุณTERMคุณสามารถเพิ่มการสนับสนุนด้วยการกำหนดฟังก์ชั่นเดียวกับที่ดังกล่าวข้างต้นจะได้รับการดำเนินการหลังจากการโหลดไฟล์เสียงกระเพื่อมที่มีชื่อคือค่าของ TERMหาก Emacs ไม่มีการสนับสนุนดังกล่าวคุณสามารถเพิ่มได้โดยการสร้างไดเรกทอรีย่อยที่เรียกว่าtermหนึ่งในของคุณload-pathและสร้างไฟล์เสียงกระเพื่อมเรียกว่าterm/$TERM.elที่$TERMคุ้มค่าของการกำหนดฟังก์ชั่นที่เรียกว่าTERMterminal-init-$TERM

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


2
คำตอบของคุณในเรื่องนี้ยอดเยี่ยมเสมอกิลส์ ชื่นชมมาก
phils

ที่ดี !. แม้ว่าฉันจะมีเวลาค่อนข้างยากในการหาวิธีที่จะทำให้ urxvt ส่งลำดับเหล่านั้น คุณมอบมือให้ฉันได้ไหม :)
Amos

@Amos ฉันไม่ได้ใช้ rxvt คุณควรถามUnix & Linuxเกี่ยวกับวิธีทำให้ urxvt ส่ง escape sequences เดียวกับ xterm พร้อมกับ modifiedOtherKeys
Gilles 'หยุดความชั่วร้าย' ใน

ไม่ทำงานบน macOS xterm-256color M-C-%ได้รับการยอมรับให้ESC 5
LoranceChen

@LoranceChen นั่นเป็นลักษณะการทำงานที่คาดว่าจะเกิดขึ้นหากmodifyOtherKeysคุณสมบัติไม่ทำงาน โปรดทราบว่ารองรับ xterm รุ่นล่าสุดมากพอและเปิดใช้งานโดยอัตโนมัติตั้งแต่ Emacs 24.4 ฉันไม่ทราบว่า OSX มาพร้อมกับเวอร์ชันล่าสุดหรือไม่ หากไม่เป็นเช่นนั้นและไม่ได้ผลสำหรับคุณฉันขอแนะนำให้คุณถามคำถามใหม่ พูดถึงรุ่นที่คุณใช้อยู่
Gilles 'หยุดความชั่วร้าย'

2

คำตอบของ Gilles ระบุไว้: On OSX, you can configure iTerm2 by selecting an escape sequence for each key combination, one by one. ฉันมีปัญหาเล็กน้อยในการไปที่นั่นดังนั้นนี่คือคำอธิบายโดยละเอียดในกรณีที่คุณเป็นเหมือนฉันสับสน

หากเมื่อรัน Emacs ในเทอร์มินัล (เช่น Terminal.app ที่เป็นค่าเริ่มต้นของ Mac) C-x C-;จะไม่ทำงานcomment-lineและคุณต้องการฟังก์ชั่นนั้นคุณต้องเปลี่ยนเป็น iTerm2 (Terminal.app ไม่มีความสามารถ) และสร้าง Key Mapping ภายใต้โปรไฟล์ ... คีย์ดังต่อไปนี้:

^;     ^[[59;5u

สามารถทำได้โดยคลิกที่+ปุ่มซึ่งจะปรากฏหน้าต่างเล็ก ๆ ชื่อว่า "Keyboard Shortcut"; หน้าต่างนี้มีสองช่องเริ่มต้น; ด้านบนมีค่าเป็น "Click to Set" และด้านล่างมีค่าเป็น "Ignore" C-;คลิกที่ปุ่มด้านบนและพิมพ์ ชุดนี้เป็นการรวมคีย์ที่จะเรียกใช้การกระทำและรหัส คลิกฟิลด์ด้านล่าง "การกระทำ" และค้นหาและคลิกที่ "ส่งลำดับการหลบหนี" ซึ่งลงครึ่งทางมากกว่าเล็กน้อย หลังจากคุณคลิกที่ฟิลด์ที่สามจะปรากฏขึ้นชื่อ "Esc +" ภายในฟิลด์นี้พิมพ์:

[59;5u

59เป็นรหัสทศนิยม ASCII จุลภาคของและเป็นรหัสสำหรับ5 Ctrlจากนั้นกด "ตกลง" เพื่อเสร็จสิ้น คำสั่งผสมคีย์ที่ถูกต้องกับลำดับคีย์จะรวมอยู่ในค่ากำหนดของ iTerm2 เมื่อคุณเริ่มใช้งาน Emacs ใน iTerm ตอนนี้คุณจะสามารถเข้าถึงการใช้C-x C-;งานได้แล้ว

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