control-gが非常に大きなファイルで機能しないときにemacsを中断する方法は?


16

Emacsで非常に大きな(たとえば128MB)ファイルを表示し、ファイルの最後にジャンプすると、何らかのO(n ^ 2)またはより悪い動作に遭遇しました。テキストをコンテキストに合わせて色付けするのは、色付けアルゴリズムに関係していると思われます。control-g(keyboard-quit)と入力しても、操作は影響を受けません。emacsセッションを強制終了せずに回復する方法が必要です。SIGINTを送信しようとしましたが、emacsが終了しました。送信できる信号、または実行中のアクションを強制的に放棄して制御を返す他の方法(デバッガーなど)がありますか?


フォントロックを中断可能にする方法はわかりませんが、このEmacs Wikiページでフォントロックの高速化に役立つものを見つけるかもしれません。
アーロンミラー

5
エスケープを3回押してみましたか?
yPhil

はい、あなた自身のフォントロックコードはおそらくここに欠陥があると思います。あなたの調べfont-lock-keywords、問題を見つけることを試みるために慎重に正規表現を。
ドリュー

1
EMACS:8メガバイトと絶えずスワップ:
user829755

2
エスケープを3回押しても何も起こりません。
WilliamKF

回答:


8

フォントロックモードだとは思わない。それはおそらく、目に見えるものの近くのセクションだけを行います。メモリ内のデータをコピーしている可能性があります。

sigusr1

sigusr2

これらのイベントは、EmacsプロセスがシグナルSIGUSR1とを受信したときに生成されSIGUSR2ます。信号には追加情報が含まれないため、追加データは含まれません。デバッグに役立ちます(エラーデバッグを参照)。

ソース:GNU Emacs Lispリファレンスマニュアル:その他のイベント

私はそれが何をするのか(またはあなたが実行しているemacsのバージョン)知りませんが、おそらく非破壊的なシグナル(USR1またはUSR2)を試すことができます。

$ kill -USR1 pid

または、スリープ状態にして、回復するかどうかを確認できます。


あなたのマシンはどれほど忙しいのでしょうか(CPUとディスク)。それはそれが何をしているかについてあなたに少しを伝えるかもしれません。..そして、あなたはemacsの別のコピーを実行し、その新しいコピーを「kill -USR1 pid」して、気にする前に何が起こるかを見ることができるかもしれません。
9mjb

2
うわー、emacs-mackill -USR2への送信は同様の状況で私にとってはうまくいきました-js2-modeで大きなファイルをロードし、isearchを開始しました。USR2はisearchを終了し、デバッガーに入りました。プロセスを強制終了するよりもはるかに優れています!
ウィリアム

私はあなたの疑いに同意しません。殺害は私のために働いた。それはデバッガーに私を蹴り、font-lock-default-fontify-regionはそれが立ち往生した場所でした。
ブライアンC.

2

私はemacsが行うシグナル処理を知りませんがserver-start、実行中のemacsのインスタンスでRPCを実行できるように〜/ .emacsファイルを置くことでEmacsサーバーを使用できます。

それからemacsを殺して書きたいときは、シェルから呼び出すことができますemacsclient -e '(save-buffers-kill-emacs t)'

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