Szybkie wcięcie wielu linii w vi

2158

Powinno to być trywialne i może nawet być pomocne, ale nie mogę wymyślić, jak się nim poruszać. Jak szybko wciąć wiele linii w vi?

Allain Lalonde
źródło

Odpowiedzi:

2551

Użyj >polecenia. Aby wciąć pięć linii, 5>>. Aby zaznaczyć blok linii i wciąć go, Vjj>wciąć trzy linie (tylko Vim). Aby wciąć blok nawiasów klamrowych, umieść kursor na jednym z nawiasów klamrowych i użyj >%lub z dowolnego miejsca wewnątrz bloku >iB.

Jeśli kopiujesz bloki tekstu i chcesz wyrównać wcięcie bloku w nowej lokalizacji, użyj ]pzamiast po prostu p. To wyrównuje wklejony blok do otaczającego tekstu.

To shiftwidthustawienie pozwala także kontrolować liczbę spacji do wcięcia.

Greg Hewgill
źródło
77
Używam> i} (wcięcie wewnętrzny blok {}). Działa w vimie. Nie jestem pewien, czy to działa w vi.
R. Martinho Fernandes,
11
Mój problem (w gVimie) polega na tym, że polecenie> wcina znacznie więcej niż 2 puste miejsca (chcę tylko dwa puste miejsca, ale> wcina coś jak 5 pustych miejsc)
Kamran Bigdely
28
@Kamran: Zobacz shiftwidthustawienie sposobu, aby to zmienić.
Greg Hewgill
4
@MattStevens: Dłuższą dyskusję na temat tego zjawiska można znaleźć tutaj: meta.stackexchange.com/questions/9731/...
Greg Hewgill
5
Często wciskam bloki wizualne wiele razy z rzędu, na przykład naprawiając niektóre tagi wklejone do pliku XML. Zamiast ponownie wybierać blok w trybie wizualnym za każdym razem, można użyć „gv”, aby ponownie użyć ostatniego bloku wizualnego. Odwołanie superuser.com/questions/220666/…
David Mann
958

Ta odpowiedź podsumowuje inne odpowiedzi i komentarze do tego pytania oraz dodaje dodatkowe informacje na podstawie dokumentacji Vima i wiki Vima . Dla zwięzłości, ta odpowiedź nie rozróżnia poleceń specyficznych dla Vi i Vim.

W poniższych poleceniach „ponowne wcięcie” oznacza „wcięcie wierszy zgodnie z ustawieniami wcięcia ”. shiftwidthjest podstawową zmienną kontrolującą wcięcie.

Ogólne polecenia

>>   Indent line by shiftwidth spaces
<<   De-indent line by shiftwidth spaces
5>>  Indent 5 lines
5==  Re-indent 5 lines

>%   Increase indent of a braced or bracketed block (place cursor on brace first)
=%   Reindent a braced or bracketed block (cursor on brace)
<%   Decrease indent of a braced or bracketed block (cursor on brace)
]p   Paste text, aligning indentation with surroundings

