2016-10-28 10 views
7

Hiện tại, tôi sử dụng find-file-hook để gọi quá trình biên dịch/kiểm tra tệp dài. Do đó, tôi phải đợi một thời gian để xem tệp. Những gì tôi muốn làm thay vào đó là để có thể xem (không chỉnh sửa) các tập tin đã có trong khi kiểm tra đang chạy, do đó tạo ra những ảo ảnh của biên dịch tức thời. Tôi có thể làm cái này như thế nào?Cách hiển thị tệp trong khi vẫn tìm trong tập tin-móc-móc

+1

Bạn có thể tạo bộ đệm chỉ đọc và đặt bộ hẹn giờ để kích hoạt tác vụ tốn kém (trong đó, sau khi hoàn thành, sẽ làm cho bộ đệm có thể chỉnh sửa). – phils

Trả lời

1

Bạn nên xem xét sử dụng Flycheck cung cấp kiểm tra cú pháp không đồng bộ cho hầu hết các ngôn ngữ lập trình và cung cấp API tốt để triển khai các trình kiểm tra mới/tùy chỉnh.

+0

Câu hỏi của tôi không phải là về sự gia tăng. – false

3

Sử dụng find-file-hook có nghĩa là mã của bạn sẽ chạy trên mọi tệp bạn mở; bạn có phải là chắc chắn bạn muốn điều này không? Có thể có ý nghĩa hơn khi tạo một chế độ chính hoặc nhỏ mới cho loại tệp bạn muốn chạy xác thực của mình và sau đó sử dụng móc chế độ tương ứng tương ứng. Ví dụ, nếu bạn muốn kiểm tra tất cả các file .chk (với chế độ của bạn mới lớn kế thừa từ prog-mode):

(define-derived-mode check-mode prog-mode "Checker") 
(add-to-list 'auto-mode-alist '("\\.chk\\'" . check-mode)) 
(add-hook 'check-mode-hook 'check-mode-computation-hook) 

Đối với móc thực tế, mã này (đi tắt bình luận Phils') làm việc cho tôi:

;;; -*- lexical-binding: t -*- 
(defun slow-computation() 
    (dotimes (i 10000000) 
    (+ i 1))) 

(defun check-mode-computation-hook() 
    (let ((cb (current-buffer)) 
     (ro buffer-read-only)) 
    (setq-local buffer-read-only t) 
    (run-at-time .1 nil 
       (lambda() 
        (with-current-buffer cb 
        (message "Loading...") 
        (slow-computation) 
        (setq-local buffer-read-only ro) 
        (message "Loaded!")))))) 

Lưu ý, mặc dù, rằng mặc dù điều này sẽ hiển thị các tập tin, emacs vẫn sẽ được đông lạnh cho đến khi nó kết thúc xử lý của nó, như emacs doesn't actually support multithreading. Để giải quyết vấn đề này, bạn có thể phải sử dụng thư viện như async, deferred hoặc concurrent.

Các vấn đề liên quan