Bagaimana cara menginterupsi emacs ketika control-g tidak bekerja di file yang sangat besar?

16

Saya mengalami beberapa jenis O (n ^ 2) atau perilaku yang lebih buruk ketika melihat file yang sangat besar (mis. 128MB) di Emacs dan melompat ke akhir file. Saya pikir itu mungkin ada hubungannya dengan algoritma pewarnaan saya untuk mewarnai teks secara kontekstual. Jika saya mengetik control-g (keyboard-stops), operasi tidak terpengaruh. Saya ingin beberapa cara untuk memulihkan sesi emacs saya tanpa hanya membunuhnya. Saya mencoba mengirim SIGINT, tetapi emacs baru saja keluar. Apakah ada sinyal yang bisa saya kirim, atau cara lain (mungkin dalam debugger) untuk memaksa tindakan apa pun yang berjalan untuk menyerah dan mengembalikan kontrol kepada saya?

WilliamKF
sumber
Saya tidak tahu cara membuat penguncian font dapat terputus, tetapi Anda mungkin menemukan sesuatu yang digunakan di halaman Wiki Emacs ini untuk mempercepat penguncian font .
Aaron Miller
5
Apakah Anda mencoba memukul 3 kali?
yPhil
Ya, saya pikir kode kunci-font Anda sendiri mungkin salah di sini. Periksa font-lock-keywordsregexps Anda dengan cermat untuk mencoba menemukan masalahnya.
Drew
1
EMACS: Delapan Megabita dan Terus
Bertukar
2
Memukul tiga kali tidak membantu saya.
WilliamKF

Jawaban:

8

Saya ragu itu mode penguncian font. Itu mungkin hanya bagian dekat apa yang terlihat. Mungkin menyalin data dalam memori.

sigusr1

sigusr2

Peristiwa ini dihasilkan ketika proses Emacs menerima sinyal SIGUSR1dan SIGUSR2. Mereka tidak mengandung data tambahan karena sinyal tidak membawa informasi tambahan. Mereka dapat berguna untuk debugging (lihat Kesalahan Debugging ).

Sumber: GNU Emacs Lisp Reference Manual: Acara Lain-Lain

Saya tidak tahu apa yang harus dilakukan (atau versi emacs yang Anda jalankan) tetapi Anda bisa mencoba sinyal yang tidak merusak MUNGKIN (USR1 atau USR2).

$ kill -USR1 pid

Atau Anda bisa tidur dan melihat apakah itu pulih.

9mjb
sumber
Saya bertanya-tanya seberapa sibuk (CPU dan disk) mesin Anda. Itu mungkin memberi tahu Anda sedikit tentang apa yang dilakukannya. .. dan Anda mungkin dapat menjalankan salinan emacs lainnya dan "kill -USR1 pid" yang baru untuk melihat apa yang terjadi sebelum Anda melakukan yang Anda pedulikan.
9mjb
2
Wow, mengirim kill -USR2ke emacs-mac bekerja untuk saya dalam situasi yang sama - memuat file besar dalam mode js2 dan memulai pencarian. USR2 berhenti dari isearch dan masuk ke debugger. Jauh lebih baik daripada membunuh prosesnya!
William
Saya tidak setuju dengan keraguan Anda. Pembunuhan itu berhasil untukku. Itu menendang saya ke debugger dan font-lock-default-fontify-region adalah tempat macet.
Brian C.
2

Saya tidak mengetahui adanya penanganan sinyal yang dilakukan emacs tetapi Anda dapat menggunakan Emacs Server dengan memasukkan server-startfile ~ / .emacs Anda sehingga Anda dapat melakukan RPC pada instance emacs yang sedang berjalan.

Kemudian ketika Anda ingin membunuh emacs dan menulis Anda dapat menelepon dari shell Anda emacsclient -e '(save-buffers-kill-emacs t)'.

Dwight Spencer
sumber