=i{  Re-indent the 'inner block', i.e. the contents of the block
=a{  Re-indent 'a block', i.e. block and containing braces
=2a{ Re-indent '2 blocks', i.e. this block and containing block

>i{  Increase inner block indent
<i{  Decrease inner block indent

Można wymienić {z }lub Bna przykład =iBjest poprawnym poleceniem tiret blok. Rzuć okiem na „Wcięcie bloku kodu” na dobry przykład wypróbowania tych poleceń.

Pamiętaj też o tym

.    Repeat last command

, dzięki czemu polecenia wcięcia można łatwo i wygodnie powtarzać.

Ponowne wcięcie kompletnych plików

Inną częstą sytuacją jest konieczność poprawienia wcięć w pliku źródłowym:

gg=G  Re-indent entire buffer

Możesz rozszerzyć ten pomysł na wiele plików:

" Re-indent all your C source code:
:args *.c
:argdo normal gg=G
:wall

Lub wiele buforów:

" Re-indent all open buffers:
:bufdo normal gg=G:wall

W trybie wizualnym

Vjj> Visually mark and then indent three lines

W trybie wstawiania

Te polecenia dotyczą bieżącej linii:

CTRL-t   insert indent at start of line
CTRL-d   remove indent at start of line
0 CTRL-d remove all indentation from line

Polecenia ex

Są one przydatne, gdy chcesz wciąć określony zakres linii bez poruszania kursorem.

:< and :> Given a range, apply indentation e.g.
:4,8>   indent lines 4 to 8, inclusive

Wcięcie za pomocą markerów

Innym podejściem są markery :

ma     Mark top of block to indent as marker 'a'

... przesuń kursor do położenia końcowego

>'a    Indent from marker 'a' to current location

Zmienne rządzące wcięciem

Możesz ustawić je w swoim pliku .vimrc .

set expandtab       "Use softtabstop spaces instead of tab characters for indentation
set shiftwidth=4    "Indent by 4 spaces when using >>, <<, == etc.
set softtabstop=4   "Indent by 4 spaces when pressing <TAB>

set autoindent      "Keep indentation from previous line
set smartindent     "Automatically inserts indentation in some cases
set cindent         "Like smartindent, but stricter and more customisable

Vim ma inteligentne wcięcie oparte na typie pliku. Spróbuj dodać to do swojego .vimrc:

if has ("autocmd")
    " File type detection. Indent based on filetype. Recommended.
    filetype plugin indent on
endif

Bibliografia

ire_and_curses
źródło
13
Zarówno ta odpowiedź, jak i powyższa były świetne. Ale dałem +1, ponieważ przypominało mi to operator kropki, który powtarza ostatnie polecenie. Jest to niezwykle przydatne, gdy trzeba wciąć cały blok w kilka obszarów przesunięcia (lub wcięć) bez konieczności ciągłego naciskania >}. Wielkie dzięki
Amit
1
5 >> Wcięcie 5 linii: To polecenie powoduje wcięcie piątej linii, a nie 5 linii. Czy może to wynikać z moich ustawień VIM, czy może twoje sformułowanie jest nieprawidłowe?
Wipqozn
1
@Wipqozn - To dziwne. Zdecydowanie wcina dla mnie następne pięć linii, przetestowanych na Vimie 7.2.330.
ire_and_curses
8
> 42gg ​​Wcięcie z miejsca, w którym masz do linii 42.
Steve
Świetne podsumowanie! Zauważ też, że „wcięcie w bloku” i „wcięcie w całym bloku” (<i {> a {itd.) Działa również z nawiasami i nawiasami:> a (<i] itd. (I gdy już tu jestem, w oprócz <>, działają również z d, c, y itd.)
aqn

123

Duży wybór to:

gg=G

Jest naprawdę szybki i wszystko jest wcięte ;-)


1
Mam plik XML i włączyłem podświetlanie składni. Wpisywanie gg=Gpowoduje wstawienie każdej linii, zaczynając od pozycji 1. Wszystkie białe spacje zostały usunięte. Czy jest coś jeszcze specyficznego dla XML?
asgs

2
Myślę, że set cindentpowinien być w vimrc lub powinien uruchomić się :set cindentprzed uruchomieniem tego polecenia
Amanuel Nega

3
Myślę, że najpierw trzeba ustawić cindent. i @asgs myślę, że to działa tylko dla języków programowania cstyle.
Amanuel Nega

110

Spróbuj tego również w przypadku wcięcia z wcięciem C. Zrób :help =więcej informacji:

={

Spowoduje to automatyczne wcięcie bieżącego bloku kodu, w którym się znajdujesz.

Lub tylko:

==

aby automatycznie wciąć bieżącą linię.


2
nie działa dla mnie, po prostu zrzuca kursor do linii powyżej otwierającego nawiasu klamrowego „obecnego bloku kodu, w którym jestem”.
underscore_d

79

Kluczowe naciśnięcia dla bardziej wizualnych osób:

  1. Wejdź do trybu poleceń:
    Escape

  2. Przejdź na początek obszaru, aby wciąć:
    hjkl

  3. Rozpocznij blok:
    v

  4. Przejdź na koniec obszaru, aby wciąć:
    hjkl

  5. (Opcjonalnie) Wpisz żądaną liczbę poziomów wcięcia
    0..9

  6. Wykonaj wcięcie na bloku:
    >


2
To świetnie, ale wykorzystuje spacje, a nie tabulatory. Jakiś sposób to naprawić?
Shane Reustle,

12
Jeśli używa spacji zamiast tabulatorów, to prawdopodobnie dlatego, że dla wcięć ustawiono wcięcie. =).
Kent Fredric

4
Kiedy opcja „expandtab” jest wyłączona (jest to ustawienie domyślne), Vim używa <Tab> s jak najwięcej, aby zrobić wcięcie. (: pomoc:>)
Kent Fredric

1
Jedyne ustawienie vima związane z tabulacją / spacją, które zmieniłem to: set tabstop = 3. W rzeczywistości wstawia to za każdym razem, gdy używam >>: „<tab> <space> <space>”. To samo z wcięciem bloku. Jakieś pomysły?
Shane Reustle,

3
Trzy ustawienia, które chcesz sprawdzić dla „spacji vs tabulatorów”, to: 1. tabstop 2. shiftwidth 3. expandtab. Prawdopodobnie masz „shiftwidth = 5 noexpandtab”, więc „tab” to 3 spacje, a poziom wcięcia to „5”, więc składa się z 5 z 1 tab i 2 spacjami.
Kent Fredric

66

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 bieżącej linii
==

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

=G

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

=%

Są to najprostsze, ale potężne polecenia do wcięcia wielu linii.


3
To jest po prostu vimnie vi.
rojomoke

3
Nie działa na moich systemach Solaris lub AIX. Klucz równości zawsze był jednym z moich standardowych przypisań makr ad hoc. Czy na pewno nie patrzysz na vimlink, który został powiązany z vi?
rojomoke

3
Tak, w Linuksie vi prawie zawsze jest linkiem do vima. Spróbuj uruchomić polecenie: ve wewnątrz vi.
rojomoke

4
Uwielbiam tego rodzaju odpowiedzi: jasne, precyzyjne i zwięzłe. Pracował dla mnie w Debian Jessie. Dzięki, @SJain
digitai

1
Ponieważ używam vim, a nie vi, dość psyched, ta odpowiedź jest tutaj. Dzięki.
Dan Nissenbaum

66

Oprócz odpowiedzi już udzielonej i zaakceptowanej, możliwe jest również umieszczenie znacznika, a następnie wcięcie wszystkiego, od bieżącego kursora do znacznika.

Tak więc wpisz, magdzie chcesz górę wciętego bloku, przesuń kursor w dół tak daleko, jak potrzebujesz, a następnie wpisz >'a(zwróć uwagę, że „ a” można zastąpić dowolną prawidłową nazwą znacznika). Czasami jest to łatwiejsze niż 5>>lub vjjj>.


1
To jest naprawdę przydatne. Będę musiał sprawdzić, co z tym wszystkim działa. Wiem d'a i y'a, co jeszcze?
user606723,

2
Jest to bardzo przydatne, ponieważ pozwala uniknąć liczenia, ile wierszy chcesz wciąć.
ziggy

29

Idź na początek tekstu

  • naciśnij, vaby przejść do trybu wizualnego.
  • użyj up/ downstrzałki, aby podświetlić tekst.
  • naciśnij, =aby wciąć wszystkie zaznaczone linie.

28

Oprócz oferowanych rozwiązań, lubię robić różne rzeczy na raz >}


2
Tak, i właśnie dlatego jednym z moich wielkich rękawów są białe przestrzenie na skądinąd pustej linii: przekreślają pojęcie „akapitu” Vima.
aqn

28

Po wybraniu bloku i użyciu >wcięcia następuje jego wcięcie, a następnie powrót do trybu normalnego. Mam to w moim pliku .vimrc:

vnoremap < <gv

vnoremap > >gv

Umożliwia wcięcie zaznaczenia tyle razy, ile chcesz.


17
Aby wciąć zaznaczenie wiele razy, wystarczy nacisnąć. aby powtórzyć poprzednie polecenie.
Sundar - Przywróć Monikę

2
Problem z. w tej sytuacji musisz poruszać palcami. Dzięki rozwiązaniu @ mike (tego samego, którego używam) już masz palce na klawiszu wcięcia i możesz po prostu go uderzać, aby kontynuować wcięcie zamiast przełączania i robienia czegoś innego. Używanie kropki trwa dłużej, ponieważ musisz poruszać rękami i wymaga to więcej przemyślenia, ponieważ jest to druga, inna operacja.
masukomi,

21

Załóżmy, że używasz 2 spacji do wcięcia kodu. Rodzaj:

:set shiftwidth=2
  • Rodzaj v (aby przejść do trybu edycji bloku wizualnego)
  • Przesuń kursor za pomocą klawiszy strzałek (lub za pomocą h/ j/ k/ l), aby podświetlić linie, które chcesz wciąć lub cofnąć wcięcie.

Następnie:

  • Rodzaj > wcięcie raz (2 spacje).
  • Rodzaj 2> dwukrotnie wcięcie (4 spacje).
  • Wpisz 3>trzykrotnie wcięcie (6 spacji).
  • ...
  • Wpisz <unindent raz (2 spacje).
  • Wpisz 2<unindent dwa razy (4 spacje).
  • Rodzaj 3< trzykrotne unindent (6 spacji).
  • ...

Masz pomysł.

( Puste wiersze nie będą wcięte, co moim zdaniem jest miłe. )


Znalazłem odpowiedź w dokumentacji (g) vim dla bloków wcięcia:

:help visual-block
/indent

Jeśli chcesz przeliczyć polecenie, zrób to tuż przed wpisaniem znaku operatora: „v {move-around} 3>” (przesuń wiersze 3 wcięcia w prawo).

John Sonderson
2
Powiedziałbym, że vi / vim jest w większości spójny. Na przykład D nie zachowuje się tak samo jak S i Y! :)
aqn
1
zaczyna się od lewej strony pliku ... nie od aktualnej pozycji bloku
Eliethesaiyan
1
Niesamowite, właśnie tego szukałem (sposób na wstawienie określonej liczby spacji - 4 spacje dla kodu przeceny - aby zastąpić moje normalne wcięcie). W moim przypadku chciałem wciąć określoną liczbę linii w trybie wizualnym, więc shift-v, aby podświetlić linie, a następnie :'<,'>le4wstawić spacje. Dzięki!
Subfuzion
1
Istnieje oczywiście wiele sposobów rozwiązania tego problemu, ale jest to najłatwiejszy do wdrożenia, ponieważ numery wierszy są domyślnie wyświetlane w vimie i nie wymagają matematyki.
HoldOffHunger,
@HoldOffHunger Numery linii nie są domyślnie wyświetlane. Musisz użyć, :set numberaby przełączyć numery linii ( domyślnie są wyłączone ) lub wstawić set numbervimrc.
DryLabRebel
Jest to uciążliwe, ale jest to droga, jeśli formatujesz poza podstawowym VIM (na przykład vim-prettierzamiast domyślnego mechanizmu wcięcia). Użycie w >przeciwnym razie spowoduje królewskie zwiększenie formatowania wykonanego przez Prettiera.
oligofren
Zabawne, uważam to za nieporęczne. To nie jest jedno zadanie! Nauka tej metody ma wiele zastosowań poza wcięciem.
sqqqrly
Uważam to za lepsze niż zaakceptowana odpowiedź, ponieważ widzę, co się dzieje, linie, które wybieram i akcję, którą wykonuję, a nie tylko wpisuję jakieś zaklęcie vim.
user4052054,
3
...co? „wcięcie o 4 spacje”? Nie, to przeskakuje do linii 4, a następnie wcina wszystko od tego do końca pliku, używając aktualnie wybranego trybu wcięcia (jeśli istnieje).
underscore_d
18

Piękno interfejsu użytkownika Vima polega na jego spójności. Polecenia do edycji składają się z polecenia i ruchu kursora. Ruchy kursora są zawsze takie same:

  • Hna górę ekranu, Lna dół, Mna środek
  • n,G aby przejść do wiersza n , Gsam na sam dół pliku, ggna górę
  • naby przejść do następnego wyszukiwania wyszukiwania, Ndo poprzedniego
  • } do końca akapitu
  • % do następnego pasującego nawiasu, w nawiasach lub rodzaju znacznika
  • enter do następnej linii
  • 'xzaznaczyć x, gdzie x jest literą lub inną '.
  • wiele innych, w tym wi Wdla słowa, $lub 0końcówek linii itp., które nie mają tutaj zastosowania, ponieważ nie są ruchami linii .

Aby korzystać z vima, musisz nauczyć się poruszać kursorem i pamiętać repertuar poleceń, takich jak na przykład >wcięcie (i< „wychylenie”).

Tak więc, dla wcięcia linii od pozycji kursora do górnej części ekranu zrobić >H, >Gaby wciąć się w dolnej części pliku.

Jeśli zamiast pisać >H, piszesz , dHusuwasz ten sam blok linii, cHaby go zastąpić itp.

Niektóre ruchy kursora lepiej pasują do określonych poleceń. W szczególności %polecenie jest przydatne do wcięcia całego bloku HTML lub XML. Jeśli plik ma podświetloną składnię ( :syn on), ustaw kursor w tekście znacznika (np. W „i” <div> i wprowadź>% spowoduje wcięcie do zamykającego znacznika </div>.

Oto jak działa Vim: trzeba pamiętać tylko ruchy kursora i polecenia oraz sposób ich mieszania. Tak więc moja odpowiedź na to pytanie brzmiałaby: „przejdź do jednego końca bloku linii, który chcesz wciąć, a następnie wpisz >polecenie i ruch na drugi koniec bloku”, jeśli wcięcie jest interpretowane jako przesunięcie linii, =jeśli wcięcie jest interpretowany jako ładny druk.

Juan Lanus
źródło
2
Powiedziałbym, że vi / vim jest w większości spójny. Na przykład D nie zachowuje się tak samo jak S i Y! :)
aqn
14

Zrób to:

$vi .vimrc

I dodaj tę linię:

autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent

Dotyczy to tylko pliku cpp. Możesz to zrobić dla innego typu pliku, również po prostu modyfikując typ pliku ...

pankaj ukumar
źródło
13

Możesz użyć norm ipolecenia, aby wstawić podany tekst na początku wiersza. Aby wstawić 10 spacji przed wierszami 2-10:

:2,10norm 10i 

Pamiętaj, że na końcu polecenia musi znajdować się spacja - będzie to znak, który chcemy wstawić. Możemy również wciąć wiersz z dowolnym innym tekstem, na przykład, aby wciąć każdy wiersz w pliku za pomocą pięciu znaków podkreślenia:

:%norm 5i_

Lub coś jeszcze bardziej fantazyjnego:

:%norm 2i[ ]

Bardziej praktycznym przykładem jest komentowanie kodu Bash / Python / etc znakiem #:

:1,20norm i#

Aby ponownie użyć wcięcia xzamiast i. Na przykład, aby usunąć pierwsze 5 znaków z każdej linii:

:%norm 5x
Nykakin
źródło
1
zaczyna się od lewej strony pliku ... nie od aktualnej pozycji bloku
Eliethesaiyan
12

Szybki sposób na zrobienie tego przy VISUAL MODEużyciu tego samego procesu co komentowanie bloku kodu.

Jest to przydatne, jeśli nie chcesz zmieniać swoich dyrektyw shiftwidthlub korzystać z nich, seti jest wystarczająco elastyczny, aby pracować z TABS lub SPACES lub dowolną inną postacią.

  1. Ustaw kursor na początku bloku
  2. v, aby przejść do -- VISUAL MODE --
  3. Wybierz tekst, który ma być wcięty
  4. Wpisz, :aby przejść do monitu
  5. Zastąpienie 3 wiodącymi spacjami:

    :'<,'>s/^/ /g

  6. Lub zastąpienie wiodącymi kartami:

    :'<,'>s/^/\t/g

  7. Krótkie wyjaśnienie:

    '<,'> - W obrębie wizualnie wybranego zakresu

    s/^/ /g - Wstaw 3 spacje na początku każdej linii w całym zakresie

    (lub)

    s/^/\t/g- Wstaw Tabna początku każdej linii w całym zakresie

Eric Kigathi
źródło
12

>} lub >{ wcięcie od bieżącego wiersza do następnego akapitu

<}lub <{samo bez wcięcia

jash
źródło
11

Lubię zaznaczać tekst do wcięcia:

  1. przejdź na początek wiersza tekstu, a następnie wpisz ma( ato etykieta ze znaku „m”: może to być dowolna litera)
  2. przejdź do końcowego wiersza tekstu i wpisz mz(ponownie, zmoże to być dowolna litera)
  3. :'a,'z>lub :'a,'z<będzie wcięciem lub osamotnieniem (czy to słowo?)
  4. Voila! Tekst jest przenoszony (puste linie pozostają puste bez spacji)

PS: możesz użyć tej :'a,'ztechniki do zaznaczenia zakresu dla dowolnej operacji (d, y, s /// itd.), W której możesz użyć linii, liczb lub %.

SteveO
źródło
10

:help left

W ex modemożna użyć :leftlub, :leaby wyrównać linie o określoną ilość. W szczególności, :leftbędzie lewo linii zrównują się ze sobą [zakres]. Ustawia wcięcie w wierszach na [wcięcie] (domyślnie 0).

:%le3lub :%le 3 lub :%left3lub :%left 3wyrówna cały plik, wypełniając go trzema spacjami.

:5,7 le 3 wyrówna linie od 5 do 7, wypełniając je trzema spacjami.

:lebez żadnej wartości lub :le 0pozostawi wyrównanie z wypełnieniem 0.

Działa to w Vimie i gVimie.

zundarz
źródło
1
Niesamowite, właśnie tego szukałem (sposób na wstawienie określonej liczby spacji - 4 spacje dla kodu przeceny - aby zastąpić moje normalne wcięcie). W moim przypadku chciałem wciąć określoną liczbę linii w trybie wizualnym, więc shift-v, aby podświetlić linie, a następnie :'<,'>le4wstawić spacje. Dzięki!
Subfuzion
9

Dla mnie rozwiązaniem MacVim (Visual) było wybranie myszy i naciśnięcie „>”, ale po umieszczeniu następujących wierszy w „~ / .vimrc”, ponieważ lubię spacje zamiast tabulatorów:

set expandtab
set tabstop=2
set shiftwidth=2

Przydaje się również możliwość wywoływania MacVima z wiersza poleceń (Terminal.app), więc ponieważ mam następujący katalog pomocnika „~ / bin”, w którym umieszczam skrypt o nazwie „macvim”:

#!/usr/bin/env bash
/usr/bin/open -a /Applications/MacPorts/MacVim.app $@

I oczywiście w „~ / .bashrc”:

export PATH=$PATH:$HOME/bin

MacPorts często ma problemy z „~ / .profile”, więc zmienna środowiskowa PATH może być dość długa.

mda
źródło
9

5== spowoduje wcięcie pięciu linii od bieżącej pozycji kursora.

Możesz więc wpisać wcześniej dowolną liczbę ==. Wciśnie liczbę linii. To jest w trybie poleceń.

gg=G spowoduje wcięcie całego pliku od góry do dołu.

rohitkadam19
źródło
9

Nie znalazłem metody, której używam w komentarzach, więc podzielę się nią (myślę tylko, że Vim):

  1. Esc wejść w tryb poleceń
  2. Przejdź do pierwszego znaku ostatniej linii, którą chcesz wciąć
  3. Ctrl+, Vaby rozpocząć wybór bloku
  4. Przejdź do pierwszego znaku pierwszego wiersza, który chcesz wciąć
  5. Shift+, Iaby przejść do specjalnego trybu wstawiania
  6. Wpisz tyle spacji / tabulatorów, ile potrzebujesz wcięcia (na przykład dwa
  7. Naciśnij Esci spacje pojawią się we wszystkich liniach

Jest to przydatne, gdy nie chcesz zmieniać ustawień wcięć / zakładek vimrc lub zapamiętywać ich w celu zmiany podczas edycji.

Aby cofnąć się, używam tego samego Ctrl+ Vzaznaczenia bloku, aby zaznaczyć spacje i usunąć je za pomocą D.

NickSoft
źródło
9

Nie wiem, dlaczego tak trudno jest znaleźć prostą odpowiedź jak ta ...

Sam musiałem dużo walczyć, żeby to wiedzieć. To jest bardzo proste:

  • Edytuj .vimrcplik w katalogu domowym.
  • Dodaj tę linię

    set cindent
    

    w pliku, w którym chcesz prawidłowo wciąć.

  • W trybie normalnym / trybie poleceń

    10==   (This will indent 10 lines from the current cursor location)
    gg=G   (Complete file will be properly indented)
    
Kamlesh Karwande
źródło
8
:line_num_start,line_num_end>

Na przykład,

14,21> shifts line number 14 to 21 to one tab

Zwiększ symbol „>”, aby wyświetlić więcej kart.

Na przykład,

14,21>>> for three tabs
attaboyabhipro
źródło
1
Istnieje oczywiście wiele sposobów rozwiązania tego problemu, ale jest to najłatwiejszy do wdrożenia, ponieważ numery wierszy są domyślnie wyświetlane w vimie i nie wymagają matematyki.
HoldOffHunger,
@HoldOffHunger Numery linii nie są domyślnie wyświetlane. Musisz użyć, :set numberaby przełączyć numery linii ( domyślnie są wyłączone ) lub wstawić set numbervimrc.
DryLabRebel
7

Często używam Pythona i często muszę przesuwać bloki o więcej niż jedno wcięcie. Możesz to zrobić za pomocą dowolnej metody zaznaczania bloku, a następnie po prostu wprowadź liczbę wcięć, które chcesz przeskoczyć tuż przed>

Na przykład V5j3>trzykrotnie wcina pięć linii - co oznacza 12 spacji, jeśli użyjesz czterech spacji dla wcięć.

John La Rooy
źródło
7

Wcięcie każdej linii w typ pliku, Esca następnie G=gg.

kapil
źródło
6

Jak natychmiast wciąć podświetlony kod w vi za pomocą kilku spacji:

Opcja 1: Wcięcie bloku kodu w vi do trzech spacji w trybie Visual Block:

  1. Wybierz blok kodu, który chcesz wciąć. Zrób to, używając Ctrl+Vtrybu normalnego i przesuwając w dół, aby zaznaczyć tekst. Gdy jest zaznaczone, wprowadź, :aby wydać polecenie blokowi zaznaczonego tekstu.

  2. W wierszu polecenia pojawią się następujące elementy: :'<,'>

  3. Aby ustawić wcięcie na trzy spacje, wpisz le 3i naciśnij klawisz Enter. Oto co się pojawia::'<,'>le 3

  4. Zaznaczony tekst jest natychmiast wcięty do trzech spacji.

Opcja 2: Wcięcie bloku kodu w vi do trzech spacji w trybie linii wizualnej:

  1. Otwórz plik w vi.
  2. Umieść kursor nad kodem
  3. Przejdź do trybu normalnego i naciśnij następujące klawisze:

    Vjjjj:le 3
    

    Interpretacja tego, co zrobiłeś:

    V oznacza zacznij zaznaczać tekst.

    jjjj strzałki w dół o cztery linie, podświetlając cztery linie.

    : mówi vi, że wprowadzisz instrukcję dla podświetlonego tekstu.

    le 3 oznacza wcięty podświetlony tekst w trzech wierszach.

    Wybrany kod jest natychmiast zwiększany lub zmniejszany do wcięcia trzech spacji.

Opcja 3: użyj trybu Visual Block i specjalnego trybu wstawiania, aby zwiększyć wcięcie:

  1. Otwórz plik w vi.
  2. Umieść kursor nad kodem
  3. W trybie normalnym naciśnij następujące klawisze:

    Ctrl+V

    jjjj
    

    (naciśnij klawisz spacji pięć razy)

    Esc Shift+i

    Cały podświetlony tekst jest wcięty o dodatkowe pięć spacji.

Eric Leschinski
źródło
6

Używam selekcji wizualnej w trybie blokowym:

  • Przejdź do przodu bloku, aby się poruszać (u góry lub u dołu).
  • Naciśnij Ctrl+, Vaby przejść do trybu blokowania wizualnego.
  • Nawiguj, aby wybrać kolumnę przed liniami.
  • Naciśnij I( Shift+ I), aby przejść do trybu wstawiania.
  • Wpisz spacje.
  • Prasa Esc. Wszystkie linie zostaną przesunięte.

To nie jest jednozadaniowiec. To działa:

  • W środku linii.
  • Aby wstawić dowolny ciąg we wszystkich liniach.
  • Aby zmienić kolumnę (użyj czamiast I).
  • szarpanie, usuwanie, zastępowanie itp ...
sqqqrly
źródło
Jest to uciążliwe, ale jest to droga, jeśli formatujesz poza podstawowym VIM (na przykład vim-prettierzamiast domyślnego mechanizmu wcięcia). Użycie w >przeciwnym razie spowoduje królewskie zwiększenie formatowania wykonanego przez Prettiera.
oligofren
Zabawne, uważam to za nieporęczne. To nie jest jedno zadanie! Nauka tej metody ma wiele zastosowań poza wcięciem.
sqqqrly
Uważam to za lepsze niż zaakceptowana odpowiedź, ponieważ widzę, co się dzieje, linie, które wybieram i akcję, którą wykonuję, a nie tylko wpisuję jakieś zaklęcie vim.
user4052054,
5
  • W przypadku bloku kodu {}: =+%

  • Dla wybranej linii: Shift+ vwybierz za pomocą klawiszy strzałek w górę / w dół, a następnie naciśnij =.

  • Dla całego pliku: gg+ =+G

Uwaga: „gg” oznacza przejście do wiersza 1, „=” to polecenie wcięcia, a „G” przesuwa kursor na koniec pliku .

Kulamani
źródło
4

Aby wciąć cały plik o cztery:

esc 4G=G
Michał
źródło
3
...co? „wcięcie o 4 spacje”? Nie, to przeskakuje do linii 4, a następnie wcina wszystko od tego do końca pliku, używając aktualnie wybranego trybu wcięcia (jeśli istnieje).
underscore_d