2011-03-02 16 views
7

estoy usando currentlingespacios retab Vim al comienzo de las líneas solamente

:set noet|retab! 

pero el problema que estoy corriendo en se está reemplazando todas las instancias de 4 espacios en tabulaciones lo largo de todo el archivo. Necesito vim para solo reemplazar instancias de 4 espacios al comienzo de las líneas solamente.

¡Si elimino el archivo! al final de retab, los espacios no se reemplazan en ningún lado.

He intentado usar una función personalizada que alguien creó:

" Retab spaced file, but only indentation 
command! RetabIndents call RetabIndents() 

" Retab spaced file, but only indentation 
func! RetabIndents() 
    let saved_view = winsaveview() 
    execute '%[email protected]^\(\{'.&ts.'}\)\[email protected]\=repeat("\t", len(submatch(0))/'.&ts.')@' 
    call winrestview(saved_view) 
endfunc 

pero me sale un mensaje de error poco agradable cuando corro:

:RetabIndents 

error detectado durante el procesamiento de la función RetabIndents :

línea 2:

E486: Patrón no encontrado:^({4}) +

+0

¿está seguro de que ya no haya reemplazado todos los espacios que comienzan con pestañas? ¿Está utilizando el archivo original o el archivo modificado (o el búfer) en el que ya ejecutó ': set noet | retab!'? – gotgenes

+0

Ok, entonces ese es el problema, que no tengo espacios para reemplazar. ¿No debería haber un modificador para ignorar si no se encuentran coincidencias? –

+1

vea también http://stackoverflow.com/questions/5144284/force-vi-vim-to-use-leading-tabs-only-on-retab – wimh

Respuesta

9

Después de hablar con otras personas sobre esto, ¡necesité agregar el silencio! comando antes de ejecutar. Así que esto es lo que he trabajando ahora:

autocmd BufWritePre * :RetabIndents 
command! RetabIndents call RetabIndents() 

func! RetabIndents() 
    let saved_view = winsaveview() 
    execute '%[email protected]^\(\ \{'.&ts.'\}\)\[email protected]\=repeat("\t", len(submatch(0))/'.&ts.')@e' 
    call winrestview(saved_view) 
endfunc 

Así que ahora esta función reemplazará automáticamente los espacios con fichas al comienzo de cada línea única.

+2

Puede usar la bandera 'e' al final de': substitute' comando en lugar de 'silencioso!', ver ': h s_flags'. – ZyX

+0

¡Eso es lo que estaba buscando! ¡Gracias! ¡Agregó la bandera e y eliminó el silencio! –

0

Uso un método diferente para cambiar espacios a pestañas al comienzo de mis scripts de shell. Solo uso sed desde la línea de comando.

Usando BSD sed:

sed -i "" -e ':loop' -e "s/^\([ ]*\) /\1 /" -e 't loop' somefile.sh 

* Nota: (i) el carácter de los corchetes es un carácter de tabulación (ii) el carácter del aftger/\ 1 es también un carácter de tabulación. Ambos caracteres de las pestañas se ingresan en la terminal usando la combinación de teclas Ctrl + v + Tab.

Usando sed de GNU:

sed -i -e ':loop' -e 's/^\([\t]*\) /\1\t/' -e 't loop' somefile.sh 
Cuestiones relacionadas