特定のメジャーモードが始まる前に関数を呼び出す

I have a setup function that I want to run before I use pdb/gud to debug a Python script. I know about gud-mode-hook which runs after the debugger starts (too late) and change-major-mode-hook which, if I understand correctly, runs when you change major modes but before the major mode hook for the new mode (early enough, but will run in cases I don't want it to). How can I have a function called before a specific major mode is initialized?

だから私の特定のユースケースでは、フローは次のようになります:

M-x pdb -> (my-setup-function) is called -> pdb starts (i.e., it's hooks are run etc.)

これまでは、メジャーモードのフック pdb-mode-hookgud-mode-hook でこれを試してみましたが、 pdb を実行している次回の時間を利用できます。ある時点で私はアドバイスでもやってみたが成功しなかった(潜在的には間違っていたため)。これは私が試みたものです(ただし、これが advice としてカウントされるかどうかはわかりません):

 (add-function :before (pdb) #'my-setup-function)

...私は Emacs Lispのスニペットに基づいていますリファレンスマニュアル

(add-function :before (process-filter proc) #'my-tracing-function)

明らかに、これを正しく設定していないので、評価するときに(pdb)が有効なプレース表現ではないというメッセージが表示されます。 add-function のドキュメントは非常に詳細なので、(?)でも、正しく使用する方法を理解するためには多くの問題があります。

4
追加された 編集された
ビュー: 2
change-major-mode-hook に追加する関数に基本テストを追加できますか? 、(add-config-stuff))のように、フック 'change-major-mode-hook#' my-setup-function)
追加された 著者 Scott Cowan,
(defadvice:before .. 。醜いことに、私は知っています...
追加された 著者 Thomas Myron,
私はいくつかの作業(?)コードを答えとして投稿しました。うまくいけば助けてくれるはずです。なぜそれは醜いですか?まあ、emacs lispマニュアルには予約があります。 gnu.orgを参照してください。 /ソフトウェア/ emacs/manual/html_node/elisp /…
追加された 著者 Thomas Myron,
elethan: change-major-mode-hook についてのあなたの理解は正しいです: major-mode は、現時点では元の(変更前の)値を保持しています。 stackoverflow.com/a/19295380 も興味があります。
追加された 著者 Mark Ireland,
defadvice も私の答えになります。なぜあなたが試したことを分かち合っていないのですか?たぶん誰かが間違っているのを見るでしょう。
追加された 著者 db48x,
@ダン私はこれを試みたが、それを働かせることができなかった。 python-mode から別のモードに変更するたびに my-setup-function を呼び出すべきではありませんか?たぶん私はイベントの連鎖を誤解しているかもしれませんが、私の機能がちょうどピリオドを発火させないように思えます。
追加された 著者 Lord Loh.,
@ db48x、私が試みた何かのための私の更新された質問の最後の部分を参照してください。
追加された 著者 Lord Loh.,
@JonKåreHellanは、私が心に留めていたものに非常に近いと聞きましたが、正しく設定する方法がわかりません。また、私はそれが動作する限り、それが醜いかどうかに関心がありません。しかし、それについて醜いのは何ですか?このようなアドバイス機能をしてはならない理由はありますか?私はまだelispには非常に新しいです
追加された 著者 Lord Loh.,

2 答え

これはうまくいくようです。どうやら、defadviceは古風なので、代わりにadvice-addを使用することになっています。

(defun jk-advice ()
  (message "Kilroy was here"))
(advice-add 'python-mode :before #'jk-advice)
5
追加された
私はなぜそうは思っていませんが、今度は私の特定のユースケースのために働くアドバイスを得ることができませんでしたが、これを将来的に使用する簡単で簡単な例として持つのはうれしいです。フックを使うのと同じように、私のセットアップ関数はあまりにも遅くコールされ、2回目にデバッガを使用したときにのみ有効になりました。それが私のために働いたので、私は@ Tobiasの解決策に行きました。しかし、 advice の "advice"をありがとう!
追加された 著者 Lord Loh.,

あなたが望むものを正確に行います! これは、以下のように関数を定義し、この関数を pdb の代わりに実行することを意味します。

(defun mypdb ()
  "Start `pdb' with my own setup."
  (interactive)
  (my-setup-function)
  (pdb))

それは、マニュアルは別の状況で示唆しています:

特定のキーの機能を変更したいだけの場合は、新しいコマンドを作成し、古いコマンドのキーバインドを新しいコマンドに再マッピングする方がよいでしょう(コマンドの再マッピングを参照)。

3
追加された
この提案をありがとう!それは私の特定の問題を解決するために働いたが、知るべき良いパターンでもある - 何らかの理由で、私はこのようなことをすることは決してなかった
追加された 著者 Lord Loh.,