Jak naprawić wcięcie całego pliku w Vi?

625

Jakim poleceniem w Vimie jest poprawienie wcięcia wszystkich linii?

Często kopiuję i wklejam kod do zdalnego terminala i wszystko popsuję. Chcę to naprawić za jednym zamachem.

mmcdole
źródło
Podobne: Ponowne wcięcie źle wprowadzonego kodu na Vi SE
kenorb,
8
Lepiej jest zapobiegać niż leczyć. W tym duchu pojawia się ten komentarz. Wykonaj polecenie „: set paste” przed przejściem do trybu wstawiania i wklejeniem kodu ze zdalnego terminala.
Chthonic Project

Odpowiedzi:

1215

=polecenie wcięcia może wykonywać ruchy. Tak, ggaby uzyskać początku pliku, =do tiret, Gdo końca pliku gg=G.

Logan Capaldo
źródło
39
Nigdy nie będę mógł oduczyć się mojego cennego 1G =) Jednym z moich ulubionych jest =% stojący na nawiasie otwierającym. Naprawia wcięcia całego bloku.
PEZ
2
: 0 <powrót> nie jest taki zły, ale gg jest miły. (tak, uczyłem się pierwszy)
Erik Olson
8
Czy mogę wciąć cały plik bez opuszczania bieżącego wiersza?
Fábio Perez
86
@ Fábio: ''(dwa pojedyncze cytaty) zabiera cię z powrotem do miejsca, w którym byłeś, więc gg=G''powinieneś wciąć, a następnie wrócić.
Nemo157,
@ArchimedesTrajano Mac OS jest bardzo stary, polecam wersję HomeBrew; jest znacznie nowszy. Miałem pewne irytujące problemy z vimem Maca. Słyszałem również, że nie powinieneś zadzierać z wbudowanym, więc nie próbuj go aktualizować, chyba że będziesz bardzo ostrożny.
AlexMA
126

Przed wklejeniem do terminala spróbuj, :set pastea następnie :set nopastepo zakończeniu. Spowoduje to wyłączenie automatycznego wcięcia, zawijania linii i innych funkcji, które psują wklejanie.

edit: Powinienem również =zauważyć , że znacznie lepszy wynik niż wcięcie można zwykle uzyskać za pomocą zewnętrznego programu. Na przykład biegam :%!perltidycały czas. astyle, cindentitp. można również użyć. I oczywiście można mapować je na naciśnięcie klawisza i mapować różne na to samo naciśnięcie klawisza, w zależności od typu pliku.

derobert
źródło
5
Możesz ustawić equalprgopcję we wtyczce ftpl, aby użyć =wcięcia zewnętrznego filtra zamiast wcięcia klawisza.
Josh Lee
Istnieje również opcja przypisywania klawiszy pastetoggle, np. : ustaw pt \ p, aby przełączać tryby
michael
Uwaga: w vmlconfig grml klucz pastetoggle jest mapowany na F11
Thomas
Używam formatpgmz porządkiem i astyle, a potem gq. Oto kilka przykładów z mojego .vimrc: au FileType xml set fp=tidy\ -q\ -i\ -xmliau FileType java set fp=/usr/local/bin/astyle\ --mode=java\ --indent=tab
Raffi Khatchadourian
właśnie pobrałem perltidy po przeczytaniu tego, jest o wiele lepszy niż domyślny wcięcie auto vima
Joey Ciechanowicz
29

Jeśli chcesz ponownie wprowadzić blok, w którym się znajdujesz, bez konieczności wpisywania żadnych akordów, możesz:

