Jak przesunąć wcięcie wiersza do określonej wartości?

11

Wiele razy natrafiam na sytuację, w której linia nie jest odpowiednio wcięta. Ether przez wklej, źle / nie preferowaną wtyczkę wcięcia lub najczęściej dodatkowe spacje równoważące wartość wcięcia. Zwykle naprawiam to kilka razy <<lub >>kilka razy, aby to naprawić. W przypadku dodatkowych spacji zrobię 100<<wtedy a >>dla każdego poziomu wcięcia, którego naprawdę chcę.

Pytanie jest takie, jak |ruch, który pozwala ustawić kolumnę według numeru, 10|przesyła kursor do 10. kolumny. Jak mogę określić poziom wcięcia?

Przykład (to nie działa) z shiftwidth=4 expandtab:

The quick (indent level 0)
••••Brown Fox (indent level 1)
••••••••••Jumped over the lazy dog (indent level 2 with two extra spaces)

W tym przypadku muszę obecnie policzyć poziom wcięcia ostatniej linii (2) i dodać jeden dla dodatkowych spacji, a następnie wpisać, 3<<a następnie policzyć poziom wcięcia tego, co następnie 1>>(lub użyć autoindenti ==wydać polecenie).

Proszę o coś takiego, 1==aby zmusić wcięcie do uzyskania poziomu wcięcia 1. Lub w niektórych przypadkach 0==do całkowitego usunięcia wcięcia.

Zdaję sobie sprawę, że powyższy przykład wykonuje automatyczne wcięcie 1 lub 0 linii (odpowiednio) i dlatego nie robi tego, co chciałbym, ale mam nadzieję, że pomoże to lepiej zilustrować pytanie.

Sukima
źródło

Odpowiedzi:

18

Możesz użyć :leftpolecenia:

:[range]le[ft] [indent]
Wyrównanie do lewej linii w [range]. Ustawia wcięcie w wierszach na [indent](domyślnie 0). {not in Vi}

Zauważ, że :leftustawia wcięcie na n spacji i nie jest świadomy shiftwidthlub tabstop, więc użycie :left 8spowoduje użycie 8 spacji.

Jeśli chcesz ustawić poziom wcięcia, możesz łatwo zdefiniować polecenie:

command! -nargs=1 Left execute 'left ' . &sw * <args>

Użycie :Left 2spowoduje ustawienie wcięcia na 8 spacji.

Aby zmapować to <Leader>=, możesz użyć:

noremap <expr> <Leader>= ':left ' . str2nr(nr2char(getchar())) * &sw . '<CR>'

Nie jestem pewien, czy jest to najlepszy sposób, ale jest to jedyny sposób, w jaki mogę zarządzać ... \=2spowoduje wcięcie bieżącej linii do 8 spacji i 5\=3wcięcie kolejnych 5 linii do 12 spacji.


Powiązaną wskazówką, która również rozwiązuje problem, jest ustawienie tej shiftroundopcji. Od:help 'shiftround'

Zaokrąglanie wcięcia do wielokrotności 'shiftwidth'. Dotyczy >i < poleceń. CTRL-T i CTRL-D w trybie wstawiania zawsze zaokrągla wcięcie do wielokrotności 'shiftwidth'(jest to zgodne z Vi).

W twoim przykładzie pierwszy <<„zaokrągli” do 8 pól. Twój problem (za pomocą 3<<i wtedy >>) został rozwiązany. I jak mówi strona pomocy, możesz także korzystać <C-d>z trybu wstawiania.

Martin Tournoij
źródło
Niesamowite! Te rozwiązania działają idealnie.
Sukima,