Belirli bir ana modun başlamasından önce bir işlevi çağırın.

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?

Bu yüzden benim özel kullanım durumum için akış şöyle bir şey olurdu:

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

Şimdiye kadar bunu ana mod kancaları pdb-mode-hook ve gud-mode-hook ile yapmayı denedim, ancak kurulum zaman içinde gerçekleşmiyor ve sadece kullanılabilir sonraki zamanı çalıştırıyorum pdb . Bir noktada bunu tavsiye ile yapmayı denedim, ancak başarılı olmadı (potansiyel olarak, yanlış yaptım çünkü). Denediğim şey buydu (bunun tavsiye olarak sayılmasının gerekip gerekmediği konusunda kafam karışık olsa da):

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

... snippet'i Emacs Lisp'den aldım. Referans kılavuzu :

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

Açıkçası, bunu doğru şekilde ayarlamamıştım ve bunu değerlendirdiğimde (pdb) 'nin geçerli bir yer ifadesi olmadığı iletisini alıyorum. add-function dokümantasyonu çok detaylı olsa da, düzgün bir şekilde nasıl kullanılacağını anlamakta çok fazla sorun yaşıyorum.

4
Büyük mod değiştirme kancası 'na eklediğiniz bir işleve temel bir test ekleyebilir misiniz? Örneğin, (my-setup-function() işlevini devre dışı bırak (ne zaman (büyük ana mod 'python modu) (do-my-setup-stuff))) ve sonra (add- kanca 'change-major-mode-hook' 'benim-kurulum-işlevi) .
katma yazar Scott Cowan, kaynak
Peki ya (defadvice: önce .. . Çirkin, biliyorum ...
katma yazar Thomas Myron, kaynak
Bazı çalışma (?) Kodunu cevap olarak gönderdim, umarım yardımcı olabilir. Neden çirkin? Eh, emacs lisp kılavuzu rezervasyonları var. gnu.org adresine bakın./yazılım/emacs/manuel/html_node/elisp/& hellip;
katma yazar Thomas Myron, kaynak
elethan: FYI büyük mod-kanca-modunu değiştir 'iniz doğrudur: major-mode hala orijinal (ön değiştirme) değerine sahiptir. stackoverflow.com/a/19295380 da ilginizi çekebilir.
katma yazar Mark Ireland, kaynak
defadvice cevabım da olurdu. Neden denediğini paylaşmıyorsun? Belki birisi neyin yanlış olduğunu görecektir.
katma yazar db48x, kaynak
@Dan bunu denedim, ama işe alamadım. python-mode 'dan başka bir moda geçtiğinizde bu kurulum-kurulum çağrılmamalıdır? Belki de olay zincirini yanlış anladım, ama bu şekilde denemek, benim fonksiyonumun asla periyodu asla kovmaması gibi görünüyor.
katma yazar Lord Loh., kaynak
@ db48x, çalıştığım bir şey için güncellenmiş sorumun son bölümüne bakın.
katma yazar Lord Loh., kaynak
@ JonKåreHellan, aklımda olanlara çok yakın geliyor ama nasıl ayarlanacağından emin değilim. Ayrıca, çalıştığı sürece çirkin olup olmadığıyla ilgilenmiyorum. Ama bu konuda ne çirkin? Bunun gibi işlevler tavsiye etmemenizin bir sebebi var mı? Hala elisp için çok yeni
katma yazar Lord Loh., kaynak

2 cevap

Bu işe yarıyor. Görünüşe göre, defadvice eski moda ve onun yerine tavsiyede bulunmalıyız.

(defun jk-advice ()
  (message "Kilroy was here"))
(advice-add 'python-mode :before #'jk-advice)
5
katma
Neden olduğundan emin değilim, ama bu sefer özel kullanım durumum için çalışmam için tavsiyede bulunamamıştım, ancak bunu gelecekte kullanmak için basit ve basit bir örnek olarak görmekten memnuniyet duyuyorum. Kanca kullanmaya benzer şekilde, kurulum işlevim çok geç çağrıldı ve hata ayıklayıcısını ikinci kez kullandığımda etkili oldu. Tobias'ın çözümü ile gittim, çünkü bu benim için çalıştı. Yine de tavsiye 'de "tavsiye" için teşekkürler!
katma yazar Lord Loh., kaynak

Tam olarak ne istiyorsan yap! Bu, aşağıdaki gibi bir işlev tanımlamak ve pdb yerine bu işlevi çalıştırmak anlamına gelir.

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

Bu, manuel başka bir durumda önerir:

Sadece belirli bir tuşun ne yaptığını değiştirmek isterseniz, yeni bir komut yazmak ve eski komutun anahtar bağlantılarını yenisiyle yeniden düzenlemek daha iyi olabilir (bkz. Remapping Komutları).

3
katma
Bu öneri için teşekkürler! Benim özel problemimi çözmek için çalıştı, ama aynı zamanda bilmek güzel bir model - her ne sebeple olursa olsun, bu şekilde şeyler yapmaktan asla
katma yazar Lord Loh., kaynak