Подтвердить что ты не робот

Предпочтительный метод переопределения функции emacs lisp?

Я перезаписал и автономно протестировал поведение внутренней функции, вызванной одной из функций Emacs, связанной с Emacs 24. Каков предпочтительный способ включения - например, в моем init.el - поведение моей функции переопределяет связанную функцию?

Я следил за различными потоками advice vs fset и т.д. и смущен.

4b9b3361

Ответ 1

@iainH Вы, как правило, быстрее получаете полезный ответ, описывая, какую цель вы пытаетесь выполнить, то, что у вас есть до сих пор. Я попросил код попробуйте помочь вам сделать то, что вы хотите сделать, не перезаписывая что-либо.

Я все еще не понимаю, почему вы не просто используете defun хотя? Я подозреваю что может произойти, вы используете defun в вашем файле инициализации, но оригинал функция еще не загружена (см. autoload). Через некоторое время вы что-то, чтобы файл с исходным определением был загружен, и ваш пользовательская функция перезаписывается оригиналом.

Если это проблема, у вас есть три варианта (скажем, вы хотите переписать telnet-initial-filter с "telnet.el" ):

  • Загрузите файл самостоятельно, прежде чем определять свою собственную версию.

    (require 'telnet)
    (defun telnet-initial-filter (proc string)
      ...)
    
  • Direct Emacs загружает вашу функцию только после загрузки файла с помощью eval-after-load.

    (eval-after-load "telnet"
      '(defun telnet-initial-filter (proc string)
         ...))
    
  • Используйте советы.

Из них лучше всего 2. 1 тоже хорошо, но вы должны загрузить файл, который вы можете никогда не использовать в сеансе. 3 - худшее. Все, что связано с defadvice следует оставить в качестве последнего варианта.

Ответ 2

Просто чтобы этот вопрос был самодостаточным, вот как это сделать с советами.

(defadvice telnet-initial-filter (around my-telnet-initial-filter-stuff act)
  "Things to do when running `telnet-initial-filter'."
  (message "Before")
  ad-do-it
  (message "After") )

Это, очевидно, полезно, прежде всего, если вы хотите обернуть, а не заменять существующую функцию (просто переопределите ее в этом случае).

Более подробно об использовании рекомендаций см. руководство.