2010-12-04 2 views
5

У меня есть файл Emacs Lisp с настраиваемыми макросами. Я хочу, чтобы шрифт и отступы отличались по-разному. Код выглядит следующим образом:Emacs Per File Customization

(defmacro* when-let ((var value) &rest body) 
    `(let ((,var ,value)) 
    (when ,var ,@body))) 

(defun func() 
    (when-let (a 1) 
    a)) 

Я хочу when-let fontified как font-lock-keyword и с отступом, как указано выше. Я знаю, что могу сделать это в моем файле .emacs, но я бы предпочел сделать его локальным или локальным. Проблема заключается в том, что локальные настройки локальных и локальных файлов, по-видимому, ограничены установкой переменных. В моем файле .emacs у меня есть следующее.

(add-hook 'emacs-lisp-mode-hook 
    (lambda() 
      (put 'when-let 'lisp-indent-function 1) 
      (font-lock-add-keywords nil 
            '(("(\\(when-let\\)\\>" 1 
             font-lock-keyword-face))))) 

Я хочу это в .dir-locals.el, потому что это относится только к одному файлу.

ответ

9

Вы можете указать Elisp для оценки в файлов локальных переменных, указав eval: значение (документация говорит «Eval:», но только в нижнем регистре «Eval:» кажется, работает). например .:

;;; Local Variables: 
;;; mode: outline-minor 
;;; eval: (hide-body) 
;;; End: 

В качестве меры безопасности, Emacs запросит у вас подтверждение, когда он видит значение, которое он уже не признают как безопасные. Если вы сообщите ему, чтобы он помнил его постоянно, он записывает значение в safe-local-variable-values в разделе (custom-set-variables) вашего файла инициализации.

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

Если вам необходимо оценить несколько форм, вы можете либо указать несколько eval значений, которые будут оценены в следующем порядке:

;;; Local Variables: 
;;; eval: (outline-minor-mode 1) 
;;; eval: (hide-body) 
;;; End: 

Или как вариант, просто использовать progn:

;;; Local Variables: 
;;; eval: (progn (outline-minor-mode 1) (hide-body)) 
;;; End: 

Разность заключается в том, что последний будет считаться единственным значением для целей safe-local-variable-values, тогда как с несколькими значениями eval каждый из них рассматривается независимо.

Chяг(elisp) File Local VariablesRET

+1

Как часть пояснения, приведенные выше блоки кода должны находиться в верхней части файла (ов), к которому вы хотите применить. Это будет работать для файлов любого типа, если оно отображается на языке файла как комментарий (например, в файле C++; ;;; может быть заменен на //). – jwernerny

+1

Я ожидаю, что он может идти в любом месте, но более типично размещать локальные блоки переменных, подобные этому, в самом * конце * файла.Локальные переменные файла в * верхнем * файла неизменно используют другой синтаксис (см. 'C-h i g'' (emacs). Указание переменных файла' 'RET'. – phils

3

Для identing ваш когда-пусть макрос, вы можете использовать отступы заявление:

(defmacro* when-let ((var value) &rest body) 
    (declare (indent 1)) 
    `(let ((,var ,value)) 
    (when ,var ,@body))) 

посмотреть на информацию узел (elisp)Indenting Macros для получения дополнительной информации. Я не знаю о подобных вещах для разметки.