2009-04-04 11 views

risposta

9

Ci sono diversi pezzi di questo:

  • è necessario venire con funzioni di Emacs per fare tutto il riformattazione che si desidera. indent-region è un inizio, ma potresti anche voler rimuovere untabify o altre cose.
  • è necessario richiamarli su ciascun file e poiché le funzioni di rientro funzionano su intervalli, è necessaria una funzione che imposta il segno per coprire l'intero file: mark-whole-buffer.
  • è necessario richiamare EMACS su ogni file: questo significa richiamare emacs con il file --batch.

Ci sono un paio di post di blog piacevoli su come fare questo here e here.

+0

Sembra buono, grazie! – Frank

+0

Sfortunatamente, i link ai post del blog sono morti. – Paul

+0

I post del blog ora funzionano. –

2

Credo che questo script non esegua la riformattazione. Invece si tratta di un esempio di come costruire uno "stile" personalizzato come descritto in: CC mode manual - Styles

manuale CC-mode dice anche:

Se si desidera riformattare il vecchio codice, probabilmente stai meglio usare qualche altro strumento, ad es Rientro GNU, che ha capacità di riformattazione più potenti rispetto alla modalità CC.

CC mode manual - Limitations-and-Known-Bugs

+0

bene, sì, ma dopo aver caricato lo stile è possibile riformattare. –

+0

Sì, quindi voglio caricare lo stile e applicare la funzione di indent-buffer. E poi fallo con tutti i file. – Frank

+0

Reindent, sì. Riforma, no. Le righe prima/dopo le parentesi, ad esempio, non vengono modificate. –

3

L'ho già fatto utilizzando una macro definita dalla tastiera. Caricare tutti i file in emacs (qualcosa come find . -name "*.cpp" | xargs emacs) e quindi digitare le seguenti chiavi. Ho annotato ogni combinazione di tasti con ciò che fa.

C-x-(     'Begin recording macro 
M-<     'Go to start of file 
C-space    'Mark current location (now start of file) 
M->     'Go to end of file 
M-x indent-region  'Indent entire file according to coding style 
C-x C-s    'Save the current buffer 
C-x C-k    'Close the current buffer 
C-x-)     'End recording macro 

Ora è possibile eseguire questo su un buffer digitando C-x e. Se hai caricato diversi file puoi eseguire qualcosa come C-u 100 C-x e per eseguirlo su 100 file. Se questo è superiore al numero di file, va bene, avrai solo qualche "squillo" o altri errori che puoi ignorare una volta completata l'elaborazione.

0

Se si desidera contrassegnare i file di origine in un buffer dired e quindi eseguire una funzione per formattare ogni si può fare qualcosa di simile:

(defun clean-file(filename) 
    (your-function-goes-here)) 

(defun clean-each-dired-marked-file() 
    (interactive) 
    (for-each-dired-marked-file 'clean-file)) 

(defun for-each-dired-marked-file(fn) 
"Do stuff for each marked file, only works in dired window" 
(interactive) 
(if (eq major-mode 'dired-mode) 
    (let ((filenames (dired-get-marked-files))) 
     (mapcar fn filenames)) 
    (error (format "Not a Dired buffer \(%s\)" major-mode)))) 
Problemi correlati