2010-12-04 2 views
5

Ich habe eine Emacs Lisp-Datei mit benutzerdefinierten Makros, die ich anders als Schriftart und eingerückt werden möchte. Der Code sieht so aus:Emacs pro Dateianpassung

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

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

I when-let als font-lock-keyword und zerklüftet wie oben fontified wollen. Ich weiß, dass ich das in meiner .emacs-Datei machen kann, aber ich würde es vorziehen, es zu einer lokalen Verzeichnis- oder lokalen Dateianpassung zu machen. Das Problem besteht darin, dass lokale und lokale Dateianpassungen im Verzeichnis anscheinend auf das Festlegen von Variablen beschränkt sind. In meiner .emacs-Datei habe ich Folgendes.

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

Ich möchte dies in .dir-locals.el, weil es nur in eine Datei gilt.

Antwort

9

Sie elisp zur Auswertung in Datei lokale Variablen durch Angabe eines eval: Wert angeben (die Dokumentation sagt: ‚Eval:‘ aber nur Kleinbuchstaben ‚eval:‘ scheint zu funktionieren). z.B .:

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

Als Sicherheitsmaßnahme wird Emacs bitten Sie um eine Bestätigung, wenn es einen Wert sieht es nicht bereits als sicher erkennen. Wenn Sie ihm mitteilen, dass er sich dauerhaft daran erinnern soll, schreibt er den Wert safe-local-variable-values in den Abschnitt (custom-set-variables) Ihrer Init-Datei.

Beachten Sie, dass das obige Beispiel zum Aktivieren eines untergeordneten Modus veraltet ist (die lokale Variable mode gilt nur für Hauptmodi), daher müssen wir sie als eine andere ausgewertete Form neu schreiben, in der wir die Nebenmodusfunktion aufrufen.

Wenn Sie mehrere Formulare auswerten müssen, können Sie entweder mehrere eval Werte, die um bewertet werden:

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

oder alternativ nur verwenden progn:

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

Der Unterschied ist, dass letzteres für die Zwecke von safe-local-variable-values als ein einzelner Wert betrachtet wird, während mit mehreren Werten jeweils ein Wert unabhängig betrachtet wird.

Chig(elisp) File Local VariablesRET

+1

Zur Klarstellung sollten die obigen Codeblocks an der Spitze der Datei (en) stehen, auf die sie angewendet werden soll. Dies funktioniert für jede Art von Datei, solange sie in der Sprache der Datei als Kommentar angezeigt wird (z. B. in einer C++ - Datei, die ;;; könnte durch // ersetzt werden). – jwernerny

+1

Ich erwarte, dass es überall hingehen kann, aber es ist typischer, einen lokalen Variablenblock wie diesen am * Ende * einer Datei zu platzieren.Datei-lokale Variablen am * top * einer Datei verwenden immer die andere Syntax (siehe 'C-h i g'' (emacs) Dateivariablen angeben ''RET'). – phils

3

Für identing Ihr Makro, wenn vermietet, können Sie die indent Erklärung verwenden:

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

Blick auf die Info Knoten (elisp)Indenting Macros für weitere Informationen dazu. Ich weiß nichts über ähnliche Dinge für die Typisierung.