Zamień tabulatory na spacje w vimie

358

Chciałbym przekonwertować tabulację na spacje w gVim. Dodałem następujący wiersz do mojego _vimrc:

set tabstop=2

Działa, aby zatrzymać się na dwóch spacjach, ale nadal wygląda na to, że włożony jest jeden klawisz tabulacji (próbowałem użyć klawisza h, aby policzyć spacje później).

Nie jestem pewien, co powinienem zrobić, aby gVim przekonwertował tabulatory na spacje?

David.Chu.ca
źródło
1
Osobiście uważam, że tabstop = 2 za małe wcięcie; Używam ts = 4 i rozumiem, dlaczego ludzie (np. Zespół jądra Linuksa) używają ts = 8 (i nie używają rozwinięcia - tak robię).
Jonathan Leffler
4
Czy istnieje sposób na konwersję spacji na tabulatory w vimie?
cwd
2
@cwd zastępując przestrzenie znak tabulatora ( ^Iktóre pochodzą z Ctrl-vpotem Tab) byłyby prace, na przykład jeśli bieżące zakładki znajduje się 4 pomieszczenia::%s/ /^I/g
Indra Ginanjar

Odpowiedzi:

381

IIRC, coś w stylu:

set tabstop=2 shiftwidth=2 expandtab

powinien załatwić sprawę. Jeśli masz już tabulatory, prześledź je ładnym globalnym RE, aby zastąpić je podwójnymi spacjami.

D.Shawley
źródło
25
Ups, to jest „:%! Expand -t2”
Paul Tomblin
368
albo po prostu użyć: retab
zerwa
co jeśli chcę zapisać to ze spacjami? właśnie teraz, gdy: wq i ponownie otwórz plik, wracam do kart
Gorkem Yurtseven
1
@Gorkem umieścił te polecenia w pliku .vimrc, aby vim używał tych ustawień podczas każdej sesji
Krakkos,
5
Co to wszystko oznacza, jest ładnie wyjaśnione na wiki Vima .
Serge Stroobandt,
824

Po włączeniu rozwijania zgodnie z innymi odpowiedziami, niezwykle wygodny sposób na konwersję istniejących plików zgodnie z nowymi ustawieniami to:

:retab

Będzie działać na bieżącym buforze.

.ıu
źródło
ale w jaki sposób możemy sprawić, by Retab poprosił o potwierdzenie każdego wystąpienia TAB?
Oculus Dexter
8
I będąc Vimem, działa również na wizualnie wybranych regionach :)
Andy
2
Dzięki za nauczenie mnie nowej rzeczy. Używam tego nudnego :%s/\t/ /god lat, zanim zobaczyłem twój komentarz.
Tai Le
Możesz nawet zrobić :args retab | wwszystkie pliki otwarte w wierszu poleceń, np vim *.txt.
JakeD
Czy ktoś wie, która wersja vima ma: Retab? Mój 7.3.322 nie.
bitmaker
114

Próbować

set expandtab

do miękkich zakładek.

Aby naprawić istniejące wcześniej karty:

:%s/\t/  /g

Użyłem dwóch spacji, ponieważ już ustawiłeś tabstop na 2 spacje.

Hank Gay
źródło
5
Ta poprawka wstawi dwa spacje, w których wymagana jest tylko jedna spacja.
Jonathan Leffler
8
zamiast zamiany, możesz zrobić to, co Nick sugerował powyżej - tj. Retab. Spowoduje to przekształcenie wszystkich istniejących kart w liczbę spacji ustawioną w tabstopie.
Gowri
Niesamowita wskazówka! Vim pokazał mi doskonale zidentyfikowany plik, podczas gdy cat (linux cmd) wykazywał nieregularną identyfikację. Właśnie zmieniłem 2 spacje na 4, kiedy używam w Vimie set ts = 4.
karlphillip
60

To działało dla mnie:

możesz zobaczyć zakładki, które najpierw to robią:

:set list

następnie, aby umożliwić zamianę kart, wykonaj następujące czynności:

:set expandtab

następnie

:retab

teraz wszystkie zakładki zostały zastąpione spacjami, dzięki czemu można wrócić do normalnego wyświetlania w następujący sposób:

:set nolist
serup
źródło
1
:set listjest po prostu piękna.
Amir A. Shabani,
44

gg=G powtórzy cały plik i usunie większość, jeśli nie wszystkie karty, które dostaję w plikach od współpracowników.

