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.



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.


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.


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:

[[=]]

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

=%

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 %

16

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

gg=G

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.


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.


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.


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.


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.


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 .



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

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"); 
}

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.