В Emacs, как я могу загрузить определенный файл, когда вызывается (require 'x)?

Мне нужен CEDET для eassist (eassist-list-methods очень удобен). В eassist.el есть линия

(require 'semantic)

который терпит неудачу, если CEDET не загружен. Дело в том, что мне не нужен CEDET постоянно, и он долго загружается, поэтому я хочу отложить его загрузку, пока не вызову eassist-list-methods.

Есть ли способ запустить

(load "cedet")

когда требуется semantic (или что-то другое, предоставляемое CEDET)?

Я ищу простое решение, которое не меняет eassist.el.


person Eisen    schedule 03.09.2009    source источник


Ответы (3)


Genehack, вероятно, прав; Я слишком буквально отвечаю на вопрос. Лучший способ справиться с чем-то подобным — выяснить, какие функции требуются для внешнего кода, и добавить для них autoload.

Но если autoload в вашем случае не сработает, обычный способ что-то сделать при загрузке файла - это сделать

(eval-after-load "semantic" '(load "cedet"))

Но я только что заметил, что вы говорите, что semantic.el не загружается, если сначала не был загружен CEDET. Как следует из названия, eval-after-load запускает код после загрузки указанного файла.

Вы можете попробовать найти другой файл для запуска загрузки вместо использования semantic.el. (Возможно, какой-то другой файл, который требуется semantic.el.)

При необходимости вы можете подключиться к require:

(defadvice require (before CEDET-require activate)
  (if (eq 'semantic (ad-get-arg 0))
      (load "cedet")))

Хотя (load "cedet"), вероятно, должно быть (require 'cedet), иначе вы будете перезагружать его каждый раз. (Я не уверен, есть ли у CEDET (provide 'cedet), поэтому в моем примере я этого не делал.)

Обратите внимание, что добавление совета в require ничего не даст, если семантика уже загружена, поэтому вам может потребоваться сначала проверить (featurep 'semantic) и при необходимости сразу же загрузить cedet.el.

person cjm    schedule 03.09.2009
comment
Подключение к require работает. Мне пришлось удалить апостроф перед CEDET-require. Проблема в том, что хотя eassist-list-methods загружается, ему нечего отображать. Мне нужно восстановить буфер, чтобы заработал весь семантический синтаксический анализ. Однако на самом деле это не было идеей. Слишком сложно. Думаю, я просто буду загружать CEDET при запуске Emacs. Во всяком случае, это случается не так уж часто. Что ж, теперь я знаю больше о дефадвисе ;). - person Eisen; 04.09.2009

Предполагая, что у вас есть все материалы CEDET в вашем load-path, что-то вроде:

(autoload 'eassist-list-methods "cedet" nil t)

в вашем .emacs.d/init.el (или другом файле инициализации) должно помочь.

person genehack    schedule 03.09.2009
comment
Обычно вы не используете расширение .el с autoload или load, поэтому я взял на себя смелость удалить его. - person cjm; 03.09.2009
comment
Ах да, спасибо -- глупая копипаста из "загрузить cedet.el" в вопросе... 8^) - person genehack; 03.09.2009
comment
Не вызовет ли это проблем, если eassist-list-methods не будет определено в cedet.el? - person seth; 03.09.2009
comment
Я уже пробовал это. Проблема в том, что у меня также есть (autoload 'eassist-list-methods eassist nil t) в моем .emacs, и он не работает с двумя автозагрузками для одной и той же функции. - person Eisen; 03.09.2009
comment
сет, для меня eassist это отдельная библиотека. Я прочитал на EmacsWiki, что теперь это часть CEDET. Однако я давно не обновлял CEDET из-за других зависимостей. - person Eisen; 03.09.2009
comment
Я не думаю, что это требование, чтобы eassist-list-methods определялось в 'cedet.el', но если загрузка 'cedet.el' не загружает также файл, определяющий эту функцию, да, это не сработает. . Я не использую CEDET; Я предполагал, что, поскольку eassist поставляется с CEDET, загрузка всего этого поможет. - person genehack; 03.09.2009
comment
Хорошо, @Eisen, как насчет того, чтобы вместо этого вы создали файл - назовите его «load-eassist-and-cedet.el» - поместите туда (load "cedet.el") и (load eassist.el), тогда автозагрузка будет (autolad 'eassist-list-methods "load-eassist-and-cedet" nil t). Да, это невероятно некрасиво. - person genehack; 03.09.2009

Я могу вас неправильно понять, но если нет, то ответ autoload: вы хотите загрузить eassist.el только при вызове одной из его команд. Когда он загрузится, он загрузит semantic или CEDET или что-то еще, что ему нужно - это не ваша проблема (об этом должен позаботиться дизайн библиотеки eassist.el).

(autoload 'eassist-list-methods "eassist" nil t)
person Drew    schedule 04.09.2011