Pytanie Wcięcie wielu linii szybko w vi


Powinien być trywialny, a może nawet znajdować się w pomocy, ale nie wiem, jak go nawigować. W jaki sposób mogę wciskać wiele linii szybko w vi?


1969
2017-10-25 03:27


pochodzenie




Odpowiedzi:


Użyj > dowództwo. Aby wprowadzić 5 linii, 5>>. Aby zaznaczyć blok linii i wcięcie go, Vjotjot> wcięcie 3 linii (tylko vim). Aby utworzyć wcięcie klocka z nawiasami klamrowymi, umieść kursor na jednym z nawiasów klamrowych i użyj >%.

Jeśli kopiujesz bloki tekstu i chcesz wyrównać wcięcie bloku w jego nowej lokalizacji, użyj ]str zamiast po prostu str. Spowoduje to wyrównanie wklejonego bloku z otaczającym tekstem.

Ponadto shiftwidth ustawienie pozwala kontrolować ile spacji ma być wciętych.


2324
2017-10-25 03:28



<shift> -v działa również w celu wybrania linii w Vimie. - akdom
Używam> i} (indent inner {} block). Działa w vim. Nie jestem pewien, czy działa w vi. - R. Martinho Fernandes
Moim problemem (w gVim) jest to, że polecenie> wcina znacznie więcej niż 2 spacje (chcę tylko dwa spacje, ale> wcięcie coś jak 5 spacji) - Kamran Bigdely
@Kamran: Zobacz shiftwidth ustawienie sposobu, aby to zmienić. - Greg Hewgill
@MattStevens: Możesz znaleźć rozszerzoną dyskusję na temat tego zjawiska tutaj: meta.stackexchange.com/questions/9731/... - Greg Hewgill


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

W poleceniach poniżej "ponowne wcięcie" oznacza "linie wcięć według twojego" ustawienia wcięć. " shiftwidth jest główną zmienną, która kontroluje wcięcia.

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żesz wymienić { z } lub B, np. =iB jest poprawnym poleceniem wcięcia bloku. Spojrzeć na "Wcięcie bloku kodu" na dobry przykład wypróbowania tych poleceń.

Pamiętaj też o tym

.    Repeat last command

, więc polecenia wcięcia można łatwo i wygodnie powtórzyć.

Ponowne wcięcie pełnych plików

Inną częstą sytuacją jest konieczność wprowadzenia wcięcia 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 3 lines

W trybie wstawiania

Te polecenia dotyczą bieżącego wiersza:

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

Komendy Ex

Są one przydatne, gdy chcesz ucięć określony zakres linii bez przesuwania kursor.

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

Wcięcie za pomocą markerów

Inne podejście to via 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, które regulują wcięcia

Możesz ustawić je w swoim plik .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ęcia oparte na filecie. Spróbuj dodać to do swojego .vimrc:

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

Referencje


887
2018-03-06 17:29



