Sử dụng hai bản đồ chế độ chính trong cùng một bộ đệm


11

Tôi đã gặp một vài tình huống trong đó sẽ rất thuận tiện khi phải có sơ đồ của một chế độ chính hoạt động như một sơ đồ dự phòng cho một chế độ chính khác. Ví dụ:

  • Tôi viết rất nhiều LaTeX trong một số tài liệu org của mình, vì vậy thật tuyệt khi có latex-modecác lệnh dễ dàng có sẵn trong khi chỉnh sửa org-mode.
  • Tôi thường xuyên có một phòng irc với sự hỗ trợ của Markdown, vì vậy thật tuyệt khi có markdown-modethêm các phím bấm được thêm vào erc-mode.

Trong cả hai trường hợp, sơ đồ phím bổ sung này sẽ hoạt động như một dự phòng (đây là lý do tại sao tôi không thể sử dụng một chế độ nhỏ cho việc này). Tôi không muốn các lệnh latex ghi đè bất kỳ org-modekhóa nào . Điều tôi muốn là:
Nếu một khóa được xác định trong latex-mode-mapAND thì nó không được xác định trong org-mode-mapđó sử dụng latex-mode-mapràng buộc .

H: Làm cách nào tôi có thể đặt sơ đồ bàn phím làm sơ đồ dự phòng cho chế độ chính?
HOẶC
Q: Làm thế nào có thể sao chép các khóa từ bản đồ chế độ chính sang bản đồ khác mà không ghi đè bất cứ điều gì?


Chỉ để được rõ ràng. Tôi biết tôi có thể xác định từng khóa một, nhưng sẽ rất thuận tiện hơn khi có một giải pháp tự động.


6
Sử dụng hợp nhất sơ đồ. Xem make-composed-keymap.
vẽ

Câu trả lời:


12

Điều này hóa ra là đơn giản hơn sau đó dự kiến. Như được đề xuất trong các ý kiến ​​ở đây và về câu hỏi:

(with-eval-after-load 'erc
  (require 'markdown-mode)
  (require 'cl-lib)
  (setq erc-mode-map
        (make-composed-keymap (cl-copy-list erc-mode-map)
                              markdown-mode-map)))

Điều này sẽ tạo ra một bản đồ chính là bản sao erc-mode-mapnhưng cũng thừa hưởng từ đó markdown-mode-map. Vì vậy, tất cả markdowncác phím sẽ bị che khuất bất cứ khi nào chúng va chạm với erccác phím.

Nếu bạn làm muốn có một số phím của keymap dự phòng để sáng hơn kemap chính, chỉ cần vô hiệu hóa chúng trong một trong những chính.

(define-key erc-mode-map "\C-c\C-a" nil)

2
Tôi đã nhận thấy rằng việc sử dụng define-keygiá trị trả về make-composed-keymapcó thể có tác dụng phụ không mong muốn đối với các keymap gốc và tôi nghi ngờ điều tương tự có thể áp dụng cho appendedbản đồ thủ công này . Nếu bạn muốn sử dụng define-key, nó có vẻ là an toàn nhất để tạo ra một bàn phím mới mà mẹ keymap là một sơ đồ bàn phím sáng tác.
Jon O.

@JonO. Thật ra, tôi đã rất ngạc nhiên khi biết điều này không xảy ra ở đây. Nếu tôi làm (define-key erc-mode-map "\C-c\C-s" nil), markdown-modekhóa tương ứng vẫn sẽ có sẵn ngay cả trong bộ đệm erc.
Malabarba

Malabarba: Tôi tin rằng bình luận cuối cùng của bạn không còn áp dụng sau khi thay đổi mã đó. Các make-composed-keymaptài liệu nói "một con số không ràng buộc trong MAPS ghi đè bất kỳ tương ứng với ràng buộc trong PARENT, nhưng nó không ghi đè lên các ràng buộc trong keymap khác của MAPS tương ứng." Như markdown-mode-mapPARENT trong ví dụ của bạn, tôi có thể mong đợi rằng nilràng buộc đó sẽ ngăn chặn ràng buộc đánh dấu?
phils

2
Giải thích của tôi là (make-composed-keymap (list erc-mode-map markdown-mode-map)) sẽ có hiệu ứng bạn mô tả, tuy nhiên?
phils

1
cl-copy-listsẽ không thực sự làm những gì bạn muốn. Nếu bạn muốn sao chép sơ đồ bàn phím, thì bạn nên sử dụng copy-keymap.
Stefan

3

Như được đề cập bởi @Malabarba, bạn có thể sử dụng make-composed-keymapcho điều đó. Nhưng nếu bạn thực sự muốn sơ đồ bàn phím mới kế thừa từ cả hai keymap, thì việc sửa đổi sơ đồ mới đó không ảnh hưởng đến bất kỳ hai keymap nào khác, bạn cần thực hiện theo hai bước:

(make-composed-keymap
 nil (make-composed-keymap (list erc-mode-map markdown-mode-map)))

Điều này là do define-keyđôi khi có thể sửa đổi các bản đồ được truyền dưới dạng đối số đầu tiên make-composed-keymapnhưng không phải là bản đồ được truyền dưới dạng thứ hai. Tôi đoán bạn nên M-x report-emacs-bugvà yêu cầu make-composed-keymapchấp nhận một danh sách các keymap như là đối số thứ hai, vì vậy bạn chỉ có thể làm

(make-composed-keymap nil (list erc-mode-map markdown-mode-map))
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.