Emacsに再起動せずに私のinitファイルのエラーを見つける方法は?


7

私の初期化ファイルの1つにエラーがあると、Emacsを起動すると次のような漠然としたメッセージが表示されます。

Warning (initialization): An error occurred while loading /Users/im/.emacs.d/init.elc:
(wrong-type-argument listp helm-find-files-actions)

多くの構成ファイルのどれにエラーが含まれているか、どの行にあるかはわかりません。ファイルを検索しても役に立たない、というのは、関数helm-find-files-actionsが実際にはどのinitファイルにも含まれていないためです。問題のあるコード行を追跡するために、私はしなければなりません$ emacs --debug-init

Emacsに問題のある行がどこにあるかを自動的に知らせる方法はありません$ emacs --debug-initか?ファイルを手動で2分割+評価できることはわかっていますが、さらに遅くなります。私のinitファイルの1つにエラーがある場合、Emacsが次のことができると、はるかに良いでしょう。

  1. どのinitファイルを教えてください
  2. エラーを含む行番号を教えてください
  3. 理想的には、その初期化ファイルを開いて、問題のある行に連れて行ってください

これはEmacsで可能ですか、それともファンタジーの世界に住んでいますか?


4
(setq debug-on-error t)評価してinit.el再評価せずに(再起動せずに)デバッグを有効にして、もう一度評価しますM-x eval-buffer。たとえば、開いてと入力します。
弁護士、2015

2
これはLisp実装で繰り返し発生する問題のようですが、ソースの場所のサポートを追加することを担当していたラケットは注目に値します。私はバックハックで行番号を表示するために小さなハックをやめまし
wasamasa 2015

1
おそらく別の質問かもしれませんが、debug-initinitファイルが変更されるたびに次の起動を自動的に有効にする方法があるかどうか疑問に思います...
glucas

2
@glucasその場合、私のemacsは常に--debug-init:)で始まります
Kaushal Modi

--debug-initデフォルトで常にEmacsを起動しない理由はありますか?
白熱

回答:


3

ファイルを手動で2分割+評価できることはわかっていますが、さらに遅くなります。

違う!したがって、質問のタイトルの「再起動せずに」の部分は無視します。

これは一般的で古典的であり、解決策であるバイナリサーチもそうです。オンにdebug-on-errorしてオプションを使用--debug-initしても問題が解決しない場合は、次のようにします。

問題の原因となっているごく一部を見つけるために、再帰的にinitファイルを二分割します。

それで全部です。バイナリ検索は非常に迅速、強力、かつ簡単です。人々は、問題をより迅速に自分のやり方で考えることができると考えて、あまりにも頻繁にそれを避けます。

initファイルを再帰的に二分割するには:

  1. その半分をコメントアウトします。を使用M-x comment-regionして、選択したテキストの領域をコメント化できます。(C-u同じコマンドでリージョンのコメントを解除できます(便宜上、comment-regionキーにバインドできます)。

  2. Emacsを起動します。同じ問題が発生しましたか?「はい」の場合、コメントアウトした部分が原因ではありません。いいえの場合は、そうです。

  3. 問題のある部分:他の部分と問題のある部分の半分をコメント化します。

#2と#3を繰り返します。時間がかかりません:1 / 2、3 / 4、7 / 8、15 / 16、31 / 32、63 / 64、127 / 128、255 / 256、511 / 512、1023 / 1024、...

initファイルの大きさや、ロードする他のコードの量は関係ありません(問題が他のコードにある場合は、そのファイルに対して同じプロセスを繰り返すなど)。

実際、検索しようとしているコードの山が大きければ大きいほど、より多くのバイナリ検索が役立ちます。


丁度。たとえば、100の検索には1分かかります。バイナリ検索では、100,000行はせいぜい1分程度で済みます。(
ギブオアテイク

2

簡単な答え:init.elファイルを開いてM-x eval-buffer。私はこれをいつもやっていて、initファイルをデバッグします


上記の@lawistのコメントを見ただけです。これを行う前にデバッグを有効にすることは良い考えです
bpaul

1

initファイルをバッファにロードし、Cx Ceを使用して各s式を評価し、どれが爆発したかを把握することができます。

私はそれが理想的ではないことを知っていますが、あなたが再起動に夢中になっているなら、私がやろうとしていることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.