ลบล้างการผูกคีย์ทั่วโลกใน Emacs


101

ฉันจะตั้งค่าการเชื่อมโยงคีย์ที่แทนที่ทั่วโลกและมีความสำคัญเหนือการเชื่อมโยงอื่น ๆ ทั้งหมดสำหรับคีย์นั้นได้อย่างไร ฉันต้องการลบล้างแผนที่โหมดหลัก / รองทั้งหมดและตรวจสอบให้แน่ใจว่าการเชื่อมโยงของฉันมีผลเสมอ

สิ่งนี้ใช้ไม่ได้:

(global-set-key "\C-i" 'some-function)

มันทำงานได้ในtext-modeแต่เมื่อผมใช้lisp-mode, เป็นเด้งไปC-ilisp-indent-line

ฉันสามารถผ่านและลบล้างการผูกนี้ในlisp-modeและในโหมดอื่น ๆ ทีละโหมดได้ แต่ต้องมีวิธีที่ง่ายกว่านี้ ทุกครั้งที่ติดตั้งโหมดใหม่สำหรับไฟล์ประเภทใหม่ฉันจะต้องกลับไปตรวจสอบเพื่อให้แน่ใจว่าการผูกคีย์ทั้งหมดของฉันไม่ได้ถูกแทนที่ด้วยโหมดใหม่

ฉันต้องการทำสิ่งนี้เพราะฉันต้องการเลียนแบบการผูกที่ฉันได้เรียนรู้และฝังแน่นมาแล้วจากบรรณาธิการคนอื่น ๆ

คำตอบ:


151

ฉันใช้โหมดรองสำหรับการผูกคีย์ "แทนที่" ทั้งหมดของฉัน:

(defvar my-keys-minor-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map (kbd "C-i") 'some-function)
    map)
  "my-keys-minor-mode keymap.")

(define-minor-mode my-keys-minor-mode
  "A minor mode so that my key settings override annoying major modes."
  :init-value t
  :lighter " my-keys")

(my-keys-minor-mode 1)

สิ่งนี้มีประโยชน์เพิ่มเติมในการปิดการปรับเปลี่ยนทั้งหมดของฉันในคราวเดียว (เพียงปิดใช้งานโหมดรอง) ในกรณีที่มีคนอื่นกำลังขับแป้นพิมพ์หรือหากฉันต้องการดูว่าการผูกคีย์เริ่มต้นทำอะไรได้บ้าง

โปรดทราบว่าคุณอาจต้องปิดสิ่งนี้ในมินิบัฟเฟอร์:

(defun my-minibuffer-setup-hook ()
  (my-keys-minor-mode 0))

(add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)

1
ดูเหมือนจะเป็นความคิดที่ดี มีวิธีใดบ้างที่จะทำให้แน่ใจว่าโหมดรองของคุณไม่ได้ต่อสู้กับโหมดรองอื่น ๆ ?
Brian Carper

3
ตรวจสอบให้แน่ใจว่าโหมดรองของคุณอยู่ในรายการ minor-mode-map-alist ก่อน
Trey Jackson

2
แต้มพูดถูก โดยปกติแล้วการวางสิ่งนี้ไว้ใกล้จุดสิ้นสุดของ. emacs ของคุณก็เพียงพอแล้ว นอกจากนี้การเชื่อมโยงส่วนใหญ่ที่คุณจะแทนที่จะเป็นโหมดที่โหมดหลักกำลังตั้งค่า ... โหมดรองโดยทั่วไปจะไม่อยู่ในทาง
scottfrazer

ฉันทำตามแนวทางนี้ แต่แล้วฉันก็รู้ว่าสิ่งใดก็ตามที่ฉันผูกกับ Ci ก็ผูกพันกับคีย์ TAB ด้วย ข้อเสนอแนะใด ๆ ?
Steve

3
Brian Carper: นี่คือการปรับปรุงเพื่อจัดการกับโหมดรองที่โหลดในภายหลัง: stackoverflow.com/questions/683425/…
phils

30

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

เนื่องจากสามารถสร้างคีย์แมปได้ในเวลาคอมไพล์loadดูเหมือนว่าจะเป็นจุดที่ดีที่สุดในการทำเช่นนี้

(add-hook 'after-load-functions 'my-keys-have-priority)

