Emacs 24.4'teki yeni tavsiye sisteminin pratik faydaları


53

Emacs 24.4 yeni bir tavsiye sistemi ile birlikte geliyor. NEWSDosya diyor ki:

** Yeni paket nadvice.eldaha hafif tavsiye olanakları sunar. Olarak katmanlı:

*** add-function/ remove-function, işlem filtreleri veya <foo>-functionkancalar gibi herhangi bir fonksiyon taşıyan yere kod eklemek / kaldırmak için kullanılabilir .

*** advice-add/ advice-removeadlandırılmış bir işleve bir tavsiye parçası eklemek / kaldırmak, aynen defadviceöyle.

S: Bu yeni paketin pratik yararları ve etkileri nelerdir?

Özellikle aşağıdaki hususları ele alan cevaplarla ilgileniyorum:

  • Yalnızca Emacs'ı özelleştirmek için tavsiye kullanıyorum (eklenti paketleri yazmak yerine), yeni sisteme geçmem gerekir mi? Bir noktada eski sistemin yerini alacak mı?

  • Gerçekleştiremediğim yeni sistemle tam olarak ne yapabilirim defadvice?

  • “Herhangi bir fonksiyon taşıyan yere kod ekleyebilmek / kaldırabilmenin” önemi nedir?

Yanıtlar:


57

