2012-07-22 14 views
5

Viele Menschen verwenden Leerzeichen statt Tabs. Ich benutze beide. Tabulatoren am Anfang der Zeile und Leerzeichen ab dem ersten Nicht-Leerzeichen. Kein Problem beim Starten eines neuen Dokuments und wenn ich etwas modifizieren muss, dann besser an das Format anpassen. Manchmal muss ich das Leerzeichen trotzdem beheben.Wie werden führende Leerzeichen in Tabs umgewandelt?

Nach Search and replace kann ich einfach :%s/spaces_for_tab/tab/g tun. Es ist einfach und es wird in vielen Fällen funktionieren. Jedenfalls möchte ich nur Leerzeichen am Anfang der Zeile umgestalten.

+2

': set noet', wählen Sie den Block zum Konvertieren,': retab! ' – ninjalj

+0

@ninjalj Ja, es funktioniert, aber die Auswahl Block zu konvertieren kann manchmal schwer sein. –

+0

mögliches Duplikat von [Wie kann ich Leerzeichen in Registerkarten in Vim oder Linux konvertieren?] (Http://stackoverflow.com/questions/9104706/how-can-i-convert-spaces-to-tabs-in-vim-or -linux) –

Antwort

2

Ich habe ein einfaches func dafür geschrieben. Wie auch immer, es funktioniert nur für 4-Platz-Tab.

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

Sie können eine bessere Lösung vorschlagen, falls vorhanden, und ich werde es gerne verwenden. Das Problem ist, dass diese Funktion auch Leerzeichen in Strings ersetzt.

+0

Dies ist das erste Mal, dass ich meine Antwort markiere. Wie auch immer, das ist eine große Aufgabe (verhindern Sie, dass Leerzeichen in mehrzeiligen Zeichenfolgen, HTML-Vor-Tags usw. geändert werden), meine Implementierung ist ein bisschen naiv. –

+0

Dies ist keine gute Lösung, verwenden vim eingebaute Befehle statt 'retab' in Kombination mit' noexpandtab' –

+0

@sg Wenn ich richtig verstehe, Martins Beschwerde ist, dass 'retab' allein funktioniert nicht wie erwartet und' retab! 'konvertiert Leerzeichen in Tabulatoren * überall * in der Zeile (auch innerhalb von String-Literalen). Es ist wirklich angemessener, dass nur führende Leerzeichen in Tabs umgewandelt werden. –

5

Dies ist eher ein Regex Problem. Um am Anfang der Zeile zu verankern, verwenden Sie das Caret, z.

s/^  /\t/ 

Oder es Vims builtin-Funktionalität:

: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 

By the way, ich bevorzugen Tabs für Vertiefung und Räume für Ausrichtung. Leider, vim doesn't handle this well (und ich weiß nicht, was andere Editoren tun), so verwende ich meistens :set expandtab (vielleicht sehen :set softtabstop).

+0

Sie werden normalerweise 'retab!' anstatt 'retab' wollen. –

+1

Das Problem ist, wie Sie geschrieben haben, VIM geht nicht so gut (wahrscheinlich vermisse ich nur etwas Feature von VIM, VIM hat immer schöne Überraschung für mich), weil retab alle Leerzeichen ersetzt nicht nur die führenden. –

-1

nahm ich Martins Antwort und verbessert auf es ein bisschen, wenn jemand interessiert:

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 

dieser Funktion wird die entsprechende Sache tut auf den Werten der Abhängigkeit expandtab und tabstop Einstellungen und auch merkt sich, wo der Cursor befindet.

Verwandte Themen