2016-10-28 34 views
7

Obecnie używam find-file-hook, aby wywołać długą kompilację/sprawdzenie tego pliku. Muszę więc poczekać jakiś czas, aby rzeczywiście zobaczyć plik. Zamiast tego chciałbym móc przeglądać (nie edytować) plik już podczas działania kontrolera, tworząc iluzję natychmiastowej kompilacji. Jak mogę to zrobić?Jak wyświetlić plik, gdy wciąż znajduje się w haku na znajdowanie pliku

+1

Można ustawić bufor jako tylko do odczytu i ustawić timer, aby uruchomić kosztowne zadanie (które po zakończeniu spowoduje, że bufor będzie można edytować). – phils

Odpowiedz

1

Należy uznać za pomocą transmisji asynchronicznej Flycheck który zapewnia sprawdzanie składni dla większości języków programowania i zapewnia dobry API dla wdrażania nowych/niestandardowej warcaby.

+0

Moje pytanie nie dotyczyło inkrementacji. – false

3

Używanie find-file-hook oznacza, że ​​Twój kod będzie działał przy każdym otwartym pliku; czy jesteś na pewno tego chcesz? Może być bardziej sensowne tworzenie nowego trybu większego lub drugorzędnego dla typu pliku, na którym ma się odbywać sprawdzanie poprawności, a następnie użycie odpowiedniego haka trybu . Na przykład, jeśli chcesz sprawdzić wszystkie pliki .chk (z nowego głównego tryb dziedziczenia z 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) 

jak dla rzeczywistej haka, tym kodem (schodzili komentarz phils') działa na mnie:

;;; -*- 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!")))))) 

Uwaga jednak, że mimo to będzie wyświetlany plik, Emacs nadal będą zamrożone aż zakończy przetwarzanie, jak emacs doesn't actually support multithreading. Aby obejść ten problem, możesz użyć biblioteki, takiej jak async, lub concurrent.