[[=]]
Andrew Wagner
źródło
1
Przepraszam, że to ożywiam, ale co miałeś na myśli przez akordy? Coords
John P
7
„Akordy” odnoszą się tutaj do poleceń wydawanych przez przytrzymanie jednego klawisza podczas naciskania drugiego, analogicznie do akordów muzycznych, które brzmiały jednocześnie kilkoma dźwiękami. Więc G to shift + g, ^] to ctrl +] i tak dalej. Pisanie zajmuje więcej czasu niż powiązanie z jednym kluczem.
Ralph Giles
Możesz także użyć, =aBktóry w ogóle nie porusza kursorem.
amin
7
Na klawiaturze nordyckiej [[=]]wymaga 5 akordów :(
k4kuz0
29

Panem wszystkich poleceń jest

gg=G

To wcina cały plik!

Poniżej znajdują się niektóre z prostych i eleganckich poleceń używanych do szybkiego wcięcia linii w Vimie lub gVimie.

Wcięcie wszystkich linii poniżej bieżącej linii

=G

Wcięcie bieżącej linii

==

Wcięcie nlinii poniżej bieżącej linii

n==

Na przykład, aby wciąć 4 linie poniżej bieżącej linii

4==

Aby wciąć blok kodu, przejdź do jednego z nawiasów klamrowych i użyj polecenia

=%
Sagar Jain
źródło
17

Do wcięcia plików HTML i XML można użyć schludnej aplikacji / narzędzia, a wcięcie tych plików działa całkiem dobrze.

Prettify plik XML

:!tidy -mi -xml %

Prettify plik HTML

:!tidy -mi -html %
Naga Kiran
źródło
16

naciśnij klawisz Escape, a następnie szybko wpisz poniższe kombinacje:

gg=G
tokhi
źródło
28
Pisałem powoli, nie uwierzysz, co stanie się potem.
k0pernikus
Właśnie udzieliłem odpowiedzi i komentarza, ponieważ było to bezcenne! lol @ k0pernikus
okulary
12

1G=G. To powinno wciąć wszystkie wiersze w pliku. 1Gzabierze Cię do pierwszego wiersza, =rozpocznie automatyczne wcięcie, a ostatni Gzabierze Cię do ostatniego wiersza w pliku.

Amjith
źródło
Lub nawet1gg=G
Biggybi
1G = G naprawił to dla mnie. Niesamowite!
Natus Drew
8

:set pastejest twoim przyjacielem, używam szpachli i ostatecznie kopiuję kod między oknami. Zanim został włączony do :set paste(i :set nopaste) copy / paste dał mi pasuje do tego samego powodu.

Elsporko
źródło
1
Tak, używam również szpachli. : zestaw wklej jest niesamowity
mmcdole
7

W Vimie użyj :insert. Spowoduje to zachowanie całego formatowania i nie spowoduje automatycznego wcięcia. Aby uzyskać więcej informacji help :insert.

Eric Johnson
źródło
7

jeśli nie chcesz używać :set paste, kliknij środkowym przyciskiem myszy, set nopastemożesz także wkleić zawartość schowka:

"*p
"+p

W ten sposób nie musisz wychodzić z trybu normalnego. jeśli musisz wkleić +lub *zależy od tego, jak zaznaczyłeś tekst, zobacz :help quoteplus.

0x89
źródło
4

vim-autoformat formatuje pliki źródłowe przy użyciu zewnętrznych programów specyficznych dla twojego języka, np. klejnot „rbeautify” dla plików Ruby, pakiet npm „js-beautify” dla JavaScript.

Wojtek Kruszewski
źródło
3

W przypadku złożonych plików C ++ vim nie zawsze poprawnie formatuje podczas używania =polecenia filter w vimie . Dlatego w takich sytuacjach lepiej jest użyć zewnętrznego formatera C ++, takiego jak astyle (lub unrustify ), np .:

:%!astyle

Funkcja „=” Vima domyślnie korzysta z wewnętrznego formatera (który nie zawsze działa prawidłowo), ale można go również ustawić za pomocą zewnętrznego formatera, takiego jak astyle, ustawiając go odpowiednio, jak omówiono w tym pytaniu .

Pierz
źródło
1

Aby to zrobić, możesz utworzyć mapowanie.

Ten automatycznie wcina cały plik i nadal utrzymuje kursor w pozycji, w której się znajdujesz:

nmap <leader>ai mzgg=G`z
Sergio D. Márquez
źródło
0

W przypadku edytora vi użyj: insert. Spowoduje to zachowanie całego formatowania i nie wstawi automatycznego wcięcia. Po zakończeniu naciśnij klawisz Escape, aby wyświetlić rzeczywisty sformatowany plik, w przeciwnym razie zobaczysz kilka śmieci. jak ^ ja np .:

public static void main(String[] args) {
^I
^I System.out.println("Some Garbage printed upon using :insert"); 
}
ps2090
źródło
0

Po prostu przejdź do trybu wizualnego w vimie i wybierz z linii od góry do dołu po wybraniu po prostu naciśnij =, Wszystkie wybrane linie zostaną wcięte.

Ramanand Yadav
źródło
Unikałbym tego. Tryb wizualny ma zastosowanie, gdy nie masz pewności co do swoich ruchów, jeśli wiesz, jak uchwycić zestaw znaków, nie ma sensu dodatkowe przejście do trybu wizualnego. Dlaczego ggvG=kiedy możesz gg=G. Jaki był sens uwidocznienia ruchu? Dotyczy to wszystkich działań, które podejmują ruchy.
Alextes