advice는 실행 중인 에디터를 확장할 때 제일 좋은 기능이면서, 남의 init 파일에서는 제일 못 믿는 기능이에요. (제 것도 포함해서요.)
advice-add에 :around를 주면 정의는 건드리지 않고 함수를 감쌀 수 있고, advice-remove로 다시 벗겨 낼 수 있어요. 에디터를 끄지 않고 *scratch*에서 전부 할 수 있다는 게 매력의 전부예요. 문제는 advice가 모든 호출자에게 적용된다는 거예요. 그런 걸 원한 적 없는 패키지까지요. 다행히 describe-function은 도움말 버퍼에 걸려 있는 advice를 보여 주니까, 뭔가 이상하게 굴면 그 함수에 C-h f부터 해 봐요.
사람들이 잊는 또 하나의 도구는 동적 스코프예요. defvar로 정의한 변수는 특수 변수라서, 호출을 let으로 감싸면 그 호출이 닿는 모든 곳에서 끝까지 다시 바인딩되고, let을 빠져나오면 원래 값이 돌아와요. lexical-binding을 켜도 일반 지역 변수만 렉시컬이 되고 특수 변수는 여전히 동적이에요. 신경 쓰는 호출 하나만 case-fold-search로 감싸 바인딩하는 편이 뭔가를 advice하는 것보다 깔끔할 때가 많아요.
대충의 순서는 이래요. 패키지가 훅을 주면 훅, 동작을 정하는 변수가 있으면 동적 let, advice는 마지막이에요.