2011-03-02 10 views
7

mam currentling użyciuVim obowiązuje retab na początku linii tylko

:set noet|retab! 

ale problem używam do jest to zastąpienie wszystkich wystąpień 4 spacji do zakładek w całym pliku. Potrzebuję vim, aby zastępować tylko instancje o wielkości 4 spacji na początku linii.

Po usunięciu! na końcu retabii przestrzenie nie są nigdzie wymieniane.

Próbowałem przy użyciu funkcji niestandardowej, że ktoś Utworzono:

" 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 

ale uzyskać ładny wiadomość trochę błędzie podczas uruchamiania: Wykryto

:RetabIndents 

Błąd podczas przetwarzania RetabIndents funkcyjnych :

wiersz 2:

E486: Nie znaleziono wzoru:^({4}) +

+0

Czy jesteś pewny, że nie zostały już zastąpione wszystkich rozpoczynających pomieszczeń z kartami? Czy używasz oryginalnego pliku lub zmodyfikowanego pliku (lub bufora), w którym już uruchomiłeś ': set noet | retab!'? – gotgenes

+0

Ok, więc to jest problem, że nie mam żadnych spacji do zastąpienia. Czy nie powinien istnieć modyfikator do zignorowania, jeśli nie znaleziono pasujących elementów? –

+1

zobacz także http://stackoverflow.com/questions/5144284/force-vi-vim-to-use-leading-tabs-only-on-retab – wimh

Odpowiedz

9

Po rozmowie z innymi osobami o tym, musiałem dodać cichy! polecenie przed wykonaniem. Więc to jest to, co mam teraz pracuje:

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 

Więc teraz ta funkcja automatycznie zastąpić spacje z kartami na początku tylko każdej linii.

+2

Możesz użyć flagi 'e' na końcu': substitute' polecenie zamiast 'cichy!', zobacz ': h s_flags'. – ZyX

+0

Tego właśnie szukałem! Dzięki! Dodano flagę e i usunięto cichy! –

0

Używam innej metody, aby zmienić spacje na tabulatory na początku skryptów powłoki. Używam sed z linii poleceń.

Korzystanie BSD sed:

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

* Uwaga: (i) postać w nawiasach kwadratowych to znak tabulatora (ii) w postaci aftger/\ 1 jest również znak tabulatora. Obydwie zakładki są wpisywane w terminalu za pomocą kombinacji klawiszy Ctrl + v + Tab.

Korzystanie GNU sed:

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