Emacs / Emacs Lisp: могу ли я вставить совет перед интерактивной формой? или как разумно предварительно установить команду компиляции?

Что я ' d like to do - разумно предварительно установить значение по умолчанию в локальном буфере для строкового аргумента функции compile .

Прямо сейчас compile.el по умолчанию использует "make" в качестве команды. Я могу установить это, установив команду компиляции . Я даже могу сделать эту переменную буфером локальной. Это работает, если мне всегда нужно одно и то же статическое значение.

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

Я надеялся сделать это с помощью before-advice. Но это работает не так, как я ожидал.

Читая файл advice.el, Я вижу

Предположим, что функция / макрос / subr / special-form имеет N частей перед советом, M частей вокруг совета и K частей после совета. Предполагая, что ни один из советов не защищен, его рекомендуемое определение будет выглядеть следующим образом (индексы формы тела соответствуют положению соответствующего совета в этом классе рекомендаций):

([macro] lambda <arglist>
   [ [<advised-docstring>] [(interactive ...)] ]
   (let (ad-return-value)
 {<before-0-body-form>}*
       ....
 {<before-N-1-body-form>}*
 {<around-0-body-form>}*
    {<around-1-body-form>}*
      ....
       {<around-M-1-body-form>}*
      (setq ad-return-value
        <apply original definition to <arglist>>)
       {<other-around-M-1-body-form>}*
      ....
    {<other-around-1-body-form>}*
 {<other-around-0-body-form>}*
 {<after-0-body-form>}*
       ....
 {<after-K-1-body-form>}*
 ad-return-value))

Это говорит мне, что когда рекомендуемая функция является интерактивной , call-interactively вызывает интерактивную форму перед вызовом before advice или любого совета.

И когда я добавляю совет к compile , наблюдаемое мной поведение подтверждает это. Совет вызывается после обработки интерактивной формы. Интерактивная форма предлагает строку для компиляции, до мой совет дает возможность угадать, какой она должна быть, и предварительно установить ее.

Итак ...

  • как я могу заставить мой код работать до интерактивной формы? может совет сделать это? Если не совет, то что-нибудь еще? или
  • как я могу динамически предварительно установить compile-command для любого буфера?

Идеи приветствуются.

6
задан Drew 9 January 2014 в 06:32
поделиться