Các ràng buộc chính cụ thể cho một bộ đệm


13

Có thể thiết lập các ràng buộc quan trọng cụ thể cho bộ đệm?

Tôi có những điều sau đây trong một trong các tập tin org của mình:

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

Nhưng ràng buộc này vẫn tồn tại cho các tệp chế độ org khác. Nếu tôi mở một tệp với chế độ chính khác, thì ràng buộc khóa mặc định của tôi sẽ khởi động.

Dường như local-set-keylà thiết lập các ràng buộc cụ thể cho chế độ chính không dành riêng cho bộ đệm.

Làm thế nào tôi có thể có các ràng buộc chỉ kích hoạt trong một bộ đệm cụ thể?


2
Ồ wow, bạn nói đúng: "Liên kết đi trong bản đồ cục bộ của bộ đệm hiện tại, trong hầu hết các trường hợp được chia sẻ với tất cả các bộ đệm khác trong cùng chế độ chính." Tôi không bao giờ biết rằng.
shosti

Bây giờ tôi nghĩ về nó, local-unset-keyhooked có org-mode-hookthể hoạt động nếu điều đó được thực thi trước khi Local Variables:phần này được.
Kaushal Modi

Hoặc bạn có thể tạo một chế độ nhỏ với sơ đồ bàn phím thưa thớt và chuyển đổi nó bằng cách sử dụngLocal Variables:
Vamsi

@Vamsi Cảm ơn! Đây là một giải pháp thanh lịch! Tôi đã cập nhật giải pháp của bạn.
Kaushal Modi

Câu trả lời:


17

Để đóng cửa, đây là một câu trả lời mở rộng theo nhận xét của tôi. Tôi xác định một chế độ nhỏ với liên kết phím được yêu cầu và chuyển đổi nó trong bộ đệm cần thiết bằng cách sử dụng các biến cục bộ của tệp.

  (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)

Bạn có thể chuyển đổi nó trong các tệp cần thiết bằng cách đặt phần biến cục bộ ở cuối tệp như sau. Bạn cũng có thể thay đổi hoặc thêm keybinding ở đây. Bạn vẫn sẽ cần xác định các chế độ nhỏ khác nhau cho mỗi bộ đệm ánh xạ cùng chuỗi khóa với các lệnh khác nhau.

 # 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: Bạn có thể muốn đưa ra các chỉnh sửa của mình thành một câu trả lời riêng vì nó hoàn chỉnh hơn. Ngoài ra, bạn sẽ không thể ánh xạ cùng một chuỗi khóa thành hai hàm khác nhau trừ khi bạn sử dụng tên cụ thể của bộ đệm.
Vamsi

Tôi gặp lỗi này: eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-mapkhi tôi cố chạy nó(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

Tôi cũng nhận được lỗi tương tự. bất kỳ ý tưởng?
zeltak

@incandescentman gọi (make-keymap) với :keymaptừ khóa, kiểm tra nullprogram.com/blog/2013/02/06
nichoman

5

Đây là một cách chung để đặt các ràng buộc khóa dành riêng cho bộ đệm.

  • Tạo một chế độ nhỏ tạm thời (lưu đoạn mã dưới đây temp-mode.elrequirenó trong của bạn init.el.
  • Cho phép temp-modechế độ nhỏ đó và xác định sơ đồ bàn phím của chế độ phụ đó chỉ trong (các) bộ đệm bạn cần.

Đặt Local Variablesđoạn mã dưới đây vào bộ đệm nơi bạn muốn liên kết khóa tùy chỉnh. Dưới đây là ví dụ về org-modecác tập tin.

Trong bộ đệm MỘT

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

Nếu một số bộ đệm khác xác định lại cùng một ràng buộc khóa bằng cách sử dụng,

Trong bộ đệm HAI

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

sau đó ràng buộc mới trở nên hiệu quả trong việc làm M-x revert-buffer.

Đây là những gì tôi sẽ làm nếu tôi cần phải chuyển đổi giữa hai bộ đệm này rất thường xuyên và nếu tôi phải sử dụng F10ràng buộc trong cả hai:

  • Làm việc trong bộ đệm ONE, C-x C-s(lưu) và chuyển sang bộ đệm TWO
  • revert-buffer(làm mới các ràng buộc), làm việc trong bộ đệm TWO C-x C-svà chuyển sang bộ đệm ONE
  • revert-buffer(làm mới các ràng buộc), làm việc trong bộ đệm ONE C-x C-svà chuyển sang bộ đệm TWO

Nhưng tôi muốn liên kết các lệnh cụ thể bộ đệm khác nhau với các khóa khác nhau.


Chế độ nhỏ tạm thời

;; 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.