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 в последнюю очередь.