Cara yang tepat untuk mengaktifkan mode minor

24

Saya memiliki foo-mode dan akan mengaktifkan bar-minor-mode untuk itu. Jadi, jalan mana yang lebih umum dan disukai?

SEBUAH

(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

• varian C, tetapi fungsinya didorong ke hulu

E

• varian C, tetapi fungsinya disimpan dalam resep plugin

Netsu
sumber
4
Hai @Netsu, saya perhatikan Anda menambahkan kembali kutipan yang telah saya hapus dari lambda Anda. Secara umum, mengutip lambdas itu berbahaya, jadi Stefan dan saya hanya berusaha memotivasi praktik yang baik. :-)
Malabarba

Jawaban:

26

Itu tergantung pada versi Emacs yang Anda gunakan (atau targetkan). Jika Anda secara eksklusif menggunakan Emacs 24+ maka Anda dapat menggunakan varian A dengan aman:

* 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.

Itu dari file NEWS, tetapi sesuai komentar, praktik yang baik untuk menggunakan fungsi-mengutip untuk simbol fungsi, seperti:

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

Jika kode mungkin perlu dijalankan di bawah Emacs 23 (atau sebelumnya), maka saya akan menggunakan varian C, karena secara pribadi saya tidak suka melihat fungsi anonim dalam variabel hook. (Saya tidak yakin saya mengerti apa yang Anda maksud dengan varian D & E, pikiran).

phils
sumber
3
Anda sebaiknya menggunakan kutipan fungsi untuk mode minor, sehingga kompiler byte dapat memperingatkan Anda jika mode tidak terdefinisi.
lunaryorn
Terima kasih. Tetapi apakah fungsi mengutip masih diperlukan? Apa manfaatnya? Juga perlukah untuk lambda juga?
Netsu
7

Berikut ini satu lagi cara untuk melakukannya yang memiliki beberapa kelebihan, dengan asumsi Anda sedang mengedit konfigurasi Anda sendiri, bukan paket yang Anda bagikan.

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

Keuntungannya adalah bahwa segala sesuatu disimpan dalam satu kait, jadi untuk menonaktifkan beberapa hal, Anda tidak harus melakukannya remove-hook, tetapi berikan komentar pada beberapa custom-foo-hookdan C-M-x.

Anda bahkan dapat menulis perintah yang melompat dari mode apa saja ke pengait khusus.

abo-abo
sumber
1
Ini adalah (pada dasarnya) varian C dengan nama yang berbeda, tapi saya setuju itu perlu ditekankan. Ini tentu saja pendekatan yang saya ambil ketika saya menyesuaikan perilaku mode utama dalam konfigurasi saya sendiri.
phils
1
Varian C menyiratkan beberapa add-hookpernyataan untuk setiap mode minor untuk diaktifkan. Saya ingin menekankan bahwa hanya memiliki satu add-hookpernyataan adalah keuntungan.
abo-abo
Sepakat. Di kepala saya, saya cukup banyak menerjemahkan varian C untuk "mendefinisikan fungsi kustom yang memungkinkan mode" daripada "mendefinisikan fungsi kustom yang hanya memungkinkan mode", tetapi dalam retrospeksi yang terakhir tampaknya telah menjadi tujuan. Seperti yang Anda katakan, itu tergantung pada apakah atau tidak kode untuk penggunaan pribadi.
phils
7

Mengapa Anda mendefinisikan perintah baru yang melakukan persis apa bar-minor-mode?

Dimulai dengan 24.1, semua ini sepenuhnya setara, jadi gunakan saja yang kurang redundan: opsi A

(add-hook 'foo-mode-hook #'bar-minor-mode)
Malabarba
sumber
1
Apakah ini solusi aman? Maksud saya jika salah satu mode induk foo-mode-hook memiliki kait yang sama dari mode bar-minor akan memanggil dua kali, sehingga akan dinonaktifkan. Perilaku yang tidak terduga.
Netsu
2
@Netsu ya, memanggil fungsi mode minor tanpa argumen MEMUNGKINKAN mode minor tanpa syarat.
Malabarba
4
@ Malabarba Hanya pada Emacs 24. Dalam versi sebelumnya itu aku benar-benar beralih mode.
lunaryorn
1
@ Lunaryorn Ya, itu sebabnya jawaban phils lebih baik. :-) Saya terlalu malas untuk memperbaiki milik saya.
Malabarba