2012-11-07 22 views
8

Jak skonfigurować emacs, aby móc przeglądać błędy poprzednich kompilacji podczas nowej kompilacji?Przeglądanie błędów poprzednich kompilacji podczas nowej kompilacji?

Dwie rzeczy nie działają na mnie:

  1. M-g M-funkcja g (next-error) nie działa, gdy druga kompilacja jest w toku.

  2. Mam swoje emacs podzielone na 5 nierównomiernych okien (podzielone okna-w poziomie), "okno" kompilacji jest dwukrotnie większe (ustawienie monitora dbl). Kiedy uruchamiam kompilację, zawsze pojawiała się w ostatnim podwójnym oknie kompilacji. Teraz otwiera dla siebie nowe okno.

+0

biorąc pod uwagę to programowalny, odpowiedź brzmi tak. –

+0

Czy mógłbyś wyjaśnić dokładnie, jakich informacji brakuje w bieżących odpowiedziach? – Francesco

+0

@Francesco - Zapomniałem dodać wyjaśnienie, co nie działa - dodano w komentarzach do Twojej odpowiedzi. –

Odpowiedz

0

To trochę kludge, ale spróbuj tego:

Przed rozpoczęciem nowej kompilacji, zapisz (pisać, C-x C-W) aktualny bufor kompilacji do pliku. Jeśli bufor dla nowego pliku utraci ustawienie "trybu kompilacji", po prostu włącz tryb kompilacji z powrotem (tryb kompilacji M-x).

+0

To brzmi jak rozsądne podejście. Ale nie mogę tego zrobić ręcznie. Co więcej, gdy kończy się nowa kompilacja, chciałbym, aby nadpisała starą listę błędów. Moglibyśmy zmodyfikować polecenie kompilacji, aby skompilować do jakiegoś tymczasowego bufora i przenieść go do \ * kompilacji \ * po zakończeniu? –

3

Oto rozwiązanie, które wydaje się spełniać wszystkie wymagania:

  • bufor *compilation-old* zawsze pozostaje w tym samym oknie
  • next-error nie łamie
  • wszystkich kolejnych wyjść kompilacji są dołączane na końcu z *compilation-old*, gdy proces kompilacji kończy się
(defun my-compilation-finish-function (buffer msg) 
    ;; Don't do anything if we are in a derived mode 
    (when (with-current-buffer buffer (eq major-mode 'compilation-mode)) 

    ;; Insert the last compilation output at the end of *compilation-old* 
    (if (get-buffer "*compilation-old*") 
     (with-current-buffer "*compilation-old*" 
      (save-excursion 
      (goto-char (point-max)) 
      (insert-buffer buffer))) 
     (with-current-buffer buffer 
     (rename-buffer "*compilation-old*"))))) 

(add-hook 'compilation-finish-functions 'my-compilation-finish-function) 



(defadvice compile (around my-compile-show-old activate) 
    "Show the *compilation-old* buffer after starting the compilation" 
    (let ((buffer (current-buffer))) 
    (when (get-buffer "*compilation-old*") 
     (pop-to-buffer "*compilation-old*") 
     (switch-to-buffer "*compilation*")) 
    ad-do-it 
    (when (get-buffer "*compilation-old*") 
     (switch-to-buffer "*compilation-old*") 
     (pop-to-buffer buffer)))) 
+0

2 rzeczy nie działają dla mnie: 1. Funkcja M-g M-g (błąd nex) nie działa, gdy trwa druga kompilacja. 2. Mam podzielone emacs na 5 nierównomiernych okien (podzielone okna-w poziomie), "okno" kompilacji jest podwójne (setup dbl moniotr). Kiedy uruchamiam kompilację, zawsze pojawiała się w ostatnim podwójnym oknie kompilacji. Teraz przeciwstawia sobie nowe okno. –

+0

Co do problemu 1, czy próbowałeś użyć 'next-error' w sposób opisany w jego pomocy liniowej? Najpierw uruchom 'next-error' w buforze kompilacji, którego chcesz użyć jako źródła (' * compilation-old * 'w twoim przypadku), wtedy wszystkie kolejne wywołania' next-error' będą używać tego bufora. – Francesco

+0

Dla problemu 2, nie rozumiem, który bufor chciałbyś zobaczyć w oknie o podwójnych rozmiarach; stary czy bieżący? – Francesco

2

Umieszczenie następującego pliku w pliku init spowoduje zmianę nazwy buforu kompilacji na *compilation-old* po zakończeniu komendy kompilacji.

Należy pamiętać, że to nie będzie działać, jeśli uruchomić nowy proces kompilacji ze starego bufor kompilacji (od compile będzie w tym przypadku ponownego użycia bufora zamiast tworzyć nowy)

(defun my-rename-compilation-buffer (buffer message) 
    ;; Don't do anything if we are in a derived mode 
    (when (with-current-buffer buffer (eq major-mode 'compilation-mode)) 
    (let* ((old-compilation-buffer-name "*compilation-old*") 
      (old-compilation-buffer (get-buffer old-compilation-buffer-name))) 

     ;; Kill old compilation buffer if necessary 
     (when old-compilation-buffer 
     (kill-buffer old-compilation-buffer)) 

     ;; Rename the current compilation buffer 
     (with-current-buffer buffer 
     (rename-buffer old-compilation-buffer-name))))) 

(add-hook 'compilation-finish-functions 'my-rename-compilation-buffer) 
+0

Wciąż ten sam problem: 1. (następny błąd) używa błędów kompilacji tylko w nowym oknie. Nawet jeśli wykonam (następny błąd) z drugiego starego bufora kompilacji. –

Powiązane problemy