cc-modeのbefore-save-hook


13

cc-mode保存する前に関数を実行するようにカスタマイズしたい。1つの解決策は、cc-modeキーマップを変更C-x C-sして、必要な作業を実行して保存する関数にバインドすることです。

私の質問は、これのためにカスタマイズできるフックがあるかどうかです。CCフックドキュメントは言及していないbefore-save-hook、特にためにcc-mode。フックを介してこれをどのように行う必要がありますか?

または、これをどのように行うのdefadviceですか?マニュアルを読んだところ、私が見た唯一の方法は、保存する前にアドバイスを有効にし、作業が終わったら無効にすることでした。これは面倒に聞こえます。advicesの慣用的な使い方は何でしょうか?


3
あなたがする追加機能は、before-save-hook現在のメジャーモード(例えばを確認することができます(eq major-mode ...))と、何もしない、それはあなたがカスタマイズされているモードと一致しない場合。
コンスタンティン

@Constantine同意。この種のものに「組み込み」のものがあるかどうかを確認したかったのです。IIRC haskell-modeには少なくとも1つのafter/before-saveフックがあり、これはprog-modesの標準的な方法であると思いました。
Pradhan 14

@Constantine:コメントを回答に変換できますか(もちろん少し拡大します)?
ダン

1
の使用例については、このスレッドを参照してくださいafter-save-hook。同じ種類の手順を使用できますが、代用できbefore-save-hookます。
ダン

回答:


12

フックのアクションを特定のメジャーモードに制限するかなり一般的な方法の1つは、の値を確認することですmajor-mode

たとえば、このフックは次を使用してバッファを保存する前にメッセージを出力しますc++-mode

(defun my-c++-mode-before-save-hook ()
  (when (eq major-mode 'c++-mode)
    (message "It's never too early to start saving (C++ code)!")))

(add-hook 'before-save-hook #'my-c++-mode-before-save-hook)

余談ですが、メジャーモードがCCモードから派生しているかどうかを確認すると便利な場合があります。これを行うには、そうc-buffer-is-cc-modeでないかどうかを確認しますnil

(defun my-cc-mode-before-save-hook ()
  (when c-buffer-is-cc-mode
    (message "Saving a buffer with a major-mode derived from CC Mode.")))

19

または、ローカルフックを使用します。

(add-hook 'c++-mode-hook
          (lambda () (add-hook 'before-save-hook MY-HOOK-FUNC nil 'local)))

これにより、各C ++モードバッファーのバッファーローカル、またはC ++モードから派生したモードのバッファーが追加さMY-HOOK-FUNCれます。 before-save-hook

私はこれを明示的にチェックするよりもエレガントだmajor-modeと思います。他のバッファに影響を与えずに、各バッファのbefore-save-hook ローカルで無効にできるという利点がありますM-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local)


-1

保存時にelispファイルを自動コンパイルするためにそのようなものが必要でした、私はこのようなアプローチを使用しました(アプローチをccモードに変換しました):

(add-hook 'c-common-hook #'(lambda ()
                              (add-hook 'before-save-hook #'(lambda ()
                                                               (funcall #'YOUR-FUNC-HOOK)))))

1
まず、ということc-mode-common-hookですか?2つ目は、に関連する言語をbefore-save-hook初めて入力したときに関数が追加されるように見えますCが、その関数は、すべてのバッファーですべての保存の直前に呼び出されます。OPが行う必要があるのは、特定のモードにあるバッファーを条件として関数を実行することです(方法については、@ Constantineのコメントを参照してください)。
ダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.