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ć :retab
polecenia. 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 :retab
wybranych 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ć expandtab
w 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 :retab
robi. (Zdarza mi się to określać ręcznie).
a
w if a:expandtab
średniej?
set expandtab
w .vimrc, a następnie autocmd BufWritePre * :call Retab(&expandtab)
- wcięcie zostanie zmienione na tabulatory zamiast spacji.
Vim udostępnia !retab
polecenie, które zastąpi wszystkie sekwencje <Tab>
nowymi ciągami białych znaków za pomocą :set tabstop=2
podanej nowej wartości tabstop (np. ), Ale wszystkie tabulacje wewnątrz ciągów można modyfikować (np. W programie C należy \t
tego 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 :%
)s
oznacza substytut ( :help sub-replace-special
)\t
lub ^I
oznacza 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 .vimrc
pliku 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\+/ g
tak, aby konwertowane były tylko tabulatory używane w wcięciach. Ponadto gg=G
może być katastrofalny w przypadku języków takich jak python.
Spróbuj użyć:
expand -t 4 input_filename output_filename
expand
to 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. unexpand
nawiasem mówiąc, zrobi odwrotnie.
expand
?
:%!expand -t 4
w 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=G
naprawiałby cały plik, w którym gg
przesuwa kursor na początek pliku, a następnie =
jest stosowany i G
przesuwa kursor na koniec pliku.Odniesienie: link
:h vim-faq
i wyszukać/tab characters
. Trudno zapamiętać tag:h faq-14.16
.