Emacs 24.4 jest wyposażony w nowy system porad. NEWS
Plik mówi:
** Nowy pakiet
nadvice.el
oferuje lżejsze usługi doradcze. Składa się z następujących warstw:***
add-function
/remove-function
, którego można użyć do dodania / usunięcia kodu w dowolnym miejscu, w którym znajdują się funkcje, takim jak filtry procesowe lub<foo>-function
haki.***
advice-add
/,advice-remove
aby dodać / usunąć fragment porady na temat nazwanej funkcji, podobnie jakdefadvice
robi.
P: Jakie są praktyczne korzyści i implikacje tego nowego pakietu?
Szczególnie interesują mnie odpowiedzi dotyczące następujących kwestii:
Jeśli korzystam tylko z porad, aby dostosować Emacsa (w przeciwieństwie do pisania dodatków), czy muszę przejść na nowy system? Czy w pewnym momencie zastąpi stary system?
Co dokładnie mogę zrobić z nowym systemem, którego nie mogę osiągnąć
defadvice
?Jakie znaczenie ma możliwość „dodawania / usuwania kodu w dowolnym miejscu pełniącym funkcję”?
:around
porady (:filter-args
lub:filter-result
porady), aby uzyskać ten sam efekt.Jedną z wyraźnych korzyści wynikających z bycia normalnymi funkcjami jest to, że można odwiedzić definicję
find-function
.Obecnie podczas przeglądania pomocy dla funkcji zalecanej (w nowym stylu) zawiera ona link do pomocy dla funkcji porady, a stamtąd link do źródła (jak zwykle dla pomocy funkcji).
Stary system zawierał informacje w formie instrukcji, ale nie było sposobu, aby zobaczyć kod (zwykle uciekałem się
rgrep
).(Osobiście chciałbym zobaczyć połączenie starego i nowego podejścia do wyświetlania pomocy, ponieważ lubiłem mieć wbudowany dokument, ale jestem pewien, że jest to możliwe na później.)
źródło
defadvice
. Zobacz raport o błędach Emacsa . To jest wada.Z nagłówka pliku:
Kiedy czytam, głównym celem jest prostota niż stary system porad, a nie posiadanie większych możliwości. Czytając dokumentację, wydaje się, że
advice-add
zawiera podzbiórdefadvice
funkcjonalności, a jednocześnieadd-function
zawiera niezłą funkcjonalność do doradzania nietradycyjnym funkcjom, takim jak filtry procesów (co prawdopodobnie było możliwe przy pomocydefadvice
, ale nie jestem pewien jak).O ile mi wiadomo,
defadvice
nie jest oficjalnie przestarzałe, więc powinieneś swobodnie korzystać z niego na razie (a jeśli jesteś autorem pakietu, prawdopodobnie zechcesz nadal go używać, dopóki 24.4 nie zostanie szerzej przyjęte). Wygląda jednak na to, że autorzy Emacsa chcą ostatecznie całkowicie migrować do nowego systemu, więc prawdopodobnie warto powoli się przełączać.źródło
defadvice
(i nadal będzie).Jedna rzecz nie widziałem wspomniano tutaj - chociaż w pewnym sensie jest to ze względu na prostszą podejścia (lepiej modułowości i „klej”) „nowego” systemu doradztwa, który został już wspomniano w innych odpowiedzi - jest to: o wiele łatwiej jest dodawać, łączyć, usuwać, zmieniać kolejność itp.
Można to nawet zrobić interaktywnie, dynamicznie, choć nadvice potrzebuje niewielkiej pomocy, aby to ułatwić. Nie znam innych zastosowań nadvice w ten sposób (interaktywna kompozycja porad), ale istnieje co najmniej jedna taka aplikacja. Korzystam z niego w Isearch + , aby umożliwić dodawanie i usuwanie kombinacji dowolnych predykatów filtrów Isearch (filtrów) podczas wyszukiwania.
IOW, podobnie jak stopniowo zmieniasz wzorzec wyszukiwania, dzięki czemu możesz zawęzić wyszukiwanie w locie za pomocą wielu filtrów.
Filtrowanie Isearch odbywa się za pomocą zmiennej
isearch-filter-predicate
, która jest dostępna od dłuższego czasu. Jednak filtry Isearch nie są często definiowane. Są zazwyczaj statyczne i predefiniowane dla danego kontekstu (np. Wdired). Użytkownicy nie są w stanie ich zdefiniować i używać, przynajmniej interaktywnie.Jest tylko jedna zmienna,
isearch-filter-predicate
więc zmiana filtrowania naprawdę oznacza zmianę predykatu z pojedynczym filtrem, co sprowadza się do komponowania funkcji, łączenia predykatów, zawężania, rozszerzania lub innego modyfikowania wyszukiwania.Ale właśnie w tym nadvice jest dobra. Podsumowując, nadvice jest tak przydatny do łączenia funkcji, że może ułatwić interaktywne udoskonalanie filtrowania wyszukiwania. (Zobacz Dynamiczne filtrowanie wyszukiwania, aby uzyskać więcej informacji na ten temat.)
źródło