2010-12-04 16 views
5

私は、カスタムマクロを持つEmacs Lispファイルを持っています。私はwhen-letfont-lock-keywordとしてフォント表示化し、上記のように字下げたいファイル単位のカスタマイズのためのEmacs

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

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

:コードは次のようになります。私は私の.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これは1つのファイルにのみ適用されるため、これを使用します。

答えて

9

あなたはeval:値を指定することにより、ファイルローカル変数にの評価のためのelispを指定することができます(ドキュメントには、「エバール:」言うだけ小文字の「のeval」動作しているようです)。それはすでにとして安全を認識しない値を見ている時はいつでも例えば:セキュリティ対策として

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

、Emacsは確認をお願いします。永久に覚えておくように指示すると、initファイルの(custom-set-variables)セクションに値がsafe-local-variable-valuesに書き込まれます。

上記のマイナーモードを有効にする例は推奨されていません(modeローカル変数はメジャーモードのみ)ので、マイナーモード関数と呼ばれる評価済みの別のフォームとして書き直す必要があります。ただprognの使用、

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

または代わりに::

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

違いをあなたが複数のフォームを評価する必要がある場合は

は、あなたが順番に評価されます複数のevalの値を、指定しますか後者はsafe-local-variable-valuesの目的のために単一の値とみなされるが、複数のevalの値はそれぞれが独立していると考えられるのに対し、

Chのグラム(elisp) File Local VariablesRETマクロせたとき、あなたはインデント宣言使用することができ、あなたのidentingについては

+1

説明の一部として、上記のコードブロックは、適用したいファイルの先頭に移動する必要があります。これは、ファイルの言語でコメントとして表示される限り(たとえば、C++ファイルでは、;;;は//に置き換えることができます)、任意のタイプのファイルに対して機能します。 – jwernerny

+1

私はそれがどこにでも行くことができると期待していますが、ファイルのまさに*最後にこのようなローカル変数ブロックを配置するのがより一般的です。ファイルの* top *のファイルローカル変数は、常に他の構文を使用します( 'C-h i g''(emacs)ファイル変数の指定 '' RET'を参照してください)。 – phils

3

:情報の

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

を見てこの詳細については、ノード(elisp)Indenting Macrosを参照してください。 私は同様のことをフォントのために知りません。

関連する問題