初めての を書いて.dir-locals.el
いますが、 でエラーが発生しています*Messages*
。
コード:
(eval-after-load "grep"
'(add-to-list 'grep-find-ignored-directories "blur"))
痕跡:
.dir-locals error: Wrong type argument: listp, eval-after-load
私は何を間違っていますか?
初めての を書いて.dir-locals.el
いますが、 でエラーが発生しています*Messages*
。
コード:
(eval-after-load "grep"
'(add-to-list 'grep-find-ignored-directories "blur"))
痕跡:
.dir-locals error: Wrong type argument: listp, eval-after-load
私は何を間違っていますか?
の一般的な形式.dir-locals.el
は次のとおりです。
(emacs) Directory Variables
RETeval
コードを評価するには、次の場所で説明されているように、特別な疑似変数 name を使用する必要があります。
(emacs) Specifying File Variables
RET例えば:
((nil . ((indent-tabs-mode . t)
(eval . (eval-after-load "grep"
'(add-to-list 'grep-find-ignored-directories "blur")))
(fill-column . 80)))
(c-mode . ((c-file-style . "BSD")
(subdirs . nil))))
ただし、grep-find-ignored-directories
は自動バッファ ローカル変数ではなく、ここでは明示的にディレクトリ ローカル変数として設定していません (問題の「ローカル変数」は ですeval
)。したがって、grep-find-ignored-directories
このように設定すると、グローバルに設定されます。あなたが意図したものではありません1。
次のようなことを試してみてください:
((nil . ((eval . (eval-after-load "grep"
'(add-to-list
(make-local-variable 'grep-find-ignored-directories)
"blur"))))))
しかし、実際にはまだ間違っています。一度このディレクトリの下のファイルにアクセスすると、その時点でどのeval-after-load
バッファにいても、(グローバル設定である)grep
がロードされるとすぐにトリガーされるため、簡単にgrep を呼び出した不要なバッファに「ぼかし」値をローカルに追加しますが、以前にアクセスしたバッファに追加することもできません。
おそらく最も簡単な解決策は、変数を設定する前に grep を強制的に要求することです。
((nil . ((eval . (progn
(require 'grep)
(add-to-list
(make-local-variable 'grep-find-ignored-directories)
"blur"))))))
これにより、ディレクトリの下のすべてのファイルがローカル値を取得することが保証されます (他の場所のファイルは取得されません)。
さて、これは一般的な問題に対する 1 つのアプローチですが、この特定のケースを見てみましょC-hv grep-find-ignored-directories
う。この変数は、解決策をより簡単にするいくつかの機能を提供し、grep を不必要にロードする必要はありません。
.dir-locals.el ファイルは、次のようにローカル変数を設定できます。
((nil . ((my-ignore-blur-p . t))))
.emacs では、次のことができます。
(defun my-ignore-blur-p (dir)
"Return non-nil when the `my-ignore-blur-p' local variable is set."
(local-variable-if-set-p 'my-ignore-blur-p))
(eval-after-load "grep"
'(add-to-list 'grep-find-ignored-directories
(cons 'my-ignore-blur-p "blur")))
次に、このローカル変数が設定されている任意のバッファから実行するrgrep
と、グローバル変数で指定したカスタム関数はgrep-find-ignored-directories
非値を返し、nil
無視されるディレクトリのリストに「blur」が含まれます。
(nb 関数と変数の両方に同じ名前を使用しました。なぜなら、elisp は変数と関数に別々の名前空間を持っているからです。しかし、それは必須ではありません。明確にするために、コード内の関数を参照しています。関数コードおよび .dir-locals.el ファイル内eval-after-load
の変数)。
または、my-ignore-blur-p
関数の動作をdir
引数 (検索対象のディレクトリ) に基づいて、ローカル変数を完全に無視することもできます。これにより、rgrep コマンドを開始したバッファーとは完全に独立して、リストに "blur" を含めるか除外するかを決定できます。これはさらに望ましいことです。
1 "blur" をgrep-find-ignored-directories
グローバルに追加したい場合は、まったく使用しないでください。呼び出しを .emacs ファイルに.dir-locals.el
追加するだけです。eval-after-load
ファイルには特定の形式があり.dir-locals.el
ます。特定のモードを特定の変数に関連付ける必要があります。すべてのモードに変数を適用する場合は、 を使用しますnil
。以下の作品:
((nil
(eval-after-load "grep" '(add-to-list 'grep-find-ignored-directories "blur"))))
ただし、これはあなたが望むものではないかもしれません (おそらくそうではありません)。このディレクトリ内のファイルを編集する前にロードgrep
しても、何の効果もありません。