Aynı arabellekte iki ana mod haritası kullanın


11

Bir büyük modun tuş haritasının başka bir büyük mod için yedek bir tuş haritası olarak hareket etmesinin son derece uygun olduğu birkaç durumla karşılaştım. Örneğin:

  • Bazı kuruluş belgelerime çok fazla LaTeX yazıyorum, bu yüzden latex-modedüzenleme sırasında kolayca komutlara sahip olmak harika olurdu org-mode.
  • Markdown desteği ile bir irc odası sık sık, bu yüzden de markdown-modetuş takılmış olması güzel olurdu erc-mode.

Her iki durumda da bu ekstra tuş haritası bir yedek işlevi görmelidir (bu yüzden bunun için sadece küçük bir modu kullanamıyorum). Lateks komutlarının herhangi bir org-modetuşu geçersiz kılmasını istemiyorum . Ne istiyorum:
Eğer bir anahtar latex-mode-mapAND içinde tanımlanmış ise org-mode-mapo tanımlanmadı sonra latex-mode-mapbağlayıcı kullanın .

S: Bir ana haritayı ana mod için yedek bir anahtar haritası olarak nasıl ayarlayabilirim?
VEYA
S: Anahtarları bir büyük mod haritasından diğerine, hiçbir şeyi geçersiz kılmadan nasıl kopyalayabilirim?


Sadece net olmak için. Bu anahtarları tek tek tanımlayabileceğimi biliyorum, ancak otomatik bir çözüme sahip olmak son derece daha uygun olacaktır.


6
Bir tuş haritası birleştirmesi kullanın. Bkz make-composed-keymap.
Drew

Yanıtlar:


12

Bu beklenenden daha basit çıktı. Buradaki ve sorudaki yorumlarda önerildiği gibi:

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

Bu, kopyası olan erc-mode-mapancak aynı zamanda devralınan bir anahtar haritası oluşturur markdown-mode-map. Böylece tüm markdowntuşlar, tuşlarla çarpıştıklarında gölgeli olacaktır erc.

Eğer varsa do yedek klavye haritası bazı tuşları istediğiniz ana birinde onları sadece devre dışı, ana kemap gölgede bırakmak için.

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

2
define-keyDönüş değerinin kullanılmasının make-composed-keymaporijinal tuş appendedharitalarında beklenmedik yan etkileri olabileceğini fark ettim ve aynı manuel harita için de geçerli olabileceğinden şüpheleniyorum . Kullanmak istiyorsanız define-key, üst anahtar haritası oluşturulmuş bir anahtar harita olan yeni bir anahtar haritası oluşturmak en güvenli gibi görünüyor .
Jon O.

@JonO. Aslında, bunun burada olmadığını öğrenmek beni çok şaşırttı . Bunu yaparsam (define-key erc-mode-map "\C-c\C-s" nil), ilgili markdown-modeanahtar erc arabelleklerinde bile kullanılabilir .
Malabarba

Malabarba: Son yorumunuzun bu kod değişikliğinden sonra artık geçerli olmadığına inanıyorum. make-composed-keymapDokümantasyon "MAPS'da bağlayıcı bir nil herhangi PARENT bağlayıcı gelen, ancak MAPS diğer keymaps içinde bağlamaları gelen geçersiz kılmaz geçersiz kılar." Diyor As markdown-mode-mapVELİ sizin örnekte, ben bu beklenir nilbağlayıcı fiyat indirimlerini inhibe bağlama?
phils

2
Benim çevirim olmasıdır (make-composed-keymap (list erc-mode-map markdown-mode-map)) ediyorum ancak, açıklanan etmişti etkiye sahip?
phils

1
cl-copy-listgerçekten istediğini yapmayacak. Tuş haritasını kopyalamak istiyorsanız, kullanmış olmalısınız copy-keymap.
Stefan

3

@Malabarba tarafından belirtildiği gibi, make-composed-keymapbunun için kullanabilirsiniz . Ancak, yeni tuş haritasının her iki tuş haritasından da miras almasını istiyorsanız, bu yeni tuş eşlemesini değiştirmek diğer iki tuş haritasından hiçbirini etkilemez, bunu iki adımda yapmanız gerekir:

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

Çünkü define-keybazen ilk argüman olarak geçirilen haritaları değiştirebilir, make-composed-keymapancak ikinci olarak geçirilen haritaları değiştiremezsiniz . Sanırım M-x report-emacs-bugve ikinci argüman olarak make-composed-keymapbir tuş haritası listesi kabul etmenizi istemelisiniz.

(make-composed-keymap nil (list erc-mode-map markdown-mode-map))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.