Küçük modu etkinleştirmenin doğru yolu


24

Ben foo mod var ve bunun için bar-minor modunu etkinleştirir . Peki hangi yol daha yaygın ve tercih edilir?

bir

(add-hook 'foo-mode-hook 'bar-minor-mode)

B

(add-hook 'foo-mode-hook (lambda ()
                           "Turn on `bar-minor-mode' mode."
                           (bar-minor-mode 1)))

C

(defun bar-minor-mode-on ()
  "Turn on `bar-minor-mode' mode."
  (interactive)
  (bar-minor-mode 1))

(add-hook 'foo-mode-hook 'bar-minor-mode-on)

D

• C değişkeni, ancak işlev giriş yönünde

E

• C değişken, ancak eklentinin tarifinde saklanan işlev


4
Merhaba @ Netsu, lambda'nızdan aldığım alıntıyı geri eklediğinizi fark ettim. Genel olarak, lambdalardan alıntı yapmak zararlıdır, bu yüzden Stefan ve ben sadece iyi uygulamaları motive etmeye çalışıyoruz. :-)
Malabarba

Yanıtlar:


26

Hangi Emac versiyonunu kullandığınıza (veya hedeflediğinize) bağlıdır. Yalnızca Emacs 24+ kullanıyorsanız, A değişkenini güvenle kullanabilirsiniz:

* Incompatible Lisp Changes in Emacs 24.1

** Passing a nil argument to a minor mode function call now ENABLES
the minor mode unconditionally.  This is so that you can write e.g.

 (add-hook 'text-mode-hook 'foo-mode)

to enable foo-mode in Text mode buffers, removing the need for
`turn-on-foo-mode' style functions.  This affects all mode commands
defined by `define-minor-mode'.  If called interactively, the mode
command still toggles the minor mode.

Bu, NEWS dosyasından geliyor, ancak yorumlara göre, işlev sembolleri için işlev alıntılama kullanmak iyi bir uygulamadır:

 (add-hook 'text-mode-hook #'foo-mode)

Kodun Emacs 23 (veya daha önceki) altında çalıştırılması gerekebilirse, kişisel olarak kanca değişkenlerinde adsız işlevler görmeyi sevmediğim için C varyantıyla giderim. (D ve E değişkenleriyle ne demek istediğinizi anladığımdan emin değilim).


3
Küçük modu için işlev tırnaklarını kullanmalısınız, böylece mod tanımsızsa bayt derleyicisi sizi uyarabilir.
10'da 04:43

Teşekkürler. Ancak işlev alıntı hala gerekli mi? Hangi avantajları veriyor? Ayrıca lambdalar için de gerekli midir?
Netsu


7

İşte size dağıtmakta olduğunuz bir paketi değil kendi yapılandırmanızı düzenlediğinizi varsayarsak, bazı avantajları olan bir başka yol daha var.

(add-hook 'foo-mode-hook
          #'custom-foo-hook)

(defun custom-foo-hook ()
  (bar-minor-mode 1)
  (baz-minor-mode 1)
  ;; ...
  (define-key foo-mode-map "C-c C-b" #'foobar))

Bunun avantajı, her şeyin tek bir kancada saklanmasıdır, bu nedenle bazı şeyleri devre dışı bırakmak için yapmanız gerekmez remove-hook, bunun yerine bazı şeyleri custom-foo-hookve içinde yorumlayın C-M-x.

Herhangi bir moddan özel kancasına atlayan bir komut bile yazabilirsiniz.


1
Bu (esasen) farklı bir isimle C varyantıdır, ancak vurgulamaya değer olduğuna katılıyorum. Bu kesinlikle kendi modumdaki ana mod davranışlarını kişiselleştirdiğimde uyguladığım yaklaşım.
phils

1
C değişkeni add-hook, etkinleştirmek için her küçük mod için birden fazla ifade anlamına gelir . Sadece bir add-hookifadeye sahip olmanın bir avantaj olduğunu vurgulamak istedim .
abo-abo

Kabul. Kafamda hemen hemen hiç varyant C tercüme ziyade "modunu sağlayan özel bir işlev tanımlamak" "özel bir işlev tanımlamak sadece modunu sağlayan" ama geçmişe bakıldığında ikincisi niyet edilmiş gibi görünüyor. Dediğiniz gibi, kod kişisel kullanım için olup olmamasına bağlıdır.
Phil,

7

Neden tam olarak ne işe yarayan yeni bir komut tanımladınız bar-minor-mode?

Seçeneği: 24,1 ile başlayarak, tüm bu yüzden sadece daha az yedekli birini kullanmak tamamen eşdeğerdir A

(add-hook 'foo-mode-hook #'bar-minor-mode)

1
Güvenli bir çözüm mü? Biri Yani eğer foo-mod-kanca ebeveyn modları ile aynı kanca sahip bar-minör-mode iki kez arayacak böylece devre dışı bırakılacak. Beklenmeyen davranış.
Netsu

2
@Netsu evet, hiçbir argüman içermeyen küçük bir mod işlevinin çağrılması Koşulsuz olarak küçük modu ETKİNLEŞTİRİN.
Malabarba

4
@Malabarba Sadece Emacs 24'ten itibaren. Eski versiyonlarda bu mod değiştirildi.
lunaryorn

1
@lunaryorn Evet, bu yüzden phils'in cevabı daha iyi. :-) Benimkini düzeltmek için çok tembeldim.
Malabarba
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.