Emacs для настройки файла - PullRequest
       3

Emacs для настройки файла

5 голосов
/ 05 декабря 2010

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

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

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

Я хочу, чтобы when-let был отмечен как 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, потому что это относится только к одному файлу.

Ответы [ 2 ]

9 голосов
/ 05 декабря 2010

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

;;; 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 каждое рассматривается независимо.

1 C-ч i г (elisp) File Local Variables RET

3 голосов
/ 05 декабря 2010

Для идентификации макроса when-let вы можете использовать объявление indent:

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

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

...