2012-07-22 12 views
5

Molte persone utilizzano spazi anziché schede. Li uso entrambi. Schede all'inizio della riga e spazi dal primo carattere non di spazi bianchi. Nessun problema per l'avvio di un nuovo documento e nel caso in cui debba modificarne uno si adatta meglio all'utilizzo del formato. Ancora a volte ho bisogno di risolvere il problema degli spazi comunque.Come convertire spazi iniziali in schede?

Secondo Search and replace Posso solo fare :%s/spaces_for_tab/tab/g. È semplice e funzionerà per molti casi. Ad ogni modo voglio rifattorizzare solo gli spazi all'inizio della riga.

+2

': set noet', selezionare il blocco da convertire,': retab! ' – ninjalj

+0

@ninjalj Sì, funziona, ma selezionare il blocco da convertire può essere a volte difficile. –

+0

possibile duplicato di [Come posso convertire spazi in schede in Vim o Linux?] (Http://stackoverflow.com/questions/9104706/how-can-i-convert-spaces-to-tabs-in-vim-or -linux) –

risposta

2

Ho scritto una semplice funzione per questo. Ad ogni modo funzionerà solo per la scheda a 4 spazi.

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

È possibile suggerire una soluzione migliore, se esiste, e la userò con piacere. Il problema è che questa funzione sostituisce anche gli spazi nelle stringhe.

+0

Questa è la prima volta che segna la mia risposta. Ad ogni modo questo è un grosso compito (evitare spazi di cambiamento in stringhe multilinea, pre-tag html e così via) la mia implementazione è un po 'ingenua. –

+0

Questa non è una buona soluzione, usa i comandi incorporati di vim invece di 'retab' in combinazione con' noexpandtab' –

+0

@sg Se ho capito bene, la lamentela di Martin è che 'retab' da solo non funziona come previsto e' retab! 'converte gli spazi in tabulati * ovunque * sulla linea (anche all'interno di stringhe letterali). È davvero più appropriato che solo gli spazi iniziali iniziali vengano convertiti in schede. –

5

Questo è più di un espressione regolare. Per ancorare all'inizio della riga, usa il cursore, ad es.

s/^  /\t/ 

o farlo utilizzando la funzionalità built-in di 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 

A proposito, anch'io preferisco le schede per rientro e spazi per allineamento. Sfortunatamente, vim doesn't handle this well (e non so cosa facciano gli altri editor), quindi uso principalmente :set expandtab (forse vedi :set softtabstop).

+0

In genere si vorrebbe 'retab!' piuttosto che 'retab'. –

+1

Il problema è, come hai scritto, VIM non gestisce bene (probabilmente mi manca qualche caratteristica di VIM, VIM ha sempre una bella sorpresa per me) perché retab sostituisce tutti gli spazi non solo quelli principali. –

-1

ho preso la risposta di Martin e migliorato su di esso un po 'se qualcuno è interessato:

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 

Questa funzione fa la cosa appropriata a seconda dei valori delle impostazioni expandtab e tabstop ed anche ricorda dove si trova il cursore.

Problemi correlati