Правильний спосіб включення другорядного режиму


24

У мене є foo-режим, і я б увімкнув режим bar-minor для нього. То який спосіб є більш поширеним і кращим?

А

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

Б

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

С

(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, але функція висунута вгору за течією

Е

• варіант C, але функція зберігається в рецепті плагіна


4
Привіт @Netsu, я помітив, що ти додав цитату, яку я зняв з твоєї лямбда. Взагалі, цитувати лямбдасів шкідливо, тому ми з Стефаном просто намагаємося мотивувати добрі практики. :-)
Малабарба

Відповіді:


26

Це залежить від того, яку версію (-ів) Emacs ви використовуєте (або націлюєте). Якщо ви використовуєте виключно Emacs 24+, тоді ви можете сміливо використовувати варіант A:

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

Це з файлу NEWS, але відповідно до коментарів, добре застосовувати котирування функцій для символів функції, наприклад:

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

Якщо коду, можливо, потрібно запустити під Emacs 23 (або раніше), я б пішов з варіантом C, оскільки особисто мені не подобається бачити анонімні функції в гакових змінних. (Я не впевнений, я розумію, що ви маєте на увазі під варіантами D&E, розум).


3
Ви бажано використовувати котирування функцій для другорядного режиму, щоб компілятор байтів міг попередити вас, якщо режим не визначений.
місячник

Спасибі. Але чи все-таки необхідне котирування функцій? Які переваги це дає? Також це потрібно і лямбдам?
Netsu


7

Ось ще один спосіб зробити це, який має деякі переваги, якщо припустити, що ви редагуєте власну конфігурацію, а не пакет, який ви поширюєте.

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

Перевага полягає в тому, що все зберігається в одному гачку, тому для відключення деяких речей не потрібно робити remove-hook, а натомість коментувати деякі речі в custom-foo-hookі C-M-x.

Ви навіть можете написати команду, яка переходить з будь-якого режиму на спеціальний гачок.


1
Це (по суті) варіант С з іншою назвою, але я згоден, що це варто наголосити. Це, безумовно, підхід, який я використовую, коли я налаштовую основні режими поведінки у власному конфігурації.
філс

1
Варіант C передбачає декілька add-hookвисловлювань для кожного другорядного режиму. Я хотів підкреслити, що мати лише одне add-hookтвердження - це перевага.
або-або

Домовились. У голові я досить перекладений варіант С "визначити власну функцію, яка дозволяє режиму", а не "визначити користувацьку функцію, яка тільки дозволяє режим", але в ретроспективі останній, здається, був наміром. Як ви кажете, це залежить від того, чи використовується код для особистого використання.
філс

7

Чому б ви визначили нову команду, яка робить саме те, що bar-minor-modeробить?

Починаючи з 24.1, все це абсолютно рівнозначно, тому просто використовуйте менш зайвий: варіант A

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

1
Це безпечне рішення? Я маю на увазі, якщо один з батьківських режимів foo-mode з гаком має такий же гак, ніж режим bar-minor , що дзвонить двічі, тому буде відключений. Несподівана поведінка.
Netsu

2
@Netsu так, виклик функції другорядного режиму без аргументів БЕЗПЕЧНО ЗАБЕЗПЕЧАЄ другорядний режим.
Малабарба

4
@Malabarba Тільки станом на Emacs 24. У попередніх версіях це фактично перемикання режиму.
місячник

1
@lunaryorn Так, тому відповідь Філса краще. :-) Мені було дуже лінь виправити своє.
Малабарба
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.