2010-07-10 22 views
33

Tengo una carpeta que contiene cientos de archivos TTL (TeraTermLanguage). Ahora quería sangrar todos estos archivos.Sangría en VIM con todos los archivos en la carpeta

He creado teraterm.vim para la sangría y abro un archivo usando VIM y hago "gg = G" y todo el archivo se sangra correctamente.

Pero, ¿hay alguna manera, donde puedo sangrar todos los archivos en la carpeta.

Quería hacer con la ayuda de Shell. Pero en VIM no pude pasar el comando de sangría de archivo como argumento para VIM.

Por favor, sugiérame cuál es la mejor manera que puedo hacer la indentación de todos los archivos en VIM.

+0

esto es un poco confuso ... que Shell está usando? Si está utilizando algo como bash (y usando la respuesta de amphetamachine a continuación), lo siguiente debería funcionar: para el archivo en * .ttl * TTL; do vim -s indentme.src $ file; hecho – skeept

Respuesta

57

Mucho más simple que la creación de scripts vim desde la línea de comandos bash es usar vimscript desde el interior de vim (o tal vez una línea más simple para scripting vim desde la línea de comandos). Personalmente prefiero usar la lista de argumentos para la manipulación de archivos múltiples. Por ejemplo:

:args ~/src/myproject/**/*.ttl | argdo execute "normal gg=G" | update 
  • args establece el arglist, utilizando los patrones (** coincidirá con el directorio actual, así como los subdirectorios)
  • | nos permite ejecutar varios comandos en una sola línea
  • argdo se ejecuta la siguiente comandos en cada arg (se tragará el segundo |)
  • execute previene que normal se traguen el siguiente conducto.
  • normal ejecuta los siguientes comandos en modo normal (lo que estaba trabajando en el primer lugar)
  • update es como :w, sino que sólo guarda cuando se modifica el búfer.

Este patrón :args ... | argdo ... | update es muy útil para cualquier tipo de manipulación de archivos todo el proyecto (por ejemplo, buscar y reemplazar a través de %s/foo/bar/ge o el establecimiento uniforme fileformat o fileencoding).

(otras personas prefieren un patrón similar utilizando la lista de amortiguamiento y :bufdo, pero con la lista arg que no necesita preocuparse por el cierre de memorias intermedias de corriente o la apertura de nueva sesión vim.)

+0

Gracias Nicholas, Esto es simplemente una gran manera de hacerlo. También esto es muy útil en muchos otros casos. Aunque pude hacer uso de secuencias de comandos, esto es mucho más rápido. Bueno, tengo alrededor de 900 archivos que tuve que modificar. El único inconveniente que enfrenté es que cada vez que llena la pantalla con los nombres de los archivos, tengo que presionar la barra espaciadora para que pueda ocuparse del siguiente conjunto de archivos. – hari

+5

Si se interpone en su camino, debería poder evitar el mensaje "--More--" y presionar el espacio en cada pantalla mediante una aplicación liberal de ': silent'. P.ej. ': argdo silent execute" normal gg = G "| actualización silenciosa' –

+1

+1 y @ nicholasa.evans Me gustaría mover/copiar el contenido de ese comentario en la respuesta real (pero eso soy yo) – CoatedMoose

11

Abra una terminal. Tipo:

$ vim -w indentme.scr foo.c 

A continuación, escriba esto exactamente (modo de comando):

gg=G:wq 

Esto cerrará vim, ahorrando el proceso de sangría de todas las líneas en el archivo a un script de Vim llamada indentme.scr.

Nota:indentme.scr contendrá un registro de todos los comandos de teclado mecanografiados, por lo que cuando haya terminado de sangría en el archivo, no pasar mucho tiempo utilizando las teclas de flecha para mirar alrededor del archivo, ya que esto conducirá a un script mucho más grande y ralentizará severamente las operaciones por lotes.

Ahora, con el fin de aplicar sangría a todas las líneas en un archivo, sólo tiene que escribir el siguiente comando:

$ vim -s indentme.scr unindented-file.c 

Vim parpadeará abierta-cerrada (si estás en un equipo rápido y no editar un enorme archivo), sangrando todas las líneas y luego guardando el archivo en su lugar.

Desafortunadamente, esto sólo funcionará en un archivo al mismo tiempo, pero se puede ampliar la funcionalidad fácilmente utilizando sh 's for bucle:

for filename in *.ttl ; do 
    vim -s indentme.scr "$filename" 
done 

Nota: Esto ahorrará-sobre cualquier archivo. A menos que set bk esté en su ~/.vimrc, no espere que se guarde una copia de seguridad.

2

me fui de la solución de amphetamachine. Sin embargo, necesitaba buscar recursivamente a través de múltiples directorios. Aquí está la solución que utilicé:

$ find . -type f -name '*.ttl' -exec vim -s indentme.scr "{}" \; 
0

Tomando como referencia las respuestas anteriores, me gustaría hacer esto completo. Comenzaré desde cero para que un principiante pueda entender.

Paso-1 Instalar astyle (herramienta utilizada para el formato) utilizando el siguiente comando abrir un terminal. Tipo:

sudo apt-get install astyle 

Paso-2 Asegúrese de que ha instalado en su vim system.Run los siguientes comandos desde el directorio en el que los archivos de código are.The a continuación comando creará un script que tenemos la intención de ejecutar de forma recursiva con el fin de embellecer cada archivo en nuestro directorio. (como se mencionó en la respuesta anterior)

vim -w indentme.scr foo.c 

Paso-3 a continuación, escriba esto exactamente (en el modo de comandos) y presionar enter

:%!astyle 

Paso-4 continuación, escriba esto exactamente (en el modo de comandos) y pulse Enter

:wq 

Paso-5 Última plazo, esto forma recursiva mediante el siguiente comando:

find . -type f -name '*.cpp' -exec vim -s indentme.scr "{}" \; 

Todos sus archivos cpp tendrán el formato correcto.

Cuestiones relacionadas