Büyük mod tuşlarını bir kanca ile ayarlama ile mod haritasına ekleme arasındaki farklar


13

Diyelim ki büyük bir mod magical-modeindirdim ve kendi sihirli tuş eşlemesi var magical-mode-map. Bu mod ayrıca, magical-mode-hookher magical-modebir arabellek ana modu haline geldiğinde çalıştırılan bir kanca sağlar . Şimdi bu modda kullanmak için birkaç özel anahtar bağlama eklemek için init dosyamı değiştirmek istiyorum.

Özel anahtar bağları kurmanın (en az) iki yolu var gibi görünüyor magical-mode. En yaygın olarak gördüğüm şudur:

(defun my-magical-keys ()
  (local-set-key (kbd "C-i") 'previous-line)
  (local-set-key (kbd "C-k") 'next-line)
  (local-set-key (kbd "C-j") 'backward-char)
  (local-set-key (kbd "C-l") 'forward-char))
(add-hook 'magical-mode-hook 'my-magical-keys)

Ancak bu şekilde yapmak da mümkündür:

(define-key magical-mode-map (kbd "C-i") 'previous-line)
(define-key magical-mode-map (kbd "C-k") 'next-line)
(define-key magical-mode-map (kbd "C-j") 'backward-char)
(define-key magical-mode-map (kbd "C-l") 'forward-char)

İkinci yöntem aslında benim için daha temiz görünüyor. Bir şekilde diğerine göre yapmanın herhangi bir avantajı var mı?


Temel hareket komutları için aynı tuşları kullanıyorum. Dikkatli olun: bu zorlu bir savaştır ve bunu yapmaya başlamadan önce önemli bağlantılar hakkında biraz daha fazla bilgi edinmek isteyebilirsiniz.
tarsius

@tarsius Gerçekten yokuş yukarı bir savaş. Daha önce bu yolda ilerledim, ama şimdi iyiye geri döndüm C-nve C-p. Örnek sadece kukla kod. Bazı çok basit örnek modları ve örnek bağlamaları bulmak istedim, böylece bağların kendileri sorunun asıl amacından uzaklaşmayacaktı.
nispio

Yanıtlar:


15

İkinci yaklaşım modun tuş haritasını sadece bir kez değiştirdiği için tercih edilir.

Modun kancasını kullanarak yaparsanız, bu mod bazı tamponlarda her etkinleştirildiğinde çağrılacaktır. Tekrar yapmak genellikle bir etki yaratmaz, çünkü anahtarlar zaten bağlı oldukları şeye tekrar bağlıdır. Başlıca mod keymaps kullandığınız bu tamponlar birinde bağlayıcı değiştirmek eğer öyleyse, majör modunda değil modunu kullanmak bireysel tamponlar için "yerel" dir local-set-keyaynı majör moduyla tüm tamponlarını etkilediğini sonra.

local-set-keyöncelikle komut olarak kullanılmak üzere tasarlanmıştır. Bazı değişiklikleri kalıcı yapmak istediğinizi belirledikten sonra define-key, mod argümanını ilk argüman olarak kullanın.

Tuş eşlemesini tekrar tekrar değiştirmek için bir kanca kullanırsanız, amaçlanan kullanımı ile çakışabilir local-set-key. Eğer kullanılan Say M-x local-set-key RET C-i fancy-previous-line RETsen o varyantını denemesi için istiyorum çünkü previous-line. Şimdi aynı ana modu kullanan yeni bir arabellek açarsanız, kanca daha önce kullandığınız arabellek de dahil olmak üzere o ana modu kullanan tüm arabelleklerde yeniden çalışır ve geçici bağlantınızı geçersiz kılar local-set-key.


Bu yanıtı beğendim ama mod otomatik olarak yüklenirse ne olur?
remvee

2
Bazı kütüphane yüklendikten sonra kadar herhangi bir kod yükleme geciktirebilirsiniz: (eval-after-load 'magical '(progn (define-key magical-mode-map ...) ...)).
tarsius

4

Kullanmak (define-key my-magical-mode-map …)normal yoldur.

Bir kanca kullandığınızda ve local-set-keybazı arabelleklerde Büyülü moda her girdiğinizde tuşlar eklenir. Bu gariptir, çünkü local-set-keyaynı moddaki tüm arabellekleri etkiler (daha genel olarak, aynı tuş eşlemesini kullanan tüm arabellekler). Bu nedenle, tuş eşlemesinde herhangi bir değişiklik yaptıysanız, bir arabellekte Büyülü moduna her girdiğinizde bunlar geçersiz kılınır.

Tuş haritasını farklı yerlerde özelleştirirseniz, ikinci yöntem de kafa karıştırıcı olabilir. Kancalar, eklendikleri sırayla ters sırayla yürütülür ve ilk çalıştırılıncaya kadar, özelleştirmelerinizin izini görmezsiniz.


2

Sen görünüşte olan değil soran tanımlayan önemli bir mod keymap ama yaklaşık kullanıcı bir in birkaç tuş atamaları eklemek veya değiştirmek için kod mevcut majör mod klavye haritası. Bunu öneren "özel" diyorsunuz, ancak bunu da netleştirebiliriz.

Elbette, bunun için en yaygın olarak gördüğünüzü söylediğiniz şey, genellikle büyük mod tuş eşlemesini tanımlamak için kullanılan şey değildir . Örneğin, Emacs kaynak kodunda bulduğunuz şey bu değildir . Ve öyle değil elisp kılavuzunda (düğüm tavsiye ne ).Major Mode Conventions

Bunu yoldan çıkarmak, başkaları için açık olmak istedim: genellikle büyük mod haritasını tanımlamak için mod kancasını kullanmak istemezsiniz.


Kullanıcı anahtarı özelleştirmeleri hakkında sorunuza -

Her durumda local-set-key, bir mod kancasında kullanmanız gerekmez . Büyük define-keymod tuş eşlemesiyle, tıpkı ilk örneğiniz gibi kullanın. @tarsius bunu çoktan açıkladı.

Bunun dışında, cevap: genel olarak , tuşları ( define-keymod haritası ile kullanarak ) bir kez ve herkes için bağlayıp bağlamadığınızı veya moda her girdiğinizde bunları bağlamak için kancayı kullanıp kullanmadığınızı çok az fark eder.

Ancak haritadaki bağlantıların değişmesi fark yaratabilir - örneğin, bunları değiştiren başka bir kod yüklediğinizde. Bu durumda, ana mod kancasına bağlamalar koymak, moda girildiğinde bağların kurulmasını sağlar. Yani, bunların yapılmasını sağlar, ancak daha sonra başka hiçbir şeyin onları değiştirmemesini sağlamaz (örneğin, aynı kancada, daha sonra çağrılan başka bir işlev). Bir kancada neyin çalıştırıldığı üzerinde çok az kontrole sahip olduğunuzu ve ne zaman - elbette sadece kendi kodunuzun onunla uğraştığından emin değilseniz unutmayın.

Aklıma gelen tek fark bu. Bu farkın ne zaman bir veya diğer yaklaşımın bir avantajı olduğunu düşündüğünüze karar vermeniz için. FWIW, kendi koduma baktığımda, bir mod kancasındaki anahtarları bağladığımı sanmıyorum.


Teşekkürler. Soruyu, büyük bir mod oluşturmadığım , sadece kendi anahtar bağlarımı ve mevcut ana moda eklediğimi açıklığa kavuşturacak şekilde değiştirdim .
nispio

0

İsminiz biraz kafa karıştırıcı (Sanırım mysorunun ikinci bölümünde kaldırmalısınız ).

Neyse varsayarak my-magical-keyskullanıcı özelleştirme fonksiyonudur magical-modeAnlıyorum, bir bariz avantaj. remove-hookTek seferde kancayı çıkarmak (by ) kolaydır .

İkinci avantaj, işlevlerin ne anlama geldiğidir. Yani tekrar kullanılabilirler. bunları diğer modlara bağlayabilirsiniz.

Düzenle:

@Tarsius'un işaret ettiği gibi, kancayı çıkarmak orijinal davranışı geri yüklemez ve işlevi küçük moda dönüştürmek daha iyi olabilir.


Ben denilen varsayımsal bir ana modu özelleştiriyorum my-magical-mode. Ancak, my-önek kullanımı kafa karıştırıcıysa, soruyu kesinlikle düzenleyebilirim.
nispio

Evet, bu daha iyi olurdu, genellikle (vahşi doğada gördüğüm en azından) my-kullanıcı işlevleri için eklenir.
kindahero

1
Kabul. Ben sadece uyguladım my-ki, kimse magical-mode(eğer varsa) denilen gerçek bir modun nasıl yapılandırılacağını sorduğumu düşünmezdi .
nispio

1
Hayır, kancayı çıkarmak eski bağları geri yüklemez. En azından Emacs yeniden başlatılıncaya kadar, ve sonra dört yerine sadece bir satır yorum yapmayı bu kadar büyük bir gelişme olarak görmüyorum.
tarsius

2
Bahsettiğiniz ikinci avantaj için: burada, çeşitli ana modlar ve / veya belirli bir ana modu kullanan tamponların sadece bir kısmı için etkinleştirilebilen küçük bir mod oluşturmak tercih edilir.
Tarsius
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.