Переопределить одну функцию в библиотеке Emacs
Я использую режим Emacs, чтобы комментировать некоторые из моих файлов (реальный режим не важен). Он поставляется в виде библиотеки и поставляется с скомпилированным кодом LISP (конечно). Я хочу изменить его поведение, переопределив в нем одну функцию. Просто для моей локальной сессии Emacs. Сейчас я просто скопировал и вставил функцию из исходного файла библиотеки, немного изменил ее, а затем нажал eval-last-sexp
, Все идет нормально. Тем не менее, я получаю противоречивые результаты: я не уверен, как Emacs обрабатывает функции, поступающие из .elc
файлы, смешанные с функциями из источника. Иногда я вижу свою версию работающей функции, иногда оригинальную версию. Очень запутанно (и раздражает).
Любые идеи, как я могу последовательно заменить функцию lisp в библиотеке Emacs без изменения исходных файлов библиотеки, которые доступны только для чтения?
2 ответа
Нечто подобное должно сработать:
(advice-add 'name-of-func-to-override :override
(lambda () (message "does this instead now")))
замещать name-of-func-to-override
с именем функции и lambda
с вашей версией.
Я предлагаю посмотреть на add-function
(а также advice-add
) документы как :override
может на самом деле не то, что вы хотите.
Наиболее вероятным объяснением вашей проблемы является то, что вы иногда (копировать и) eval-last-sexp
до загрузки другой библиотеки: побеждает последняя!
С помощью advice-add
как предложено @Jack, является хорошим решением, потому что это переопределение может быть применено до того, как функция будет определена, и оно выдержит нормальное определение функции.
Тем не менее, во многих случаях вам не нужно переопределять какие-либо функции. Может быть, все, что вам нужно, это определить вашу собственную функцию с вашим собственным именем, а затем изменить раскладку клавиш так, чтобы она выполняла вашу функцию вместо той, которая была из библиотеки.