Richtige Möglichkeit, den Nebenmodus zu aktivieren

24

Ich habe Foo-Modus und würde Bar-Moll-Modus dafür aktivieren . Welcher Weg ist also üblicher und vorzuziehen?

EIN

(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

• Variante C, aber die Funktion wurde nach oben verschoben

E

• Variante C, aber die Funktion ist im Rezept des Plugins gespeichert

Netsu
quelle
4
Hallo @Netsu, mir ist aufgefallen, dass Sie das Zitat, das ich aus Ihrem Lambda entfernt hatte, wieder hinzugefügt haben. Im Allgemeinen ist es schädlich, Lambdas zu zitieren, daher versuchen Stefan und ich nur, gute Praktiken zu motivieren. :-)
Malabarba

Antworten:

26

Es hängt davon ab, welche Version (en) von Emacs Sie verwenden (oder welche Ausrichtung Sie verwenden). Wenn Sie ausschließlich Emacs 24+ verwenden, können Sie Variante A sicher verwenden:

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

Das ist aus der NEWS-Datei, aber gemäß den Kommentaren ist es eine gute Praxis, Funktionszitate für Funktionssymbole zu verwenden, wie folgt:

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

Wenn der Code unter Emacs 23 (oder früher) ausgeführt werden muss, würde ich Variante C wählen, da ich anonyme Funktionen in Hook-Variablen nicht mag. (Ich bin mir nicht sicher, ob ich verstehe, was Sie mit den Varianten D & E meinen.)

Phils
quelle
3
Verwenden Sie vorzugsweise Funktionsanführungszeichen für den Nebenmodus, damit der Byte-Compiler Sie warnen kann, wenn der Modus undefiniert ist.
Lunaryorn
Vielen Dank. Aber ist das Zitieren von Funktionen noch notwendig? Welche Vorteile bietet es? Ist es auch für Lambdas notwendig?
Netsu
7

Hier ist eine weitere Möglichkeit, die einige Vorteile bietet, vorausgesetzt, Sie bearbeiten Ihre eigene Konfiguration und nicht ein Paket, das Sie verteilen.

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

Der Vorteil ist, dass alles in einem Hook gespeichert ist. Um also einiges zu deaktivieren, müssen Sie nichts tun remove-hook, sondern einiges in custom-foo-hookund kommentieren C-M-x.

Sie können sogar einen Befehl schreiben, der von einem beliebigen Modus zu seinem benutzerdefinierten Hook springt.

abo-abo
quelle
1
Dies ist (im Wesentlichen) Variante C mit einem anderen Namen, aber ich stimme zu, dass es wert ist, hervorgehoben zu werden. Dies ist sicherlich der Ansatz, den ich verfolge, wenn ich das Verhalten der Hauptmodi in meiner eigenen Konfiguration anpasse.
Phils
1
Variante C impliziert mehrere add-hookAnweisungen für jeden zu aktivierenden Nebenmodus. Ich wollte betonen, dass es von add-hookVorteil ist , nur eine Aussage zu haben.
abo-abo
Einverstanden. In meinem Kopf habe ich Variante C so ziemlich übersetzt, um "eine benutzerdefinierte Funktion zu definieren, die den Modus aktiviert", anstatt "eine benutzerdefinierte Funktion zu definieren, die nur den Modus aktiviert", aber im Nachhinein scheint letzteres die Absicht gewesen zu sein. Wie Sie sagen, hängt es davon ab, ob der Code für den persönlichen Gebrauch bestimmt ist oder nicht.
Phils
7

Warum sollten Sie einen neuen Befehl definieren, der genau das bar-minor-modetut , was er tut?

Ab 24.1 sind alle gleich, verwenden Sie also einfach die weniger redundante: Option A

(add-hook 'foo-mode-hook #'bar-minor-mode)
Malabarba
quelle
1
Ist es eine sichere Lösung? Ich meine, wenn einer der übergeordneten Modi von foo-mode-hook denselben Hook hat wie der Bar-Moll-Modus, wird er zweimal aufgerufen und ist daher deaktiviert. Unerwartetes Verhalten.
Netsu
2
@Netsu Ja, Aufrufen einer Nebenmodusfunktion ohne Argumente AKTIVIERT den Nebenmodus bedingungslos.
Malabarba
4
@Malabarba Nur ab Emacs 24. In früheren Versionen wurde der Modus tatsächlich umgeschaltet.
Lunaryorn
1
@lunaryorn Ja, deshalb ist die Antwort von phils besser. :-) Ich war zu faul, um meine zu reparieren.
Malabarba