Yeni tavsiye sistemi aşağıdaki avantajlara sahiptir:

  • add-function: Bu, sadece defadvice'nin parçası olmayan yepyeni bir işlevselliktir. Bu arasında melez bir tür add-hookve defadvice. Gelecekte, daha fazla foo-functiondeğişken (yoluyla değiştirilir add-function) ve daha az foo-functions(yoluyla değiştirilir ) beklenir add-hook. Bu işlevsellik, farklı paketler arasında bir süreç filtresini nasıl "paylaşacağınızı" soran bir hata raporu tarafından tetiklenen yeni tavsiye sistemini uygulamaya koymak için ana motivasyondu.

  • Uygulama basitliği: bir kez add-functionuygulamaya advice-addkonulduğunda, 100KB tavsiyesinin neredeyse tüm işlevselliğini getiren işlevselliği uygulamak sadece 8KB alır .

  • Tasarım basitliği: defadvice, kesin ve / veya nadiren kullanılanları anlamakta genellikle zor olan çeşitli kavramlara sahiptir. Örneğin "etkinleştirme" ve "etkinleştirme" önerileri arasındaki fark. Veya "pre" ve / veya "compiled" anlamına gelir. ad-do-itBir çağrıdan ziyade değişken bir referans gibi görünmesi ya da (setq ad-return-value ...)sadece değeri döndürmek yerine açık bir şekilde açıklamanız gerektiği gerçeği gibi işlemlerde de tuhaflıklar vardır .

  • Defadvice, makro yayılma ve derleme ile ilgili çeşitli sorunlardan muzdariptir: bir tavsiyenin gövdesi, "kod" (derleyici ve makro yayılımcının gördüğü) olarak değil, daha sonra bir ifadeyi oluşturmak için birleştirilen "veri" olarak ortaya çıkar. Bu yüzden makro genişlemenin geç olması (bunun gibi şeyleri kullanırsanız sürprizlere neden olabilir (eval-when-compile (require 'foo))) ve sözcüksel kapsamın doğru şekilde korunması zordur.

Yeni sisteme geçmeniz gerekip gerekmediğine gelince: Gelecekte bir noktada eski defadvice sisteminden kurtulmak niyetindeyim, ancak bu geleceğin nispeten uzak olduğunu düşünüyorum (ve önce lisp/obsoleteo zamana geçmesi gerekecek. GNU ELPA’ya).


1
Eski tavsiye sistemi tarafından sunulan aynı argüman değiştirme işlevini nadvice.el'e eklemek için planlar var mı?
Aaron Miller

Hayır, bu hemen hemen hiçbir nadvice.el bağlamında anlamsızdır. Ancak aynı etkiyi elde etmek için :aroundtavsiye (veya :filter-argsveya :filter-resulttavsiye) kullanabilirsiniz.
Stefan

2
Yine de yapamam. Diyelim ki, sadece ikinci argümanın yerine iki argümanın bir işlevini önermek istediğimi, böylece önerilen işlevin birincisi için etkileşimli biçimine göre istekte bulunacağını varsayalım. Yeni tavsiyeler , tavsiye edilen bir işlevin etkileşimli biçimini değiştirmenin birkaç farklı yolunu oluşturuyor gibi gözüküyor , ancak bundan daha fazla nüans sunan hiçbir şey göremiyorum.
Aaron Miller

@AaronMiller: Lütfen ayrı bir SX sorusu yapın, bu nedenle SX yorumlarının yapay sınırları olmadan tartışılabilir.
Stefan

Yapıldı, emacs.stackexchange.com/q/19233/2162 adresinde . Takip ettiğiniz için teşekkür ederim. (Ayrıca cevabınızda bahsettiğiniz hata raporunu da görmek isterdim, ancak Google’da veya posta listesi arşiv araması yoluyla bulamadım. Bağlantınız var mı?)
Aaron Miller

9

Tavsiyenin normal fonksiyonlar olmasının en belirgin yararlarından biri bir tanımı ziyaret edebilmenizdir find-function.

Şu anda, (yeni tarz) tavsiye edilen bir fonksiyonun yardımını görüntülerken, tavsiye fonksiyonu için yardım bağlantısı ve oradan da kaynağa bir bağlantı (fonksiyon yardımı için her zamanki gibi) sağlamaktadır.

Eski sistem tavsiyeyi satır içi dokümante etti, ancak kodu görmenin bir yolu yoktu (genellikle başvurdum rgrep).

(Şahsen, satır içi dokümanı yapmaktan hoşlandığım için, yardımın gösterilmesinde eski ve yeni yaklaşımların bir karışımını görmek isterdim, ancak bu yolun sonuna kadar mümkün olduğuna eminim.)


2
Evet, yeni tavsiye sisteminin olduğu gibi mevcut doc string'e eklemenize izin vermemesi çok kötü defadvice. Bkz bu Emacs hata raporu . Bu eksik.
Drew

8

Dosya başlığından:

;;; Commentary:

;; This package lets you add behavior (which we call "piece of advice") to
;; existing functions, like the old `advice.el' package, but with much fewer
;; bells and whistles.

Okuduğum gibi, öncelikli hedef daha fazla yeteneğe sahip olmamak için eski tavsiye sisteminden daha basit olmak. Belgeleri okumak, işlevselliğin advice-addbir alt kümesini, işlem filtreleri gibi geleneksel olmayan işlevler önermek için hoş bir işlevsellik içeriyor gibi görünmektedir (muhtemelen bu mümkündü , ama nasıl emin değilim).defadviceadd-functiondefadvice

Bildiğim kadarıyla, defadviceresmen onaylanmadı, bu yüzden şu an için kullanmaktan çekinmeyin (eğer bir paket yazarıysanız, 24.4 daha yaygınlaşana kadar kullanmaya devam etmek isteyebilirsiniz). Ancak, Emacs yazarları sonunda tamamen yeni sisteme tamamen geçmek istiyor gibi görünüyor, bu yüzden muhtemelen yavaş geçiş yapmak mantıklı geliyor.


5

Evet. Yeni, daha farklı değil. Ve evet, orada çok fazla kullanım defadvicevar (ve olmaya devam edecek).
Drew

0

Bazı açılardan daha basit bir yaklaşımla "yeni" danışma sisteminin (daha iyi modülerliği ve "tutkal") nedeniyle olsa - Ben burada sözü görmedim bir şey vardır diğer yanıtlar sözü edilmiş - şudur: nadvice tavsiyesi eklemek, birleştirmek, kaldırmak, yeniden düzenlemek vb. çok daha kolaydır .

Dinamik olarak etkileşimli, dinamik olarak yapmak bile mümkündür, ancak nadvice bunu kolaylaştırmak için biraz yardıma ihtiyaç duyuyor. Nadvice'nin bu şekilde kullanılmasının (tavsiyenin etkileşimli kompozisyonu) kullanılmasının farkında değilim, ancak böyle bir uygulama en az var. Ben de onu kullanmakta ISearch + ekleyebilir ve keyfi ISearch filtre yüklemler (filtreler) aranırken kombinasyonlarını kaldırmasını sağlamak için.

IOW, arama şablonunuzu adım adım değiştirdiğinizde, birden fazla filtre kullanarak aramanızı hassas hale getirebilirsiniz.

Isearch filtreleme, bir isearch-filter-predicatesüredir mevcut olan değişken kullanılarak yapılır . Ancak, Isearch filtreleri sık sık tanımlanmamıştır. Genellikle statiktir ve belirli bir bağlam için önceden tanımlanmıştır (örn. Wdired). Kullanıcıların en azından etkileşimli olarak tanımlamaları ve kullanmaları kolay değildir.

Orada sadece bir değişken, isearch-filter-predicateyani değişen filtreleme çok değişen anlamına gelir , dar genişletmek ya da başka bir arama değiştirmek için, yüklemler'ıN birleştirerek, fonksiyonlar oluşturan tutarındadır tek filtre koşulu.

Ama tam olarak nadvice'nin iyi olduğu şey bu. Özetle, nadvice, arama filtrelemesini etkileşimli bir şekilde hassaslaştırmayı kolaylaştıracak işlevleri birleştirmek için çok kullanışlıdır . ( Bu konuda daha fazla bilgi için Dinamik Arama Filtreleme konusuna bakın .)

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.