2010-12-04 7 views
5

Tengo un archivo Emacs Lisp con macros personalizadas Quiero formatear y sangrar de forma diferente. El código es el siguiente:Personalización de Emacs por archivo

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

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

Quiero when-let fontified como font-lock-keyword y sangría que el anterior. Sé que puedo hacer esto en mi archivo .emacs, pero prefiero que sea un directorio local o una personalización local de archivos. El problema es que las personalizaciones locales y locales de directorios parecen estar limitadas a variables de configuración. En mi archivo .emacs tengo lo siguiente.

(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))))) 

Quiero esto en .dir-locals.el porque sólo se aplica a un archivo.

Respuesta

9

Puede especificar elisp para la evaluación en archivos variables locales especificando un valor eval: (la documentación dice 'Eval:' pero sólo minúscula 'eval:' parece funcionar). ej .:

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

Como medida de seguridad, Emacs le pedirá confirmación cada vez que ve un valor que aún no reconocen como seguros. Si le dice que lo recuerde permanentemente, escribe el valor en safe-local-variable-values en la sección (custom-set-variables) de su archivo init.

Tenga en cuenta que está en desuso el ejemplo anterior de permitir un modo menor (el mode variable local es para los modos mayores solamente), por lo que es necesario volver a escribir como otra forma evaluado, en la que llamamos a la función modo menor.

Si es necesario evaluar múltiples formas, puede especificar varios eval valores, que serán evaluados en orden:

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

O, alternativamente, sólo tiene que utilizar progn:

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

La diferencia es que este último se consideraría un valor único para los propósitos de safe-local-variable-values, mientras que con múltiples valores eval, cada uno se considera de forma independiente.

Chig(elisp) File Local VariablesRET

+1

Como aclaración, los bloques de código anteriores deben ir en la parte superior del archivo (s) al que desea que se aplique. Esto funcionará para cualquier tipo de archivo, siempre y cuando aparezca en el idioma del archivo como un comentario (por ejemplo, en un archivo C++, el ;;; podría reemplazarse por //). – jwernerny

+1

Espero que pueda ir a cualquier parte, pero es más típico colocar un bloque de variables locales como este en el mismo * final * de un archivo.Las variables locales de archivo en el * top * de un archivo utilizan invariablemente la otra sintaxis (consulte 'C-h i g'' (emacs) Especificación de variables de archivo' 'RET'). – phils

3

Para Cuadr'n su cuando-let macro, se puede utilizar la declaración guión:

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

vistazo a la información nodo (elisp)Indenting Macros para obtener más información al respecto. No sé sobre cosas similares para la creación de fuentes.

Cuestiones relacionadas