Виклик функції перед тим, як починається певний основний режим

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-hook і gud-mode-hook , але тоді налаштування не відбувається вчасно, і це лише доступний наступний час, коли я запускаю pdb . У один момент я намагався зробити це з порадою, але, але не був успішним (потенційно, тому що я зробив це неправильно). Це те, що я намагався (хоча я не розумію, чи вважається це порадою ):

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

... на основі фрагмента з Emacs Lisp Довідковий посібник :

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

Очевидно, що я не встановив це право, і я отримую повідомлення, що (pdb) не є дійсним виразом місця , коли я його оцінюю. Незважаючи на те, що (тому що?) Документація для add-function дуже докладна, у мене є багато проблем з розумінням того, як правильно її використовувати.

4
Не могли б ви додати основний тест до функції, яку ви додаєте до change-major-mode-hook ? Наприклад, (defun my-setup-function() (коли (eq основний режим 'python-mode') (do-my-setup-stuff))) , а потім (додати гачок 'change-major-mode-hook #' my-setup-function) .
додано Автор Scott Cowan, джерело
А як щодо (defadvice: до .. . Потворний, я знаю ...
додано Автор Thomas Myron, джерело
Я відправив деякий робочий (?) Код як відповідь, сподіваюся, він може допомогти. Чому це потворно? Ну, у керівництві lisp для emacs є застереження. Див. gnu.org/software/emacs/manual/html_node/elisp/& hellip;
додано Автор Thomas Myron, джерело
elethan: FYI Ваше розуміння change-major-mode-hook є правильним: major-mode все ще має своє початкове (попереднє) значення. Також може бути цікавим stackoverflow.com/a/19295380 .
додано Автор Mark Ireland, джерело
defadvice також буде моєю відповіддю. Чому б вам не поділитися тим, що ви пробували? Можливо, хтось побачить, що не так.
додано Автор db48x, джерело
@Dan Я спробував це, але не міг змусити його працювати. Чи не слід цей виклик my-setup-function при переході з python-mode в інший режим? Можливо, я нерозумію ланцюг подій, але намагаюся таким чином, здається, моя функція просто ніколи не спрацьовує.
додано Автор Lord Loh., джерело
@ db48x, дивіться останню частину мого оновленого запитання про те, що я намагався.
додано Автор Lord Loh., джерело
@ JonKåreHellan це звучить дуже близько до того, що я мав на увазі, але я не впевнений, як налаштувати це право. Крім того, я не стурбований тим, чи є це потворно чи ні, поки вона працює. Але що це потворно? Чи є причина, чому ви не повинні радити такі функції чи щось подібне? Я все ще дуже новий до elisp
додано Автор Lord Loh., джерело

2 Відповіді

Це, здається, працює. Очевидно, defadvice старомодна, та ми вважаємось щоб використати пораду-додаємо замість цього.

(defun jk-advice ()
  (message "Kilroy was here"))
(advice-add 'python-mode :before #'jk-advice)
5
додано
Я не впевнений, чому, але мені не вдалося отримати консультацію для роботи на моєму конкретному випадку цього разу, хоча я радий, що це як простий, простий приклад для використання в майбутньому. Подібно до використання гачків, моя функція налаштування отримала назву занадто пізно, і набрала чинності лише другий раз, коли я використовував відладчик. Я пішов з рішенням Тобіаса, тому що це працювало для мене. Спасибі за "пораду" на поради !
додано Автор Lord Loh., джерело

Робіть саме те, що ви хочете! Це означає, що визначте функцію таким чином і виконайте цю функцію замість pdb .

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

Це було б те, що в інструкція пропонує в іншій ситуації:

Якщо ви просто хочете змінити те, що робить певний ключ, краще написати нову команду і перепризначити старі прив'язки ключів команди до нової (див. Команди перепризначення).

3
додано
Дякуємо за цю пропозицію! Це спрацювало, щоб вирішити мою особливу проблему, але це також хороший зразок, щоб знати - з якої-небудь причини, я ніколи не про те, що робити таким чином
додано Автор Lord Loh., джерело