Moja konfiguracja jest pełna porad i wciąż słyszę o nowym błyszczącym minimalistycznym nadvice.el
pakiecie.
Przeszukałem podręczniki i przeczytałem źródło , ale otwarcie przyznaję: wciąż nie mam pojęcia, jak go właściwie używać.
Czy ktoś tutaj może wskazać mi przewodnik lub powiedzieć, jak zacząć przekazywać porady w starym stylu?
advice
emacs-internals
elisp
PythonNut
źródło
źródło
M-x report-emacs-bug
. Niektórzy programiści czasami wolą programować niż dokumentować. ;-) Ważne jest, aby sam Emacs dokumentował.nadvice
z mojego config: : po , : filtr zwrotny , : ok , : przed-ażOdpowiedzi:
Wszystkie potrzebne informacje są zawarte w tym,
C-h f add-function
który opisuje podstawowy mechanizmadvice-add
.Nowy system porad działa w zasadzie jak zastąpienie bieżącej definicji funkcji funkcją opisaną w tabeli, w
C-h f add-function
zależności od wyboruWHERE
argumentu, czystsze tylko w celu śledzenia, jakie zachowanie zostało zdefiniowane w danym pliku źródłowym.Przykład z
:around
opcjąNajbardziej ogólnym przypadkiem jest
:around
opcja, więc podaję na to przykład. (Prawdopodobnie lepiej jest użyć dedykowanychWHERE
parametrów, jeśli to możliwe, ale można zastąpić się równoważnymi:around
funkcjami).Na przykład, powiedzmy, że chcesz debugować użycie
find-file
iprint
listę argumentów za każdym razem, gdy jest wywoływana. Mógłbyś pisaćDzięki tej nowej implementacji wszystko, czego potrzebuje rada, jest przekazywane jako argument.
ad-get-args
staje się niepotrzebny, ponieważ argumenty są przekazywane do funkcji porady jako zwykłe argumenty funkcji (dlaWHERE
argumentów, dla których ma to sens).ad-do-it
staje się niepotrzebny, ponieważ:around
rada otrzymuje jako argumenty funkcję i argumenty, dlatego(ad-do-it)
zostaje zastąpiona przez formęlub gdy podasz argumenty
co jest czystsze, ponieważ nie ma w tym żadnych magicznych form. Modyfikacja argumentów następuje po prostu przez przekazanie zmodyfikowanych wartości do
OLD-FUNCTION
.Inne
WHERE
wartościDokument
add-function
zawiera tabelę wszystkich miejsc na porady (lub „kombinatorów”) oraz ich odpowiedników i wyjaśnia funkcjonalność w kategoriachlambda
zachowania równoważnego z zalecaną funkcją:gdzie FUNKCJA jest funkcją porady, a OLDFUN funkcja, do której dodawana jest opinia. Nie próbuj zrozumieć ich wszystkich naraz, po prostu wybierz
WHERE
symbol, który brzmi dobrze i spróbuj go zrozumieć.Lub po prostu użyj
:around
. O ile mogę powiedzieć jedyną zaletą korzystania specjalizujeWHERE
s nad:around
wszystkiego jest to, że można uzyskać nieco więcej informacji z patrzącC-h f ADVISED-FUNCTION
przed przeczytaniu docstring o poradę. O ile nie planujesz opublikować kodu zawierającego porady, prawdopodobnie nie ma to znaczenia.Nazwane funkcje porad
Polecam używanie nazwanych funkcji jako porad, ponieważ zapewnia ono wiele korzyści (niektóre z nich dotyczą także używania nazwanych funkcji do przechwytywania):
Pojawia się
C-h f find-file
jakolink do definicji funkcji porady, która jak zwykle zawiera link do pliku, w którym została zdefiniowana. Gdyby rada została zdefiniowana jako
lambda
forma bezpośrednio wadvice-add
formie, dokumentacja byłaby pokazana w linii (bałagan dla długich dokumentów?) I nic nie wskazywałoby, gdzie została zdefiniowana.Możesz usunąć poradę za pomocą
Możesz zaktualizować definicję porady bez ponownego uruchamiania
advice-add
lub ryzykowania, że stara wersja pozostanie aktywna (ponieważ uruchomienieadvice-add
ze zmienioną wersjąlambda
zostanie rozpoznane jako nowa porada, a nie jako aktualizacja starej).Side uwaga
#'function
notacja jest w zasadzie równoznaczne'function
z tym, że to pomoże kompilator bajt identyfikacji symboli jako nazw funkcji i tym samym zidentyfikować brakujące funkcje (na przykład z powodu literówek).źródło
(advice-add 'find-file :around #'my-find-file-advice-print-arguments)
i podobnie(advice-remove 'find-file #'my-find-file-advice-print-arguments)
.advice-add
to sprawa graniczna. Osobiście uważam to' ↔ #'
rozróżnienie za głównie pomoc w identyfikacji literówek w nazwach funkcji, więc tutaj prawdopodobnie będzie to zależeć od tego, czy ktoś spodziewa się zdefiniowania funkcji do czasu dodania porady.add-function
). Chciałbym, żeby doktorzy to wyjaśnili. Może będę chciał to zrobić.C-h f find-file
, prawdaC-x
?