Jake Sellers
źródło
1
czy zastępuje tabulatory spacjami?
likejudo
1
Niesamowite! Pracował również dla mnie.
Nawaz
1
Czy możesz wyjaśnić, co robi gg = G? zrobiło to dokładnie to, czego szukałem. Mam HTML na wzniosły i kiedy wkleiłem go w vimie, był szalenie wcięty. To teraz wygląda na czyste.
jes516
3
@ jes516 ggprzesuwa kursor na początek bufora. =jest formatem i przyjmuje polecenie ruchu. Gprzesuwa kursor na koniec bufora, dzięki czemu vim formatuje od początku do końca bieżącego bufora.
Jake Sellers
40

Dodaj następujące wiersze do swojego .vimrc

set expandtab
set tabstop=4
set shiftwidth=4
map <F2> :retab <CR> :wq! <CR>

Otwórz plik w vimie i naciśnij F2. Karty zostaną przekonwertowane na 4 spacje, a plik zostanie automatycznie zapisany.

anish
źródło
Prawdopodobnie warto zauważyć, że qzamknie również bieżący bufor pliku. Może to być pożądane lub nie.
Willem van Ketwich,
14

Jeśli chcesz zachować \trówne 8 spacji, rozważ ustawienie:

   set softtabstop=2 tabstop=8 shiftwidth=2

Daje to dwie spacje na <TAB>prasę, ale rzeczywiste \tw kodzie będą nadal wyświetlane jako 8 znaków.

pk.
źródło
Dzięki za wspomnienie softtabstop, myślę, że jedną z funkcji zabójcy.
Martin Ueding,
6

To działało dla mnie:

:set tabstop=2 shiftwidth=2 expandtab | retab
Willem van Ketwich
źródło
4

najpierw wyszukaj tabulatory w swoim pliku: / ^ I: set expandtab: retab

będzie działać.

Shekar
źródło
pierwsza część, czy mógłbyś to wyjaśnić
serup
3

Ten artykuł ma doskonały skrypt vimrc do obsługi tabulatorów + spacji i konwersji między nimi.

Dostępne są następujące polecenia:

Space2Tab Konwertuj spacje na tabulatory, tylko w wcięciach .

Tab2Space Konwertuj tabulacje na spacje, tylko w wcięciach .

RetabIndent Wykonaj Space2Tab (jeśli ustawiono opcję „expandtab”) lub Tab2Space (w przeciwnym razie).

Każde polecenie przyjmuje argument określający liczbę spacji w kolumnie tabulatorów. Domyślnie używane jest ustawienie „tabstop”.

Źródło: http://vim.wikia.com/wiki/Super_retab#Script

" Return indent (all whitespace at start of a line), converted from
" tabs to spaces if what = 1, or from spaces to tabs otherwise.
" When converting to tabs, result has no redundant spaces.
function! Indenting(indent, what, cols)
  let spccol = repeat(' ', a:cols)
  let result = substitute(a:indent, spccol, '\t', 'g')
  let result = substitute(result, ' \+\ze\t', '', 'g')
  if a:what == 1
    let result = substitute(result, '\t', spccol, 'g')
  endif
  return result
endfunction

" Convert whitespace used for indenting (before first non-whitespace).
" what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
" cols = string with number of columns per tab, or empty to use 'tabstop'.
" The cursor position is restored, but the cursor will be in a different
" column when the number of characters in the indent of the line is changed.
function! IndentConvert(line1, line2, what, cols)
  let savepos = getpos('.')
  let cols = empty(a:cols) ? &tabstop : a:cols
  execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
  call histdel('search', -1)
  call setpos('.', savepos)
endfunction

command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)

Pomogło mi to nieco więcej niż odpowiedzi tutaj, kiedy po raz pierwszy szukałem rozwiązania.

Adam Eberlin
źródło
3

expandto narzędzie uniksowe do konwersji tabulatorów na spacje. Jeśli nie chcesz setniczego w vimie, możesz użyć polecenia powłoki z vim:

:!% expand -t8
qwr
źródło
1
jeśli chcesz tylko rozwinąć część kodu: najpierw wybierz tę część w trybie wizualnym, a następnie naciśnij :. Teraz pokazuje się wiersz poleceń vim :'<,'>. Następnie wprowadź !expand -t4tabulację do 4 spacji. ( :'<,'>!expand -t4
Wynikowy