4

初めての を書いて.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

私は何を間違っていますか?

4

2 に答える 2

8

の一般的な形式.dir-locals.elは次のとおりです。

evalコードを評価するには、次の場所で説明されているように、特別な疑似変数 name を使用する必要があります。

例えば:

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

于 2013-04-27T01:06:50.117 に答える
-1

ファイルには特定の形式があり.dir-locals.elます。特定のモードを特定の変数に関連付ける必要があります。すべてのモードに変数を適用する場合は、 を使用しますnil。以下の作品:

((nil
  (eval-after-load "grep" '(add-to-list 'grep-find-ignored-directories "blur"))))

ただし、これはあなたが望むものではないかもしれません (おそらくそうではありません)。このディレクトリ内のファイルを編集する前にロードgrepしても、何の効果もありません。

于 2013-04-26T14:02:56.577 に答える