2012-11-07 9 views
8

Come configurare emacs in modo che possa sfogliare gli errori di compilazione precedenti durante la nuova compilazione?Sfogliare gli errori di compilazione precedenti durante una nuova compilation?

Due cose non funzionano per me:

  1. M-g M-g la funzione (next-errore) non funziona quando il secondo compilazione è in corso.

  2. Ho il mio emac suddiviso in 5 finestre non uniformi (split-windows-orizzontalmente), la "finestra" di compilazione è il doppio della dimensione (impostazione del monitor dbl). Quando lancio la compilation è sempre apparso nell'ultima finestra di compilation doppia. Ora apre una nuova finestra per se stesso.

+0

Considerando che è programmabile, la risposta è si. –

+0

Potresti spiegare esattamente quali dettagli mancano le risposte attuali? – Francesco

+0

@Francesco - Hai dimenticato di aggiungere una spiegazione di ciò che non funziona - aggiunta nei commenti alla tua risposta. –

risposta

0

E 'un po' un Kludge, ma provare questo:

Prima di iniziare la nuova compilation, salvare (scrivere, C-x C-w) il buffer di compilazione corrente in un file. Se il buffer del nuovo file perde l'impostazione di "modalità di compilazione", è sufficiente attivare nuovamente la modalità di compilazione (modalità di compilazione M-x).

+0

Sembra un approccio ragionevole. Ma non posso farlo manualmente. Inoltre, quando termina la compilazione, vorrei che sovrascriva la vecchia lista degli errori. Potremmo modificare il comando di compilazione per compilare un buffer temporaneo e spostarlo in \ * compilation \ * al termine? –

3

Ecco una soluzione che sembra compiere tutte le esigenze:

  • buffer *compilation-old* rimane sempre nella stessa finestra
  • next-error non rompe
  • tutte le uscite di compilazione successive vengono aggiunti alla fine di *compilation-old* quando termina il processo di compilazione
(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 cose non funzionano per me: 1. M-g La funzione M-g (nex-error) non funziona quando la seconda compilazione è in corso. 2. Ho il mio emacs diviso in 5 finestre non uniformi (split-windows-orizzontalmente), la compilation "window" è il doppio della dimensione (dbl moniotr setup). Quando lancio la compilation è sempre apparso nell'ultima finestra di compilation doppia. Ora si oppone nuova finestra per se stesso. –

+0

Per quanto riguarda il problema 1, hai provato a usare 'next-error' nel modo descritto nella sua guida in linea? Per prima cosa esegui 'next-error' nel buffer di compilazione che vuoi usare come sorgente (' * compilation-old * 'nel tuo caso), quindi tutte le successive chiamate di' next-error' useranno questo buffer. – Francesco

+0

Per il problema 2, non capisco quale buffer si vorrebbe vedere nella finestra a doppia dimensione; il vecchio o quello in esecuzione? – Francesco

2

Inserendo quanto segue nel file di inizializzazione verrà rinominato il buffer di compilazione in *compilation-old* quando il comando di compilazione termina.

prega di notare che questo non funzionerà se si esegue il nuovo processo di compilazione dal buffer di compilazione vecchio (dal compile sarà in questo caso riutilizzare il buffer invece di crearne uno nuovo)

(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

Ancora lo stesso problema: 1. (prossimo errore) usa gli errori di compilazione solo in una nuova finestra. Anche se eseguo (next-error) dal secondo buffer di compilazione vecchia. –

Problemi correlati