Làm cách nào để ngắt emacs khi control-g không hoạt động trong các tệp rất lớn?


16

Tôi đã gặp phải một số loại hành vi O (n ^ 2) hoặc tệ hơn khi xem các tệp rất lớn (ví dụ: 128 MB) trong Emacs và nhảy đến cuối tệp. Tôi nghĩ rằng nó có thể phải làm với thuật toán tô màu của tôi để tô màu văn bản theo ngữ cảnh. Nếu tôi gõ control-g (thoát bàn phím), thao tác sẽ không bị ảnh hưởng. Tôi muốn một số cách để phục hồi phiên emacs của mình mà không cần phải giết nó. Tôi đã thử gửi một SIGINT, nhưng emacs đã thoát. Có bất kỳ tín hiệu nào tôi có thể gửi, hoặc một số cách khác (có thể trong trình gỡ lỗi) để buộc bất kỳ hành động nào đang chạy để từ bỏ và trả lại quyền kiểm soát cho tôi không?


Tôi không biết cách nào để khóa phông chữ bị gián đoạn, nhưng bạn có thể tìm thấy một cái gì đó được sử dụng trong trang Wiki Emacs này để tăng tốc độ khóa phông chữ .
Aaron Miller

5
Bạn đã thử nhấn thoát 3 lần?
yPhil

Vâng, tôi nghĩ rằng mã khóa phông chữ của bạn có thể có lỗi ở đây. Kiểm tra font-lock-keywordsregexps của bạn một cách cẩn thận để cố gắng tìm ra vấn đề.
vẽ

1
EMACS: Tám Megabyte và hoán đổi liên tục :-)
user829755

2
Đánh thoát ba lần không làm gì cho tôi.
WilliamKF

Câu trả lời:


8

Tôi nghi ngờ đó là chế độ khóa phông chữ. Điều đó có lẽ chỉ có những phần gần những gì có thể nhìn thấy. Nó có thể sao chép dữ liệu trong bộ nhớ.

sigusr1

sigusr2

Những sự kiện này được tạo khi quá trình Emacs nhận được tín hiệu SIGUSR1SIGUSR2. Chúng không chứa dữ liệu bổ sung vì tín hiệu không mang thông tin bổ sung. Chúng có thể hữu ích để gỡ lỗi (xem Lỗi gỡ lỗi ).

Nguồn: GNU Emacs Tài liệu tham khảo Lisp: Sự kiện linh tinh

Tôi không biết nó sẽ làm gì (hoặc phiên bản emacs nào bạn đang chạy) nhưng bạn có thể thử tín hiệu không phá hủy PROBABLY (USR1 hoặc USR2).

$ Kill -USR1 pid

Hoặc bạn có thể đi ngủ và xem nếu nó phục hồi.


Tôi tự hỏi làm thế nào bận rộn (CPU và đĩa) máy của bạn. Điều đó có thể cho bạn biết một chút về những gì nó đang làm. .. và bạn có thể chạy một bản sao khác của emacs và "kill -USR1 pid" bản mới đó để xem điều gì xảy ra trước khi bạn làm điều bạn quan tâm.
9mjb

2
Ồ, gửi kill -USR2cho emacs-mac làm việc cho tôi trong một tình huống tương tự - đã tải một tệp lớn ở chế độ js2 và bắt đầu tìm kiếm. USR2 thoát khỏi isearch và vào trình gỡ lỗi. Tốt hơn nhiều so với việc giết quá trình!
William

Tôi không đồng ý với những nghi ngờ của bạn. Việc giết người làm việc cho tôi. Nó đá tôi đến trình gỡ lỗi và vùng khóa-mặc định-phông chữ là nơi nó bị kẹt.
Brian C.

2

Tôi không biết về bất kỳ xử lý tín hiệu nào mà emacs làm nhưng bạn có thể sử dụng Máy chủ Emacs bằng cách đặt server-starttệp ~ / .emacs của bạn để bạn có thể thực hiện RPC trên phiên bản emacs đang chạy của mình.

Sau đó, khi bạn muốn giết emacs và viết, bạn có thể gọi từ vỏ của bạn emacsclient -e '(save-buffers-kill-emacs t)'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.