2009-04-04 7 views

Respuesta

9

Hay varias piezas a esto:

  • lo que necesita para llegar a las funciones de Emacs para hacer todo el cambio de formato que desee. indent-region es un comienzo, pero es posible que también desee desestabilizar o algunas otras cosas.
  • necesita invocarlos en cada archivo, y dado que las funciones de sangrado funcionan en rangos, necesita una función que establezca marca para cubrir todo el archivo: mark-whole-buffer.
  • necesita invocar EMACS en cada archivo: esto significa invocar emacs con el archivo --batch.

Hay un par de buenas publicaciones en el blog sobre cómo hacer esto here y here.

+0

¡Eso se ve bien, gracias! – Frank

+0

Desafortunadamente, los enlaces a las publicaciones del blog ahora están muertos. – Paul

+0

Las publicaciones del blog están funcionando. –

2

Creo que este script no lo reformatea. En su lugar, es un ejemplo de cómo construir un "estilo" personalizado como se describe en: CC mode manual - Styles

manual modo CC también dice:

Si desea cambiar el formato de código antiguo, probablemente mejor usar alguna otra herramienta, por ejemplo, por ejemplo Sangría de GNU, que tiene capacidades de reformateo más potentes que el modo CC.

CC mode manual - Limitations-and-Known-Bugs

+0

bueno, sí, pero después de haber cargado el estilo puede volver a formatear. –

+0

Sí, así que quiero cargar el estilo y aplicar la función de indent-buffer. Y luego haz eso con todos los archivos. – Frank

+0

Reindent, sí. Reformate, no. Las líneas nuevas antes/después de los apoyos, por ejemplo, no se cambian. –

3

He hecho esto antes usando una macro definida por el teclado. Cargaría todos los archivos en emacs (algo así como find . -name "*.cpp" | xargs emacs) y luego teclearé las siguientes claves. He anotado cada combinación de teclas con lo que hace.

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 

Ahora se puede ejecutar esto en un búfer tecleando C-x e. Si ha cargado varios archivos, puede ejecutar algo como C-u 100 C-x e para ejecutar esto en 100 archivos. Si esto es más que la cantidad de archivos, está bien, obtendrá un "timbre" u otro error que puede ignorar una vez que se complete todo el procesamiento.

0

Si desea marcar los ficheros fuente en un búfer Dired y luego ejecutar una función para dar formato a cada uno puede hacer algo como esto:

(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)))) 
Cuestiones relacionadas