Nadvice'yi nasıl kullanırım?


29

Konfigürasyonum tavsiye dolu ve yeni parlak minimalist nadvice.elpaket hakkında sürekli bilgi alıyorum .

Kılavuzları araştırdım ve kaynağı okudum , ama açıkça itiraf edeceğim: Hala nasıl kullanılacağı hakkında hiçbir fikrim yok.

Buradaki herhangi biri beni bir rehbere yönlendirebilir veya eski tarz tavsiyemi anlatmaya nasıl başlayacağımı söyleyebilir mi?


7
Soru için +1. Eğer kılavuzları aradı ve ettiyseniz bir (doc) hata bildirme raporu düşünün lütfen, gerekeni bulundu: M-x report-emacs-bug. Bazı geliştiriciler bazen belgelemeyi geliştirmeyi tercih ediyor. ;-) Emacs'in belgenin kendisinin olması önemlidir.
Drew,

2
El kitabında aslında bununla ilgili bir bölüm var, bakınız (info "(elisp) Eski tavsiyeleri taşıma") . Her ne sebeple olursa olsun detaylı dizinde listelenmemiş.
wasamasa

4
Yakından ilgili: Emacs
24.4'teki

3
Kullanarak birkaç örnek nadvicebenim yapılandırmasındaki: : sonra , : Filtre-dönüş , : etrafında , : önce-dek
Kaushal Modi

1
@wasamasa Korkarım ki bu bölüm tamamlanmaktan uzak. Daha karmaşık olan birkaç tavsiyem var (belki sadece bir tane göreceğiz). Burada her biri için bir soru yapmalı mıyım?
PythonNut

Yanıtlar:


22

İhtiyacınız olan tüm bilgiler C-h f add-function, altında yatan mekanizmayı tanımlayan dahil edilmiştir advice-add.

Yeni öneri sistemi temelde, bir fonksiyonun mevcut tanımını C-h f add-function, WHERE argüman seçiminize bağlı olarak , tabloda hangi fonksiyonun hangi kaynak dosyada tanımlanmış olduğunu izlemek amacıyla temizleyici olarak tanımlanmış olan fonksiyonla değiştirmek gibi davranır .

:aroundSeçeneği olan bir örnek

En genel durum :aroundseçenek, bu yüzden bunun için bir örnek vereyim. ( WHEREMümkünse özel parametreler kullanmak muhtemelen daha iyidir , ancak birbirinizi eşdeğer bir :aroundişlevle değiştirebilirsiniz .)

Örnek olarak, her kullanımında hata ayıklamak find-file istediğinizi printve tartışma listesine girmek istediğinizi varsayalım. Yazabilirsin

(defun my-find-file-advice-print-arguments (old-function &rest arguments)
  "Print the argument list every time the advised function is called."
  (print arguments)
  (apply old-function arguments))