Zarówno ta odpowiedź, jak i ta powyżej, były świetne. Ale dałem +1, ponieważ przypomniał mi o operatorze "kropka", który powtarza ostatnie polecenie. To jest niezwykle użyteczne, gdy trzeba wcięcie całego bloku w kilka obszarów przesuwu (lub wcięć) bez potrzeby ciągłego wciskania >}. Dziękuję bardzo - Amit
5 >> Wcięcie 5 linii: Ta komenda powoduje wcięcie znaku piąty linia, a nie 5 linii. Czy może to być spowodowane moimi ustawieniami VIM, czy też twoje sformułowanie jest nieprawidłowe? - Wipqozn
@Wipqozn - To dziwne. To zdecydowanie wcina następne pięć linii, testowane na Vimie 7.2.330. - ire_and_curses
> 42gg ​​Wcięcie od linii do 42. - Steve
Świetne podsumowanie! Zauważ również, że "wcięcie wewnątrz bloku" i "wcięcie wszystkich bloków" (<i {> a {itd.) Działa również z nawiasami i nawiasami:> a (<i) itd. (I kiedy jestem przy tym, w oprócz <>, działają również z d, c, y itp.) - aqn


Wybór byłby duży

gg=G

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


116
2018-01-20 21:11



Mam plik XML i włączam podświetlanie składni. Pisanie na maszynie gg=G po prostu umieszcza każdą linię zaczynając od pozycji 1. Wszystkie białe spacje zostały usunięte. Czy jest coś szczególnego w XML? - asgs
stackoverflow.com/questions/7600860/... - Johan
Myślę set cindent powinien być w vimrc lub powinien działać :set cindent przed uruchomieniem tego polecenia - Amanuel Nega
Myślę, że najpierw trzeba ustalić cindent. i @asgs myślę, że to działa tylko dla języków programowania Cstyle. - Amanuel Nega


Spróbuj także tego C-wcięcie wcięcie, zrób :help = po więcej informacji:

={

To automatycznie zindentuje bieżący blok kodu, w którym jesteś.

Lub tylko:

==

automatycznie wciskać bieżącą linię.


105
2017-10-25 04:21



nie działa dla mnie, po prostu zrzuca mój kursor do linii powyżej klamry otwierającej "obecnego bloku kodu, w którym się znajduję". - underscore_d


Key-Presses dla bardziej wizualnych ludzi:

  1. Wejdź do trybu poleceń:
    Ucieczka 

  2. Przejdź do początku wcięcia obszaru:
    hjotkl 

  3. Rozpocznij blok:
    v

  4. Przejdź do końca obszaru, aby wprowadzić wcięcie:
    hjotkl 

  5. (Opcjonalnie) Wpisz żądaną liczbę wcięć
    0..9

  6. Wykonaj wcięcie w bloku:
    >


73
2017-10-25 09:16



To jest świetne, ale używa spacji, a nie kart. Każdy możliwy sposób, aby to naprawić? - Shane Reustle
Jeśli używa spacji zamiast tabulacji, to prawdopodobnie dlatego, że masz wcięcia ustawione na spacje. =). - Kent Fredric
Kiedy opcja 'expandtab' jest wyłączona (jest to ustawienie domyślne), Vim używa <Tab> s tak dużo, jak to możliwe, aby zrobić wcięcie. (:: help:>) - Kent Fredric
Jedyne zmienione ustawienie vim związane z zakładką / przestrzenią to: set tabstop = 3. Faktycznie wstawia się to za każdym razem, gdy używam >>: "<tab> <spacja> <spacja>". To samo z wcięciem bloku. Jakieś pomysły? - Shane Reustle
Trzy ustawienia, na które chcesz spojrzeć dla "spacje vs karty" to 1. tabstop 2. shiftwidth 3. expandtab. Prawdopodobnie masz "shiftwidth = 5 noexpandtab", więc "tabulacja" ma 3 spacje, a wcięcie to "5", więc tworzy 5 z 1 zakładką i 2 spacje. - Kent Fredric


Oprócz odpowiedzi już podanej i zaakceptowanej możliwe jest również umieszczenie znacznika, a następnie wcięcie wszystkiego od bieżącego kursora do znacznika. Zatem wprowadź ma gdzie chcesz górną część wciętego bloku, przesuń kursor w dół tak daleko, jak potrzebujesz, a następnie wpisz >'a (zauważ, że "a"można zastąpić dowolną prawidłową nazwę znacznika) .To jest czasami łatwiejsze niż 5>> lub vjjj>.


62
2017-10-25 04:00



To jest naprawdę przydatne. Będę musiał sprawdzić, co z tym wszystkim działa. Znam d'a i y'a, co jeszcze? - user606723
Jest to bardzo przydatne, ponieważ pozwala uniknąć policzenia liczby wierszy, które mają być wcięte. - ziggy


Kapitanem wszystkich poleceń jest
gg=G

To wcina cały plik!

Poniżej znajdują się niektóre proste i eleganckie polecenia używane do szybkiego wcięcia linii w Vimie lub gVim.

Aby wprowadzić wcięcie do bieżącej linii
==

Aby wprowadzić wcięcie wszystkich linii poniżej bieżącej linii

=G

Do wcięcia n linie poniżej bieżącej linii

n==

Na przykład, aby wprowadzić 4 linie poniżej bieżącego wiersza

4==

Aby wprowadzić 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.


60
2018-04-18 18:41



To jest właśnie w to vim, nie vi. - rojomoke
@rojomoke: Nie, działa również w vi - Sagar Jain
Nie w moich pudełkach Solaris i AIX, nie ma tego. Klucz equals zawsze był jednym z moich standardowych zadań makr ad hoc. Jesteś pewien, że nie patrzysz na vim to było związane z jako vi? - rojomoke
Tak, w systemie Linux vi jest prawie zawsze linkiem do vima. Spróbuj uruchomić polecenie: ve w vi. - rojomoke
Uwielbiam tego rodzaju odpowiedzi: jasne, precyzyjne i zwięzłe. Pracowałem dla mnie w Debianie Jessie. Dzięki, @SJain - datelligence


Przejdź na początek tekstu

  • naciśnij v w trybie wizualnym.
  • posługiwać się w górę/na dół strzałka, aby podświetlić tekst.
  • naciśnij = wcięcie wszystkich podkreślonych linii.

29
2017-11-04 22:57





Oprócz oferowanych rozwiązań, lubię robić rzeczy po paragrafach jednocześnie >}


27
2017-10-25 04:08



Tak, i dlatego jedną z moich wielkich siusień są białe przestrzenie na pustej linii: zawstydzają pojęcie "akapitu" Vima. - aqn