Czy można konwertować tabulatory na spacje, zachowując wyrównanie tekstu?
Po prostu zamiana działa tylko wtedy, gdy nie ma wiodących postaci.
Czy można konwertować tabulatory na spacje, zachowując wyrównanie tekstu?
Po prostu zamiana działa tylko wtedy, gdy nie ma wiodących postaci.
Odpowiedzi:
Możesz użyć :retabpolecenia. Od
:help :retab
Zastąp wszystkie sekwencje białych
<Tab>znaków zawierających nowe ciągami białych znaków, używając nowej podanej wartości tabstop. Jeśli nie określisz nowego rozmiaru tabstop lub jest on zerowy, Vim użyje bieżącej wartości'tabstop'. [...] Po'expandtab'włączeniu Vim zastępuje wszystkie tabulatory odpowiednią liczbą spacji.
Zauważ, że polecenie akceptuje zakres, więc możesz dokonać wizualnego wyboru, a następnie tylko :retabwybranych linii.
Można jednak użyć :retab, jak wspomniano, spowoduje to zmianę wszystkich tabulatorów na spacje, nie tylko tabulatory na początku wiersza
Więc to (gdzie ⇥jest znak tabulacji):
if :; do
⇥echo "⇥hello"
end
zmienia się na (gdzie ␣jest spacja):
if :; do
␣␣echo "␣␣hello"
end
Może to powodować nieoczekiwane skutki uboczne w niektórych scenariuszach, a to jeszcze większy problem przy zmianie spacji na tabulatory!
Tak więc napisałem małą funkcję zmiany tylko tabulatorów / spacji na początku wiersza:
" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
let l:spaces = repeat(' ', &tabstop)
" Replace tabs with spaces
if a:expandtab
silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
" Replace spaces with tabs
else
silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
endif
endfun
W tej wersji musisz ręcznie określić expandtabw wywołaniu funkcji (tj. :call Retab(1)Zmienić tabulatory na spacje), ale możesz również zmodyfikować ją, aby przyjmowała bieżącą wartość &expandtab(jak to już ma miejsce &tabstop), tak jak to :retabrobi. (Zdarza mi się to określać ręcznie).
aw if a:expandtabśredniej?
set expandtabw .vimrc, a następnie autocmd BufWritePre * :call Retab(&expandtab)- wcięcie zostanie zmienione na tabulatory zamiast spacji.
Vim udostępnia !retabpolecenie, które zastąpi wszystkie sekwencje <Tab>nowymi ciągami białych znaków za pomocą :set tabstop=2podanej nowej wartości tabstop (np. ), Ale wszystkie tabulacje wewnątrz ciągów można modyfikować (np. W programie C należy \ttego uniknąć)!
Alternatywnie możesz zmienić wszystkie tabulatory na spacje, używając następującego polecenia:
:%s/\t/ /g
lub zgodnie z sugestią @Shahbaz :
:%s/^\t\+/ g
Tak więc konwertowane są tylko tabulatory używane w wcięciach.
Wyjaśnienie:
%reprezentuje cały bufor / plik ( :help :%)soznacza substytut ( :help sub-replace-special)\tlub ^Ioznacza tab - użyj tyle spacji, ile potrzebujesz na jedną kartęg - oznacza globalny i przekształci wiele wystąpień kart w tym samym wierszuNastępnie skorygować wcięcia całego pliku, możesz spróbować: gg=G. Sprawdź: Ponowne wcięcie źle źle wciętego kodu, aby uzyskać więcej szczegółów.
Aby domyślnie używać spacji zamiast tabulatorów, musisz dodać do .vimrcpliku następujące ustawienia :
set tabstop=2 " (ts) width (in spaces) that a <tab> is displayed as
set expandtab " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2 " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)
Alternatywnym rozwiązaniem jest użycie tidy
Związane z:
%s/^\t\+/ gtak, aby konwertowane były tylko tabulatory używane w wcięciach. Ponadto gg=Gmoże być katastrofalny w przypadku języków takich jak python.
Spróbuj użyć:
expand -t 4 input_filename output_filename
expandto narzędzie wiersza polecenia do konwersji tabulatorów na spacje, które można uruchomić z powłoki lub za pomocą :!expand.
Jest w POSIX, więc powinien być dostępny na większości systemów. unexpandnawiasem mówiąc, zrobi odwrotnie.
expand?
:%!expand -t 4w vimie. Jeszcze lepiej, możesz również użyć bieżącej opcji szerokości przesunięcia: :exe '%!expand -t ' . &shiftwidth
Dla kompletności =można go również użyć do naprawy wcięć, po określeniu, że tabulatory są zastępowane spacjami. W trybie normalnym możesz to zrobić, pisząc :set expandtab. Następnie =można go użyć na dwa sposoby:
=naprawiałby wcięcia wybranych bloków kodu.gg=Gnaprawiałby cały plik, w którym ggprzesuwa kursor na początek pliku, a następnie =jest stosowany i Gprzesuwa kursor na koniec pliku.Odniesienie: link
:h vim-faqi wyszukać/tab characters. Trudno zapamiętać tag:h faq-14.16.