(defun my-keys-have-priority (_file)
  "Try to ensure that my keybindings retain priority over other minor modes.

Called via the `after-load-functions' special hook."
  (unless (eq (caar minor-mode-map-alist) 'my-keys-minor-mode)
    (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist)))
      (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
      (add-to-list 'minor-mode-map-alist mykeys))))

ฉันวางสคริปต์ของคุณ แต่มันก็ไม่ได้ทำให้ส่งผลกระทบใด ๆ :(
Alper

@alper ฉันขอแนะนำให้คุณโพสต์คำถามพร้อมรายละเอียดที่เกี่ยวข้องทั้งหมดรวมถึงรหัสที่คุณใช้จริงและตัวอย่าง / สูตรเฉพาะที่จะทำให้เกิดปัญหาอีกครั้ง
Phils

21

ติดตั้งประเมินuse-packageและเสร็จสิ้น:

(require 'bind-key)
(bind-key* "C-i" 'some-function)

5
ติดตั้งเฉพาะ bind-key ก็เพียงพอสำหรับกรณีการใช้งานแม้ว่า use-package จะขึ้นอยู่กับ bind-key
xuchunyang

2
(แพ็กเกจ 'bind-key') นี้เป็นวิธีที่สะดวกที่สุด ขอบคุณสำหรับการแบ่งปัน.
oligilo

ผมไม่สามารถที่จะหาคู่สำหรับuse-package:Install package: use-package [No Match]
Alper

15

ฉันพบคำถามนี้ขณะค้นหา "emacs undefine org mode keybindings" เนื่องจากฉันต้องการเลิกผูกพฤติกรรม Cc Cb ที่มีอยู่เพื่อให้แผนที่ส่วนกลางของฉันฝังบัฟเฟอร์เพื่อทำงานในบัฟเฟอร์ขององค์กร

สิ่งนี้เป็นทางออกที่ง่ายที่สุดสำหรับฉัน:

(add-hook 'org-mode-hook
      (lambda ()
        (local-unset-key (kbd "C-c C-b"))))

1
นี่เป็นโหมดเฉพาะและไม่ได้กล่าวถึงภาพใหญ่แม้ว่าจะใช้ได้กับกรณีการใช้งานครั้งเดียวของคุณก็ตาม
RichieHH

12

แม้ว่าคำตอบของ scottfrazer จะตรงตามที่คุณต้องการ แต่ฉันจะพูดถึงวิธีแก้ปัญหาอื่น ๆ

จากคู่มือ Emacs :

"อย่ากำหนดตัวอักษร Cc เป็นคีย์ในโปรแกรม Lisp ลำดับที่ประกอบด้วย Cc และตัวอักษร (ตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก) สงวนไว้สำหรับผู้ใช้ซึ่งเป็นลำดับเดียวที่สงวนไว้สำหรับผู้ใช้ดังนั้นอย่าปิดกั้น"

หากคุณผูกการผูกโกลบอลส่วนตัวของคุณกับ Cc บวกกับตัวอักษรแสดงว่าคุณ "ควร" ปลอดภัย อย่างไรก็ตามนี่เป็นเพียงแบบแผนเท่านั้นและโหมดใด ๆ ก็ยังสามารถลบล้างการผูกของคุณได้


3
ฉันไม่ได้คาดหวังว่าโหมดองค์กรทุกโหมดจะทำลายกฎนี้ `` Cc Ch 'บอกฉันว่า Cc a, b, c และ l ถูกผูกไว้กับ org-agenda, org-iswitchb, org-capture และ org-store-link ตามลำดับ
Nate Parsons

7
Afaik การผูกสิ่งเหล่านี้เป็นขั้นตอนแรกของโหมดองค์กรที่แนะนำเพื่อใช้งาน แต่ผู้ใช้ต้องกำหนดเอง (กล่าวคือไม่ได้ทำตามค่าเริ่มต้น) และอาจเลือกวิธีอื่นในขณะที่ทำเช่นนั้น (เช่นกันเพราะการผูกเหล่านี้ควรจะเป็นแบบโกลบอลไม่ผูกมัดกับโหมดหลักขององค์กร)
Nikana Reklawyks

3

หากคุณต้องการ "ใช้การพันแป้นในแผนที่เสมอเว้นแต่ว่าฉันจะลบล้างคีย์เหล่านี้สำหรับแผนที่โหมดเฉพาะอย่างชัดเจน" และสมมติว่าคุณกำลังใช้แนวทางของสก็อตฟราเซียร์คุณต้องการ:

(defun locally-override (key cmd)
  (unless (local-variable-p 'my-keys-minor-mode-map)
    (set (make-variable-buffer-local 'my-keys-minor-mode-map)
         (make-sparse-keymap))
    (set-keymap-parent my-keys-minor-mode-map 
                       (default-value 'my-keys-minor-mode-map)))
  (define-key my-keys-minor-mode-map key cmd))

ดังนั้น

(locally-override "\C-i" nil)

ควรลบการผูก "\ Ci" ออกจากโหมดรองในบัฟเฟอร์ปัจจุบันเท่านั้น คำเตือน: นี่ยังไม่ผ่านการทดสอบ แต่ดูเหมือนจะเป็นแนวทางที่ถูกต้อง จุดของการตั้งค่าพาเรนต์แทนที่จะเป็นเพียงการจัดการกับค่าโกลบอลของ my-keys-minor-mode-map ดังนั้นการเปลี่ยนแปลงใด ๆ ในภายหลังของค่าโกลบอลจะแสดงในค่าโลคัลโดยอัตโนมัติ


2

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

อย่างไรก็ตามอาจมีวิธีการเขียนฟังก์ชัน elisp เพื่อไปยังรายการโหมดและกำหนดใหม่ในทุกฟังก์ชันให้คุณ


แนวคิดเรื่องการกำหนดขอบเขตนี้ถูกต้องในทางเทคนิค แต่overriding-local-mapได้รับการออกแบบมาโดยเฉพาะเพื่อแทนที่แผนที่อื่น ๆ ทั้งหมด อย่างไรก็ตามการใช้มันอันตราย
event_jr

2

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

มีแพ็คเกจสำหรับ Emacs ซึ่งให้การเชื่อมโยงคีย์เหมือน windows ของคุณ คุณควรจะหาได้จาก google


4
cua-modeแพคเกจที่คุณกำลังคิดที่น่าจะเป็น
ดึง

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