Wcięcie do następnego poziomu wcięcia za pomocą >>

9

Od czasu do czasu muszę pracować z kodem, który nie jest wcięty do poziomu wcięcia, które mam Vim ustawione na (4 spacje na poziom), zwykle po skopiowaniu / wklejeniu czegoś w pliku. Zwykle robię to z <<i >>. Problem polega na tym, że nie przechodzą do następnego poziomu wcięcia, po prostu dodają lub odejmują 4 spacje.

Jeśli mam taki kod

if condition:
    do this
   do that

robi >>na do thatspowoduje

if condition:
    do this
       do that

Chcę, żeby do tego doszło

if condition:
    do this
    do that

Oprócz łatwego dopasowania wcięcia powyższej linii chcę, aby przeskoczyła na następny poziom wcięcia, nie dodając 4 spacji.

Właśnie to mam w moim .vimrc odnośnie wcięcia

:set tabstop=4 shiftwidth=4 expandtab
Dumitru
źródło
Jeśli masz także filetype plugin indent onswoje .vimrc, zastosowanie będą miały reguły dotyczące wcięć typu pliku (i wtyczki). Czyli sprawdzić, co się tabstopwartość faktycznie jest ( set tabstop?zrobi; samo dla innych ustawień), podczas edycji i zmienić te wartości, dodając wiersz za „po” pliku, coś jak: stackoverflow.com/a/159066/5000478
VanLaser
3
>>i <<odpowiednio dodaj i usuń wcięcie, które nie jest tym, czego chcesz. To, czego chcesz, to „formatowanie”, które odbywa się za pomocą ==.
romainl,
może również mapować, :nnoremap >> ^i<tab><esc>jeśli naprawdę chcesz zachować tabulatory>>
Wolfie,
@romainl ==przejdzie do poziomu wyżej linii. Chociaż dobrze, aby wiedzieć, że nie będzie działać we wszystkich przypadkach Jestem zainteresowany. Jako dodatek na pytanie, co ja chcę to >>i <<wcięcia / dedent aż do następnej wielokrotności shiftwidth od granicy w tym kierunku .
Dumitru,
2
Nie, ==używa albo equalexpralbo equalprgdo sformatowania podanych linii.
romainl,

Odpowiedzi:

12

Podczas korzystania z jednego z poleceń {count}>>, {count}<<, >{motion}lub <{motion}, na niektórych liniach, które zostały już wcięta, a chcesz ich nowy poziom wcięcia być wielokrotnością swojej 'shiftwidth'wartości opcji, można włączyć 'shiftround'opcję i dodać ten wiersz w vimrc:

set shiftround
użytkownik9433424
źródło
2

Jeśli zawsze chcesz >>wciąć do następnego tabstop i <<usunąć do ostatniego tabstop, możesz je ponownie powiązać w następujący sposób:

:nnoremap << ^i<BS><esc>
:nnoremap >> ^i<tab><esc>

Spowoduje to przesunięcie kursora, ale prawdopodobnie możesz zrobić sztuczkę polegającą na zaznaczeniu, aby cofnąć go. ^nie pozostawia m'śladu, ale możesz zostawić je ręcznie wewnątrz wiązania.

Wolfie
źródło