Roep een functie op voordat een specifieke hoofdmodus start

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?

Dus voor mijn specifieke gebruiksgeval zou de stroom zoiets zijn als:

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

Tot nu toe heb ik geprobeerd dit te doen met hoofdmodushaken pdb-mode-hook en gud-mode-hook maar dan is de setup niet op tijd en is alleen beschikbaar de volgende tijd waarop ik pdb uitvoer. Op een gegeven moment probeerde ik het ook met advies te doen, maar het was niet succesvol (mogelijk omdat ik het verkeerd deed). Dit is wat ik heb geprobeerd (hoewel ik er niet zeker van ben of dit al dan niet telt als advies ):

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

... die ik heb gebaseerd op een fragment van de Emacs Lisp Referentiehandleiding :

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

Uiteraard heb ik dit niet goed ingesteld en krijg ik het bericht dat (pdb) geen geldige plaatsuitdrukking is wanneer ik het evalueer. Hoewel (omdat?) De documentatie voor add-functie erg gedetailleerd is, heb ik veel moeite om te begrijpen hoe ik het op de juiste manier gebruik.

4
Kun je een basistest toevoegen aan een functie die je toevoegt aan de change-major-mode-hook ? Bijvoorbeeld: (defun my-setup-function() (when (eq major-mode 'python-mode) (do-my-setup-stuff))) , en dan (add-in) haak 'change-major-mode-hook #' my-setup-functie) .
toegevoegd de auteur Scott Cowan, de bron
Hoe zit het met (defadvice: before .. . Lelijk, ik weet het ...
toegevoegd de auteur Thomas Myron, de bron
Ik heb wat werkende (?) Code als antwoord geplaatst, hopelijk kan het helpen. Waarom is het lelijk? Nou, de emacs lisp handleiding heeft wel reserveringen. Zie gnu.org/software/emacs/handmatig/html_node/elisp/& hellip;
toegevoegd de auteur Thomas Myron, de bron
elethan: FYI uw begrip van change-major-mode-hook klopt: major-mode heeft nog steeds zijn originele (pre-change) waarde op dit moment. stackoverflow.com/a/19295380 is wellicht ook van belang.
toegevoegd de auteur Mark Ireland, de bron
defadvice zou ook mijn antwoord zijn. Waarom deel je niet wat je hebt geprobeerd? Misschien zal iemand zien wat er mis mee is.
toegevoegd de auteur db48x, de bron
@Dan Ik heb dit geprobeerd, maar kon het niet laten werken. Moet dit niet my-setup-functie aanroepen wanneer u van python-modus naar een andere modus overschakelt? Misschien mis ik de ketting van gebeurtenissen verkeerd, maar als ik het op deze manier probeer te doen, lijkt het alsof mijn functie nooit een periode ontsteekt.
toegevoegd de auteur Lord Loh., de bron
@ db48x, zie het laatste deel van mijn bijgewerkte vraag voor iets dat ik heb geprobeerd.
toegevoegd de auteur Lord Loh., de bron
@ JonKåreHellan dat klinkt heel dicht bij wat ik in gedachten had, maar ik weet niet zeker hoe ik het goed moet instellen. Ook ben ik niet bezorgd of het lelijk is of niet, zolang het maar werkt. Maar wat is er lelijk aan? Is er een reden waarom je dit soort functies niet zou moeten adviseren of zoiets? Ik ben nog steeds erg nieuw voor elisp
toegevoegd de auteur Lord Loh., de bron

2 antwoord

Dit lijkt te werken. Blijkbaar is defadvice ouderwets, en we zouden in plaats daarvan advies moeten gebruiken.

(defun jk-advice ()
  (message "Kilroy was here"))
(advice-add 'python-mode :before #'jk-advice)
5
toegevoegd
Ik weet niet zeker waarom, maar ik heb deze keer geen advies gekregen om voor mijn specifieke gebruikscasus te werken, hoewel ik blij ben dat dit een eenvoudig, eenvoudig voorbeeld is om in de toekomst te gebruiken. Net als bij het gebruik van hooks, werd mijn setup-functie te laat aangeroepen en trad pas de tweede keer dat ik de debugger gebruikte, in werking. Ik ging met de oplossing van @ Tobias, omdat dat voor mij werkte. Bedankt voor het "advies" over advies !
toegevoegd de auteur Lord Loh., de bron

Doe precies wat je wilt! Dat betekent een functie als volgt definiëren en deze functie uitvoeren in plaats van pdb .

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

Dat zou zijn wat de handleiding suggereert in een andere situatie:

Als u eenvoudig wilt wijzigen wat een bepaalde sleutel doet, is het misschien beter om een ​​nieuwe opdracht te schrijven en de belangrijkste bindingen van de oude opdracht opnieuw toe te wijzen aan de nieuwe (zie Opdrachten opnieuw toewijzen).

3
toegevoegd
Bedankt voor deze suggestie! Het werkte om mijn specifieke probleem op te lossen, maar het is ook een leuk patroon om te weten - om welke reden dan ook, ik heb er nooit iets over gedaan om dingen op deze manier te doen
toegevoegd de auteur Lord Loh., de bron