การเชื่อมโยงคีย์เฉพาะกับบัฟเฟอร์


14

เป็นไปได้หรือไม่ที่จะตั้งค่าการเชื่อมโยงคีย์เฉพาะกับบัฟเฟอร์?

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

# Local Variables:
# eval: (local-set-key (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)
# End:

แต่การรวมนี้ยังคงมีอยู่สำหรับไฟล์โหมด org อื่น ๆ ด้วย หากฉันเปิดไฟล์ที่มีโหมดหลักที่แตกต่างกันการผูกคีย์เริ่มต้นของฉันจะเริ่มขึ้น

ดูเหมือนว่าlocal-set-keyจะเป็นการตั้งค่าการเชื่อมโยงเฉพาะโหมดหลักที่ไม่เฉพาะเจาะจงกับบัฟเฟอร์

ฉันจะมีการเชื่อมโยงที่เปิดใช้งานในบัฟเฟอร์เฉพาะได้อย่างไร


2
โอ้ว้าวคุณพูดถูก: "การเชื่อมโยงไปที่แผนที่ท้องถิ่นของบัฟเฟอร์ปัจจุบันซึ่งโดยส่วนใหญ่แล้วจะใช้ร่วมกับบัฟเฟอร์อื่น ๆ ทั้งหมดในโหมดหลักเดียวกัน" ฉันไม่เคยรู้เรื่องนี้เลย
shosti

ตอนนี้ที่ฉันคิดเกี่ยวกับมันlocal-unset-keyติดยาเสพติดorg-mode-hookอาจทำงานได้ถ้าที่จะดำเนินการก่อนLocal Variables:ส่วนคือ
Kaushal Modi

หรือคุณสามารถสร้างโหมดย่อยด้วยคีย์แมปแบบกระจัดกระจายและสลับการใช้งานได้Local Variables:
Vamsi

@Vamsi ขอบคุณ! นี่คือทางออกที่สง่างาม! ฉันได้อัพเดตโซลูชันของคุณแล้ว
Kaushal Modi

คำตอบ:


17

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

  (define-minor-mode my-org-buffer-local-mode
    "Minor mode to simulate buffer local keybindings."
    :init-value nil)
  (define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)

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

 # Local Variables:
 # my-org-buffer-local-mode: t
 # eval:(define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-other-custom-defun-specific-to-this-buffer)
 # End:

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

ฉันได้รับข้อผิดพลาดนี้eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-mapเมื่อฉันพยายามที่จะทำงานนี้(define-minor-mode my-org-buffer-local-mode "Minor mode to simulate buffer local keybindings." :init-value nil) (define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)
incandescentman

ฉันยังได้รับข้อผิดพลาดเดียวกัน ความคิดใด ๆ
zeltak

@incandescentman call (make-keymap) พร้อม:keymapคีย์เวิร์ดตรวจสอบnullprogram.com/blog/2013/02/06
nichijou

5

นี่เป็นวิธีทั่วไปในการตั้งค่าการโยงคีย์เฉพาะบัฟเฟอร์

  • สร้างโหมดย่อยชั่วคราว (เซฟไว้ด้านล่าง snippet ไปtemp-mode.elและในของคุณrequireinit.el
  • เปิดใช้งานtemp-modeโหมดย่อยนั้นและกำหนดว่าแผนที่หลักของโหมดรองในบัฟเฟอร์ที่คุณต้องการเท่านั้น

วางLocal Variablesตัวอย่างด้านล่างในบัฟเฟอร์ที่คุณต้องการผูกกุญแจที่กำหนดเอง ด้านล่างเป็นตัวอย่างของorg-modeไฟล์

ในบัฟเฟอร์ ONE

# Local Variables:
# eval: (temp-mode 1)
# eval: (define-key temp-mode-map (kbd "<f10>") 'function-ONE)
# End:

ถ้ามีบัฟเฟอร์อื่นนิยามใหม่การผูกคีย์เดียวกันโดยใช้

ในบัฟเฟอร์ TWO

# Local Variables:
# eval: (temp-mode 1)
# eval: (define-key temp-mode-map (kbd "<f10>") 'function-TWO)
# End:

M-x revert-bufferแล้วใหม่ผูกพันกลายเป็นที่มีประสิทธิภาพในการทำ

นี่คือสิ่งที่ฉันจะทำถ้าฉันต้องการสลับระหว่างบัฟเฟอร์สองตัวนี้บ่อยมากและถ้าฉันต้องใช้การF10รวมใน:

  • ทำงานในบัฟเฟอร์หนึ่งC-x C-s(บันทึก) และสลับไปที่บัฟเฟอร์สอง
  • revert-buffer(รีเฟรชการเชื่อมโยง) ทำงานในบัฟเฟอร์ TWO C-x C-sและเปลี่ยนเป็นบัฟเฟอร์ ONE
  • revert-buffer(รีเฟรชการเชื่อมโยง) ทำงานในบัฟเฟอร์ที่หนึ่งC-x C-sและสลับไปที่บัฟเฟอร์สอง

แต่ฉันอยากจะผูกคำสั่งบัฟเฟอร์เฉพาะที่แตกต่างกับคีย์ที่แตกต่างกัน


โหมดรองชั่วคราว

;; temp-mode.el
;; Temporary minor mode
;; Main use is to enable it only in specific buffers to achieve the goal of
;; buffer-specific keymaps

(defvar temp-mode-map (make-sparse-keymap)
  "Keymap while temp-mode is active.")

;;;###autoload
(define-minor-mode temp-mode
  "A temporary minor mode to be activated only specific to a buffer."
  nil
  :lighter " Temp"
  temp-mode-map)

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