(advice-add #'find-file :around #'my-find-file-advice-print-arguments)

Bu yeni uygulama ile tavsiyenin ihtiyaç duyduğu her şey argüman olarak kabul edilir. ad-get-argsGereksiz hale gelir, çünkü argümanlar tavsiye fonksiyonuna normal fonksiyon argümanları olarak iletilir ( WHEREanlam ifade ettiği argümanlar için). ad-do-itgibi gereksiz hale gelir :around, böylece, tavsiye argümanları fonksiyonu ve argümanlar olarak alır (ad-do-it)formu ile değiştirilir

(apply old-function arguments)

veya bağımsız değişkenleri adlandırdığınızda

(funcall old-function first-arg second-arg)

Hangi sihirli formlar olduğundan daha temizdir. Değişkenleri değiştirmek, değiştirilmiş değerleri geçirerek gerçekleşir OLD-FUNCTION.

Diğer WHEREdeğerler

Dokümantasyonu, add-functiontüm tavsiye yerlerinin (veya “birleştiricilerin”) ve neye eşdeğer olduklarının bir tablosunu içerir ve önerilen işleve lambdaeşdeğer bir davranış açısından işlevselliği açıklar :

`:before'       (lambda (&rest r) (apply FUNCTION r) (apply OLDFUN r))
`:after'        (lambda (&rest r) (prog1 (apply OLDFUN r) (apply FUNCTION r)))
`:around'       (lambda (&rest r) (apply FUNCTION OLDFUN r))
`:override'     (lambda (&rest r) (apply FUNCTION r))
`:before-while' (lambda (&rest r) (and (apply FUNCTION r) (apply OLDFUN r)))
`:before-until' (lambda (&rest r) (or  (apply FUNCTION r) (apply OLDFUN r)))
`:after-while'  (lambda (&rest r) (and (apply OLDFUN r) (apply FUNCTION r)))
`:after-until'  (lambda (&rest r) (or  (apply OLDFUN r) (apply FUNCTION r)))
`:filter-args'  (lambda (&rest r) (apply OLDFUN (funcall FUNCTION r)))
`:filter-return'(lambda (&rest r) (funcall FUNCTION (apply OLDFUN r)))

(cited from `C-h f add-function')

FONKSİYON, bir tavsiye işlevidir ve OLDFUN, önerinin eklendiği işlevdir. Hepsini bir kerede anlamaya çalışmayın, sadece WHEREuygun görünen bir sembol seçin ve onu anlamaya çalışın.

Ya da sadece kullanın :around. Bildiğim kadarıyla uzman kullanarak tek avantajı söyleyebilirim WHEREüzerinde ler :aroundher şey için yukarı bakarak biraz daha fazla bilgi almak olmasıdır C-h f ADVISED-FUNCTION öncesinde tavsiye docstring'ini okumaya. Tavsiyeyi içeren kodu yayınlamayı planlamıyorsanız, muhtemelen önemli değildir.

Adlandırılmış tavsiye fonksiyonları

Bir çok avantaj sağladığı için adlandırılmış fonksiyonları tavsiye olarak kullanmanızı öneririm (bazıları kancalarda adlandırılmış fonksiyonları kullanmak için de geçerlidir):

  • Bu renkte görünür C-h f find-fileolarak

    :around advice: `my-find-file-advice-print-arguments'
    

    Her zaman olduğu gibi tanımlandığı dosyaya bir bağlantı içeren tavsiye işlevinin tanımına bağlantı verir. Tavsiye, lambdadoğrudan formdaki bir form olarak tanımlanmış advice-add olsaydı, dokümanlar satır içi (uzun dokümanlar için bir karışıklık?) Gösterilecek ve hiçbir şey nerede tanımlandığını göstermeyecekti.

  • İle tavsiyeyi kaldırabilirsiniz

    (advice-remove #'find-file #'my-find-file-advice-print-arguments)
    
  • advice-addEski sürümün aktif kalması için tavsiye tanımını tekrar tekrar çalıştırmadan veya riske atmadan riske sokabilirsiniz ( advice-adddeğiştikçe çalışmak eski sürüm için lambdabir güncelleme olarak değil, yeni bir tavsiye olarak kabul edilecektir).

Yan sözler#'function notasyonu için temelde eşdeğer 'functionfarklı (yazım hataları örneğin) bayt derleyici eksik fonksiyonları belirlemek oldukça fonksiyon adları gibi semboller tanımlamak ve yardımcı olması dışında,.


Gereğince tartışma Ben olması gerektiği .., karma-tırnak tüm argümanları burada kullanılmamalıdır Stephen Monnier'in ile yaptığı (advice-add 'find-file :around #'my-find-file-advice-print-arguments)ve benzer (advice-remove 'find-file #'my-find-file-advice-print-arguments).
Kaushal Modi

Sanırım advice-addsınır davası. Şahsen ben ' ↔ #'ayrımcılığı, işlev isimlerindeki yazım hatalarını tanımlamak için çoğunlukla bir yardım olarak görüyorum , bu yüzden burada muhtemelen işlevin, önerinin eklendiği zaman tarafından tanımlanmasını bekleyip beklemeyeceğine bağlı olacaktır.
kdb

@kdb Sonunda bunu kendim öğrendim (dokümanlar için koştuktan sonra add-function). Keşke dokümanlar bunu daha açık hale getirseydi. Bunun için bir yama yapmak isteyebilirim.
PythonNut

@kdb "Görünüyor C-h f find-file, görünmüyor C-xmu?"
Peeja

@Peeja Evet, düzeltildi.
kdb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.