Gunakan dua peta mode-utama dalam buffer yang sama

11

Saya telah mengalami beberapa situasi di mana akan sangat mudah untuk memiliki keymap dari satu tindakan modus utama sebagai keymap mundur untuk mode utama lainnya. Misalnya:

  • Saya menulis banyak LaTeX di beberapa dokumen org saya, jadi alangkah baiknya memiliki latex-modeperintah yang mudah tersedia saat mengedit org-mode.
  • Saya sering menggunakan ruang irc dengan dukungan Markdown, jadi alangkah baiknya markdown-modejika ditambahkan keybinds erc-mode.

Dalam kedua kasus, keymap tambahan ini harus bertindak sebagai fallback (ini sebabnya saya tidak bisa hanya menggunakan mode minor untuk ini). Saya tidak ingin perintah lateks untuk menimpa org-modekunci apa pun . Yang saya inginkan adalah:
Jika kunci didefinisikan dalam latex-mode-mapDAN itu tidak didefinisikan di org-mode-mapkemudian gunakan latex-mode-mappenjilidan .

T: Bagaimana saya bisa mengatur keymap sebagai fallback keymap untuk mode-utama?
ATAU
T: Bagaimana cara menyalin kunci dari satu mode-besar-peta ke yang lain, tanpa mengabaikan apa pun?


Untuk lebih jelasnya. Saya tahu saya bisa mendefinisikan kunci ini satu per satu, tetapi akan jauh lebih nyaman untuk memiliki solusi otomatis.

Malabarba
sumber
6
Gunakan gabungan keymap. Lihat make-composed-keymap.
Drew

Jawaban:

12

Ini ternyata lebih sederhana dari yang diharapkan. Seperti yang disarankan dalam komentar di sini dan di pertanyaan:

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

Ini akan membuat keymap yang merupakan salinan erc-mode-maptetapi yang juga mewarisi dari markdown-mode-map. Jadi semua markdownkunci akan dibayangi setiap kali mereka bertabrakan dengan erckunci.

Jika Anda tidak ingin beberapa kunci dari keymap fallback untuk lebih cemerlang dr kemap utama, hanya menonaktifkan mereka dalam satu utama.

(define-key erc-mode-map "\C-c\C-a" nil)
Malabarba
sumber
2
Saya perhatikan bahwa menggunakan define-keynilai pengembalian make-composed-keymapdapat memiliki efek samping yang tidak terduga pada kartu kunci asli, dan saya menduga hal yang sama berlaku untuk appendedpeta ini secara manual . Jika Anda ingin menggunakan define-key, sepertinya paling aman untuk membuat keymap baru yang induknya keymap adalah keymap tersusun.
Jon O.
@JonO. Sebenarnya, saya sangat terkejut mengetahui ini tidak terjadi di sini. Jika saya melakukannya (define-key erc-mode-map "\C-c\C-s" nil), markdown-modekunci yang sesuai masih akan tersedia bahkan dalam buffer erc.
Malabarba
Malabarba: Saya yakin komentar terakhir Anda tidak lagi berlaku setelah perubahan kode itu. The make-composed-keymapdokumentasi mengatakan "sebuah nihil mengikat dalam MAPS menimpa setiap sesuai mengikat dalam INDUK, tetapi tidak mengesampingkan sesuai binding di keymap lain MAPS." Seperti halnya markdown-mode-mapORANGTUA dalam contoh Anda, saya berharap nilikatan itu akan menghambat ikatan penurunan harga?
phils
2
Penafsiran saya adalah bahwa (make-composed-keymap (list erc-mode-map markdown-mode-map)) akan memiliki efek yang Anda gambarkan, namun?
phils
1
cl-copy-listtidak akan benar-benar melakukan apa yang Anda inginkan. Jika Anda ingin menyalin keymap, maka Anda seharusnya sudah menggunakannya copy-keymap.
Stefan
3

Seperti yang disebutkan oleh @Malabarba, Anda dapat menggunakannya make-composed-keymapuntuk itu. Tetapi jika Anda benar-benar ingin keymap baru untuk mewarisi dari kedua keymap, sehingga memodifikasi keymap baru tidak mempengaruhi salah satu dari dua keymap lainnya, Anda perlu melakukannya dalam dua langkah:

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

Ini karena define-keykadang-kadang dapat memodifikasi peta yang dilewati sebagai argumen pertama make-composed-keymaptetapi tidak yang dilewatkan sebagai yang kedua. Saya kira Anda harus M-x report-emacs-bugdan meminta yang make-composed-keymapmenerima daftar keymaps sebagai argumen kedua, jadi Anda bisa melakukannya

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