Emacsの問題をトラブルシューティングするにはどうすればよいですか?


21

Emacsが期待どおりに動作しない状況で、問題をトラブルシューティングするにはどうすればよいですか?自分で問題を見つけて修正するには、どのような手順を踏むことができますか?

または、失敗した場合、ここ(またはメーリングリストや他のフォーラム)の人々が問題を解決するために役立つ情報を収集するにはどうすればよいですか?

私のEmacsには、多くのパッケージ、インターネット全体からコピー&ペースト(または削除&ヤンク)されたスニペットのコレクション、および私自身のカスタムelispが含まれています。これらすべての合併症を理解する方法はありますか?


これがこれに最適な場所であるかどうかはわかりませんが、最初のステップとして回答/コメントを要求する多くの質問がありますemacs -Q。これは、これらの質問を新しいユーザーの一般的なヘルプとしてリンクするものとして書きました。
タイラー

うん、これは最高の場所です。実際、そのような質問は(ほぼ)2年前に提案されました:meta.emacs.stackexchange.com/q/198/184ありがとう!
T. Verron

回答:


28

ステップ1:実行中 emacs -Q

最初に行う必要があるのは、カスタマイズなしでemacsを実行することです。バニラEmacsで問題を再現できる場合、それは実際にはEmacs自体のバグかもしれません。それはまれですが、最初のステップとしてそれを除外します。

Emacsを-Qフラグ付きでコマンドラインから起動すると、つまり、emacs -Qローカルのカスタマイズが読み込まれずに、裸または「バニラ」のemacsが表示されます。それでも問題は発生しますか?その場合は、「バグレシピの提供」に進んでください。

ステップ1b:問題がパッケージにある場合はどうなりますか?

問題が特定のパッケージに固有の場合、そのパッケージをロードせずに再現できないことは明らかです。ただし、すべての構成ではなく、関係するパッケージのみをロードする必要があります。それを行うには、emacs -Q再度実行し、次のような短いスクリプトを準備します。

(require 'package)
(setq package-load-list
      '((package1 t)))
(package-initialize)

package1ロードするパッケージの名前に置き換えます。複数のパッケージをロードする必要がある場合は、それに応じてスクリプトを変更します。

(require 'package)
(setq package-load-list
      '((package1 t)
        (package2 t)
        (package3 t)))
(package-initialize)

このコードを読み込むには、*scratch*バッファに貼り付けてを呼び出しますM-x eval-buffer。(または、他のコードが含まれていない限り、任意のバッファー!)。

この時点で、パッケージをロードし、テストしているパッケージのみをロードしました。今すぐ問題を再現できる場合は、「バグレシピの提供」に進んでください。

ステップ2:バグを見つける .emacs

これで、問題が構成内の何かから発生していることを確認できました(「電話は家の中から来ています!」)。構成は数千行に及ぶ場合があり、多くの異なるファイルをロードする場合があります。問題を見つけるには、バイナリ検索を行い、一度にコードの半分をコメントアウトして、対象を絞り込みます。1

  1. オプションemacsなしで、通常のemacsを開きます-Q
  2. 構成ファイルを開きます(通常、~/.emacsまたは.emacs.d/init.el、見つからない場合は試してくださいC-h v user-init-file
  3. ファイルの前半を選択:C-spaceマークを設定するには、半分下にスクロールして領域を拡張します
  4. 選択した領域M-;コメントアウトし、ファイル保存します
  5. 新しい emacsテストemacs)を開き、最初のemacsを実行したままにします。テストemacsは、構成の縮小バージョンを読み取ります。
  6. テストemacsで問題を再現してみてください
  7. 再現できない場合は、テストemacsを閉じ、元のemacs undoでコメントをC-/に追加し、残りのコードの半分をコメントアウトします。新しいテストemacsを開き、再試行してください。
  8. 問題を再現できる場合は、残りのコードの半分をコメント化して、問題が解決するかどうかを確認してください。
  9. 問題を再現するために必要な構成の最小ビットが見つかるまで、このプロセスを繰り返します。

特定のパッケージに問題がある場合は、もちろん、そのパッケージをロードするコードのコメントを外しておく必要があります。

構成ファイルが他のファイルをロードする場合、それらのファイルにも検索を拡張することになります。

この時点で、問題は1行または2行のコードによるものであることがわかりました。自分で修正することもできます。もしそうなら、おめでとう、あなたは何かを学んだ!それ以外の場合は、手順3に進みます。

ステップ3:バグレシピを提供する

この時点で、ここに投稿する詳細なバグレシピを提供できるはずです。以下を含める必要があります。

  • Emacsのバージョン(これはEmacsから入手できます。 M-x emacs-version
  • オペレーティングシステム(Windows#、Mac、Linuxディストリビューション)
  • 苦労しているパッケージのバージョン(該当する場合)
  • 問題を実証するために必要な具体的な手順。これは、何が起こる予想されるか実際にが起こるかなどが含まれます。

たとえば、次のような質問を投稿できます。

スーパーモードに問題があります。を使用するM-x sm-compile-codeと、PayPalアカウントからの引き出しが行われます。

再現する手順:

スーパーモードをロード:

(require 'package)
(setq package-load-list
      '((super-mode t)))
(package-initialize)
  • 新しいファイルを開く C-x C-f my-code
  • コード行を入力してください:
10 goto 10
  • コール M-x sm-compile-code

これによりスーパーコンパイラが呼び出され、プログラムがコンパイルされると予想されます。代わりに、ミニバッファーに「PayPalからスーパーモードの作成者に$ 100が転送されました」というメッセージが表示されます

GNU Emacs 25.1.50.3
Debian Linux
スーパーモードバージョン3.1415


1 バグハンターのパッケージには、これであなたを助けるかもしれない(半)自動的に初期化ファイルを二等分します。


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