เป็นไปได้หรือไม่ที่จะให้ ESC ทำงานเป็นคีย์ Escape จริง


3

ในที่สุดฉันก็เปลี่ยนมาใช้ Emacs ไม่มากนักเพราะฉันยังเชื่อว่ามันเป็นตัวแก้ไขที่ดีกว่า แต่ในตัวมันเองมีส่วนขยายที่ทรงพลังกว่าอย่างแน่นอน ฉันยังใช้อยู่ เสียงเรียกเข้าโหมด แม้ว่าบางทีนั่นอาจเป็นส่วนหนึ่งของปัญหาของฉัน ... แต่ฉันไม่ได้ตั้งใจจะละทิ้งโหมด - วิธีดังนั้นฉันอาจจะอยู่กับมัน

ฉันเข้ากันได้ดี แต่สิ่งหนึ่งที่ฉันคิดว่าน่ากลัวจริงๆก็คือพฤติกรรมของ ESC กุญแจ (ที่ฉันมีใน กะล็อค ตำแหน่ง). ฉันเคยใช้สิ่งนี้มากเท่ากับ "ปุ่มตกใจ" ซึ่งอาจไม่ดี แต่ฉันพบว่าอนุญาตให้ฉันทำงานโดยทั่วไปแล้วการดูแลการกดแป้นพิมพ์ของตัวเองค่อนข้างน้อยลงและเร็วขึ้น

สิ่งที่ฉันต้องการให้กุญแจนี้ทำก็คือนำฉันออกจาก minibuffer หรือโหมดการแก้ไขพิเศษใด ๆ ในสถานะปกติที่กำหนดไว้อย่างดี บางทีสิ่งที่สำคัญที่สุดฉันต้องการมัน ไม่ ทำอะไรที่ไม่เกี่ยวข้อง

  • แกล้งทำ เมตา . ฉันมีอะไร Alt สำคัญสำหรับ
  • ปิดหน้าต่างฉันไม่ได้อยู่ในเวลานั้น
  • การตีความหมายว่าเป็นคีย์สุดท้ายในบางลำดับของคีย์
  • ...

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

อีกวิธีหนึ่งมีตัวเลือกต่าง ๆ ที่เหมาะกับเวิร์กโฟลว์ของฉันหรือไม่


1
@Memming: ฉันไม่ได้หมายถึง "abort key" ฉันไม่ได้หมายถึง "close the there key" ฉันไม่ได้หมายความว่า "do do key key" ฉันหมายถึง "เอาฉันออกไปจากที่นี่ด้วยความยุ่งเหยิงที่น้อยที่สุดเท่าที่จะทำได้" ออก เป็นโหมดแก้ไขมาตรฐานซึ่งทุกอย่างทำงานเหมือนที่ฉันเคยทำ ในกลุ่ม ESC ค่อนข้างดีในการนำฉันไปที่โหมดปกติเมื่อเป็นไปได้ ใน Emacs นี่มักจะล้มเหลวเนื่องจากมันตีความคีย์ในวิธีอื่นที่ฉันไม่คาดคิด
leftaroundabout

ฉันเห็น. ขออภัยไม่เข้าใจคำถามของคุณอย่างถูกต้อง ตอนนี้ฉันเข้าใจแล้ว
Memming

ใน Emacs ปุ่ม Esc ทำหน้าที่ "บางอย่าง" ดังนั้นคุณต้องตัดสินใจว่าฟังก์ชั่นและสถานการณ์ที่คุณต้องการให้ทำอะไรและปิดการใช้งานสำหรับสถานการณ์อื่น ๆ ทั้งหมด
lawlist

บางทีคุณอาจทำการแมปปุ่มล็อคของคุณใหม่ C-g หรือ ESC ESC ESC (สิ่งหลังทำออกจากสิ่งต่าง ๆ ส่วนใหญ่ใน Emacs) แต่ถ้าอย่างนั้นคุณต้องใช้อย่างอื่นในโหมดปกติของ Vi เช่น C-c (หากได้รับการสนับสนุนโดยโหมด vim)
echristopherson

