マイナーモードを有効にする適切な方法


24

私が持っているFOO-modeをして可能にするバー・マイナー・モードをそれのために。それで、どちらの方法がより一般的で望ましいですか?

A

(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、ただしアップストリームにプッシュされる機能

E

•バリアント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
マイナーモードには関数引用符を使用することをお勧めします。これにより、モードが定義されていない場合にバイトコンパイラが警告を発することができます。
lunaryorn

ありがとう。しかし、関数の引用はまだ必要ですか?どんな利点がありますか?また、ラムダにも必要ですか?
根津14


7

配布するパッケージではなく、独自の構成を編集していると仮定すると、いくつかの利点があるもう1つの方法があります。

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

利点は、すべてが1つのフックに格納されることです。そのため、いくつかのものを無効にするために行う必要はありませんがremove-hook、代わりにcustom-foo-hookandにいくつかのものをコメントしC-M-xます。

任意のモードからそのカスタムフックにジャンプするコマンドを作成することもできます。


1
これは(本質的に)異なる名前を持つバリアントCですが、強調する価値があることに同意します。これは確かに、自分の設定でメジャーモードの動作をカスタマイズするときに取るアプローチです。
phils

1
バリアントCはadd-hook、有効にするマイナーモードごとに複数のステートメントを意味します。add-hook声明を1つだけ持つことが利点であることを強調したかったのです。
abo-abo

同意した。私の頭では、バリアントCを「モードのみを有効にするカスタム関数を定義する」ではなく、「モードを有効にするカスタム関数を定義する」とほとんど翻訳しましたが、振り返ってみると、後者が意図したようです。あなたが言うように、それはコードが個人的な使用のためであるかどうかに依存します。
phils

7

正確に何をする新しいコマンドを定義するのbar-minor-modeですか?

24.1以降、これらはすべて完全に同等であるため、冗長性の低いオプションを使用してください:オプションA

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

1
安全な解決策ですか?foo-mode-hook親モードの1つがbar-minor-modeが2回呼び出すのと同じフックを持つ場合、無効になります。予期しない動作。
根津

2
@Netsu yes、引数なしでマイナーモード関数を呼び出すと、無条件でマイナーモードが有効になります。
マラバルバ

4
@Malabarba Emacs 24以降のみ。以前のバージョンでは、実際にはモードを切り替えていました。
lunaryorn

1
@lunaryornはい、だからこそphilsの答えのほうが良いのです。:-)私は私を修正するのが面倒でした。
マラバルバ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.