2012-07-22 15 views
5

Muchas personas usan espacios en lugar de pestañas. Yo uso ambos. Pestañas al comienzo de la línea y espacios del primer carácter que no es de espacio en blanco. No hay problema para iniciar un documento nuevo y, en caso de que tenga que modificar uno, mejor adaptarlo al formato de uso. Todavía a veces necesito solucionar el problema de espacios de todos modos.¿Cómo convertir espacios iniciales a pestañas?

Según Search and replace puedo hacer :%s/spaces_for_tab/tab/g. Es simple y funcionará en muchos casos. De todos modos, quiero refactorizar solo espacios al comienzo de la línea.

+2

': set noet', seleccione el bloque para convertir,': retab! ' – ninjalj

+0

@ninjalj Sí, funciona, pero seleccionar bloque para convertir puede ser a veces difícil. –

+0

posible duplicado de [¿Cómo puedo convertir espacios en pestañas en Vim o Linux?] (Http://stackoverflow.com/questions/9104706/how-can-i-convert-spaces-to-tabs-in-vim-or -linux) –

Respuesta

2

He escrito una función simple para ello. De todos modos, solo funcionará para la pestaña de 4 espacios.

fu! Fixspaces() 
     while search('^\t* \{4}') != 0 
       execute ':%s/^\t*\zs \{4}/\t/g' 
     endwhile 
endfu 

Puede sugerir una mejor solución, si existe, y la usaré con mucho gusto. El problema es que esta función también reemplaza espacios en cadenas.

+0

Esta es la primera vez que marcó mi respuesta. De todos modos, esta es una gran tarea (evitar cambios de espacios en cadenas de líneas múltiples, preetiquetas html, etc.) mi implementación es un poco ingenua. –

+0

Esta no es una buena solución, use comandos incorporados de vim en su lugar como 'retab' en combinación con' noexpandtab' –

+0

@sg Si entiendo correctamente, la queja de Martin es que 'retab' solo no funciona como se espera y' retab! 'convierte espacios en pestañas * en cualquier lugar * en la línea (incluso dentro de literales de cadenas). Es realmente más apropiado que solo los espacios en blanco iniciales se conviertan en pestañas. –

5

Esto es más de un problema regex. Para anclar al principio de la línea, use el símbolo de intercalación, p.

s/^  /\t/ 

O hacerlo utilizando la funcionalidad incorporada de Vim:

:set tabstop=4 "four spaces will make up for one tab 
:set noexpandtab "tell vim to keep tabs instead of inserting spaces 
:retab   "let vim handle your case 

Por cierto, yo también prefieren pestañas para muesca y espacios para alineación. Lamentablemente, vim doesn't handle this well (y no sé lo que hacen otros editores), así que la mayoría de las veces uso :set expandtab (tal vez vea :set softtabstop).

+0

Por lo general, querrá 'retab!' en lugar de 'retab'. –

+1

El problema es que, como usted escribió, VIM no lo maneja bien (es más probable que me pierda alguna característica de VIM, VIM siempre me ha sorprendido) porque retab reemplaza todos los espacios, no solo los principales. –

-1

Tomé la respuesta de Martin y mejoraron en él un poco si alguien está interesado:

function Fixspaces() 
    let ts = &tabstop 
    let pos = getpos('.') 

    if &expandtab 
    while search('^ *\t') != 0 
     silent execute ':%s/^ *\zs\t/'.repeat(' ', ts).'/g' 
    endwhile 

    echo 'Changed tabs to spaces' 
    else 
    while search('^\t* \{'.ts.'}') != 0 
     silent execute ':%s/^\t*\zs \{'.ts.'}/\t/g' 
    endwhile 

    echo 'Changed spaces to tabs' 
    endif 

    call setpos('.', pos) 
endfunction 

Esta función hace lo adecuado en función de los valores de los ajustes expandtab y tabstop y también recuerda donde está el cursor.

Cuestiones relacionadas