ฉันใส่ (global-set-key (kbd "M-C-g") 'vim:activate-normal-mode) ในของฉัน .emacs และสิ่งต่าง ๆ ใช้งานได้อย่างน่าพึงพอใจในตอนนี้แม้ว่าจะมี "boilerplate-ish" จำนวนมาก C-g ESC การรวมกัน
leftaroundabout

คำตอบ:


1

พฤติกรรมที่คุณกำลังมองหานั้นเป็นตัวเป็นตนในฟังก์ชั่น Emacs Lisp keyboard-quitถูกผูกไว้โดยค่าเริ่มต้นเป็น C-g (ควบคุมกรัม) พฤติกรรมของมันเทียบเท่ากันในบริบทของ Emacs กับการทำงานปกติ C-c ในเปลือก; มันจะขัดจังหวะสิ่งที่รหัส Lisp กำลังทำงานอยู่และวางคุณกลับไปที่ระดับบนสุด (โดยเฉพาะอย่างยิ่งถ้าคุณได้รับพร้อมท์ให้ป้อนข้อความใน minibuffer และตัดสินใจว่าคุณไม่ต้องการทำสิ่งที่มันกระตุ้นให้คุณ C-g เป็นวิธีที่คุณยกเลิก)

โดยค่าเริ่มต้นการกดปุ่ม Escape ครั้งเดียวจะทำหน้าที่เป็นคีย์คำนำหน้า Meta นั่นคือการผูกคีย์ที่เกี่ยวข้องกับคีย์ Meta (เช่น M-x, execute-extended-command ) จะทำงานเช่นกันหากคุณกด Alt-x หรือหากคุณกด Escape จากนั้นกด X - Emacs จะไม่แยกความแตกต่าง กดปุ่ม Escape สามครั้งจะทำงาน keyboard-escape-quitซึ่งก็เหมือน keyboard-quit แต่ด้วยพฤติกรรม "ทำในสิ่งที่ฉันหมายถึง" - สิ่งที่ฉันไม่เคยต้องการในการใช้ Emacs มาหลายปีแล้วและไม่รู้จริงๆจนกระทั่งเมื่อไม่กี่นาทีก่อน แต่คุณอาจพบว่ามันมีประโยชน์

การพูดในสิ่งที่คุณอาจพบว่ามีประโยชน์: คุณสามารถรับเอกสารเกี่ยวกับฟังก์ชั่น Emacs ผ่านทาง describe-function ฟังก์ชั่นที่เรียกว่า C-h f FUNCTION-NAME RET (นั่นคือกดและปล่อย Control-h กด f พิมพ์ชื่อฟังก์ชั่นที่พรอมต์กด Return) หรือ M-x describe-function RET FUNCTION-NAME RET. สำหรับตัวแปรมันเหมือนกันยกเว้น C-h v หรือ describe-variableรวมถึงชื่อตัวแปร สำหรับการกดแป้นมัน C-h k หรือ describe-keyและคุณพิมพ์คอร์ดหลักที่มีผลผูกพันที่คุณต้องการอธิบาย ทั้งสามฟังก์ชั่นรวมทั้ง C-h m เพื่อดึงข้อมูลเอกสารเกี่ยวกับโหมดหลักและรองของบัฟเฟอร์ปัจจุบันมีประโยชน์อย่างมากในการค้นพบว่า Emacs ทำงานอย่างไรและมันสามารถทำอะไรได้บ้างและฉันกระตือรือร้นแนะนำให้คุณใช้เป็นวิธีที่ดีที่สุดและรวดเร็วที่สุดในการลดระดับที่ Emacs .

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

ครั้งแรกในขณะที่ฉันแน่ใจว่ามีวิธีที่จะทำมันจำเป็นต้องคลุมเครือและยุ่งยากและมันจะมีศักยภาพมากมายที่จะผิดไปในรูปแบบที่ไม่ชัดเจนซึ่งเป็นสิ่งที่ดีสำหรับ Emacs ทหารผ่านศึกไม่แนะนำให้เลือกจริงๆเมื่อคุณพยายามเรียนรู้การแก้ไข ถ้าคุณพยายามทำสิ่งที่ไร้เดียงสาและชัดเจน (เช่น M-: (global-set-key (kbd "ESC") 'keyboard-quit) RET ) คุณจะหยุดการทำงานของคีย์เมตาทั้งหมด การทำให้ถูกต้องจริง ๆ แล้วจะต้องลงไปสู่ระดับต่ำสุดของการประมวลผลเหตุการณ์ของ Emacs - ใส่ไฟหน้านำมาเชยและแพ็คอาหารกลางวัน (อาจเป็นอาหารกลางวันสองมื้อ)

ประการที่สองแม้ว่าคุณจะสามารถทำงานผูกพันได้อย่างน่าเชื่อถือมันก็ไม่ได้มาตรฐานมากนักในขณะที่ Emacs ที่คุณใช้ทุกที่จะมี C-g ผูกพันกับ keyboard-quit. โดยเฉพาะอย่างยิ่งในขณะที่เรียนรู้จากตัวแก้ไขมันแนะนำให้ทำความคุ้นเคยกับปุ่มลัดเริ่มต้นแทนการปฏิเสธสิ่งต่าง ๆ ในแบบที่จะทำงานกับไฟล์ init ของ Emacs ของคุณเท่านั้น (ถ้าคุณสามารถรับประกันได้ว่าคุณจะไม่เคยใช้ Emacs ทุกที่ยกเว้นในกล่องของคุณเองหรือว่าคุณจะสามารถติดตั้งไฟล์ init ได้เสมอเยี่ยมเลยลองใช้เลยสำหรับโหมดนี้ Vim ซึ่งเป็นส่วนหนึ่งของไลบรารีมาตรฐาน Emacs นับเป็น "ค่าเริ่มต้น" เนื่องจากคุณสามารถเรียกใช้บน Emacs ที่ติดตั้งอย่างเหมาะสมผ่าน M-x vim-mode RET หรือคล้ายกัน)

tl; dr: คุณอาจจะทำอย่างนั้นกับ ESC แต่จะใช้แฮกเกอร์ที่น่ากลัวทำเช่นนั้นสมมติว่าเป็นไปได้และคุณควรทำความคุ้นเคยกับสิ่งอำนวยความสะดวกที่ Emacs ให้ไว้โดยค่าเริ่มต้นสำหรับเรียกพฤติกรรมที่คุณต้องการ .


ขอบคุณสำหรับคำตอบ. ฉันเริ่มชิน C-g. น่าเสียดายที่โหมดเสียงเรียกเข้าทำให้ฉันต้องกด ESC เพื่อเข้าสู่โหมดปกติดังนั้นตอนนี้ฉันมักจะใช้การกดแป้นสามครั้งเมื่อมีใครพอ (และถ้าฉันผิดลำดับ Emacs จะบ่นเกี่ยวกับ M-C-g ไม่ได้ถูกกำหนดและฉันไม่อยู่ในความคิดของฉันอีก) คุณมีความคิดใด ๆ ที่สามารถทำได้ดีกว่านี้บ้าง?
leftaroundabout

@leftaroundabout คุณอาจสามารถผูก M-C-g เพื่อดำเนินการทั้งสองอย่าง มันเกี่ยวข้องกับการทำ C-h k RET ESC RET เพื่อดูว่ามีอะไรผูกมัดกับ ESC ในโหมดแทรก Vim (สมมติว่ามันเป็นฟังก์ชั่นที่เรียกว่า vim-normal-modeแล้วจึงผูกพัน M-C-g ถึงเช่น (lambda () (keyboard-quit) (vim-normal-mode)).
Aaron Miller

3

คุณสามารถใช้สิ่งนี้ในไฟล์ init ของ Emacs:

;;; esc always quits
(define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)
(global-set-key [escape] 'keyboard-quit)

น่ารัก! เปลี่ยนบรรทัดสุดท้ายเป็น (global-set-key [escape] 'keyboard-escape-exit) แทนเพื่อทำหน้าที่เหมือน mash สามตัว
Ole
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.