2012-02-15 11 views
33

Domyślne polecenia wcięcia VIM wcięte przez spłaszczone spacjeVim: Wcięcie z jednym odstępem (bez spacji)

np.

Czy istnieje sposób na wcięcie z jednym lub n (gdzie n! = Shiftwidth) przestrzeni (s)?

Jednym ze sposobów, który jest pionowo wybrać kolumnę w bloku z Ctrl+V Następnie I wstawić pionowo i wpisać space i <Esc>. Ale czy istnieje lepszy sposób?

+2

Dlaczego chcesz uniknąć zmiany 'sw'? To właśnie tam jest. – Daenyth

+0

W wizualnym wyborze wiersza '{count}>' będzie wcięte przez '{count} * 'shiftwidth'', podczas gdy w trybie normalnym' {count} 'jest używane do zliczania wierszy, które są wcięte. Być może tego właśnie chcesz. Zauważ, że to samo dotyczy wizualnego wyboru bloku, ale odstępy wstawiane są przed pierwszą kolumną bloku zamiast początkiem linii. – Benoit

Odpowiedz

29

Nie jestem pewien, czy istnieje lepszy sposób. Ale istnieje kilka sposobów, że można to zrobić (co mogę myśleć o tak) ...

Visual Blok Rozwiązanie

jak mówiłeś: naciśnij Ctl-V wybrać linie, które chcesz , naciśnij I, aby wstawić i wprowadź liczbę spacji.

Szukaj

Podobny do powyższego, ale trochę bardziej elastyczny - można skorzystać z z „ust wybierz” polecenia vip lub dowolnego zakresu naprawdę: prasy v lub vip lub co ty, aby wybrać range i typ :s/^/{n spaces} gdzie {n spacji} to liczba spacji, które chcesz wstawić.

Jest to trochę bardziej szczegółowe, ale działa całkiem dobrze dla praktycznie każdego zakresu. Heck, gdybyś chciał zrobić cały plik, mógłbyś zrobić Ctl-A lub co masz (zależny od systemu operacyjnego) i wcięcia całego pliku (lub po prostu pominąć całą rzecz wizualną i po prostu zrobić to tryb poleceń ... jak w :1,$s/^/{n spaces}

pamiętać, że nie muszą zawierać trzeci ukośnik w S /// ponieważ nie stawiają żadnych tagów na końcu.

Globalny

Może chcesz tylko indent linie dopasuj wzorzec Powiedz ... Wszystkie wiersze zawierające foo Nie ma problemu: wpisz :g/foo/s/^/{n spaces}

Global jest szczególnie przydatny, jeśli ma sekcje wielowierszowe o podobnym wzorze. Możesz po prostu uciec do normalnego trybu lądowania i wybrać odpowiednie wiersze i odpowiednio wgrać: :g/foo/norm Vjj:s/^/{n spaces}Ctl-V{Enter}. Nieco bardziej skomplikowany z tym dodatkowym końcem, ale przydatny w pewnych okolicznościach.

Zastosowanie TabStop i shiftwidth

Tak, jeśli robi to dużo - Zrobiłbym :set ts=2 i :set et i :set sw=2 i używać >> i << każdy sposób ...

Zrób Funkcja

Dobra, nadal nie jest wystarczająco krótka iz jakiegoś powodu musisz zrobić to bardzo często i nie możesz znieść problemów zUstawienia, et i ts. Nie ma problemu, po prostu napisać funkcję szybkiego i nadać mu localleader mapowanie:

function! AddSpace(num) range 
    let s:counter = 0 
    let s:spaces = '' 
    while s:counter < a:num 
    let s:spaces .= ' ' 
    let s:counter = s:counter + 1 
    endwhile 
    execute a:firstline .','. a:lastline .'s/^/'. s:spaces 
endfunction 

:map <LocalLeader>i :call AddSpace(3)Ctl-V{enter} 

Może po prostu wiedzieć więcej niż jeden sposób, aby zrobić to lepiej niż tylko znając jeden? Po tym wszystkim, czasem najlepsze rozwiązanie zależy od problemu :)

+0

Pojawia się, gdy używana jest metoda wyszukiwania, puste miejsce (spacele) zostanie wstawione na początku pustych linii. Czy istnieje czysty i sprytny sposób na uniknięcie tego? Zauważyłem również, że potrzebuję wizualnie wybrać blok, a następnie ':', następnie ''<,'> s/^//' dla jednej spacji. Dzięki! – ryanjdillon

+0

+1 do wizualnego rozwiązania blokowego. Jest idealny do szybkich modyfikacji. – verboze

11

Aby zmienić liczbę znaków spacji wstawionych do wcięcia, należy wybrać opcję shiftwidth:

:set shiftwidth = <number> 

spojrzeć tutaj na więcej details.

Możesz również dodać to do swojego pliku .vimrc.

+1

Oszczędza to mnóstwo mojego czasu. Sława! – fruqi

+1

1up. niektóre z sugerowanych rozwiązań nie działają tak, jak twierdzą, bez ustawiania shiftwidth. – yantaq

20

wcięcie blok kodu w vi trzech pomieszczeń o trybie Visual Bloku:

  1. Wybierz blok kodu, który ma wcięcia. Zrób to, używając Ctrl + V w trybie normalnym i strzałek w dół, aby wybrać tekst. Gdy jest zaznaczone, wpisz ":", aby podać polecenie do bloku zaznaczonego tekstu.

  2. Poniższa pojawi się w wierszu poleceń: :'<,'>

  3. Aby ustawić wcięcie do 3 pomieszczeń, typ le 3 i naciśnij Enter. To się pojawia: :'<,'>le 3

  4. Wybrany tekst jest natychmiast wcięty do 3 spacji.

wcięcie blok kodu w vi trzech pomieszczeń o trybie Visual Line:

  1. Otwórz plik w VI.
  2. Umieść kursor nad pewnym kodem
  3. być w trybie normalnym następujących klawiszy:

    Vjjjj:le 3 
    

interpretacji co zrobiłeś:

V środki rozpocząć zaznaczanie tekstu.

jjjj Strzałki w dół 4 linie, podświetlając 4 linie.

: mówi vi wprowadzisz instrukcję podświetlonego tekstu.

le 3 oznacza wcięcie podświetlonego tekstu 3 linie.

+0

To jest niesamowite, z wyjątkiem ... gdy jest pusty wiersz, wstawia puste miejsca. W każdym razie, aby tego uniknąć? – ryanjdillon

+0

To jest lepsza odpowiedź. Wybrana odpowiedź była zbyt skomplikowana, a w tej odpowiedzi opcja 1 "Twoje rozwiązanie blokowania wizualnego" nie działa na większości systemów. – user1271772

+5

Nie zgadzam się, ponieważ rozwiązanie z wcięciem ': le 3' od lewego marginesu (kolumna 1/0), ale myślę, że OP chciał (dalej) wgrać blok tekstu z pozycji, w której był. Na przykład, aby lepiej wyrównać pionowy kod/tekst, który został autoindentowany zaledwie o kilka spacji w porównaniu do lepszej pozycji. –

3

Marks Place („a” i „b”) pomiędzy kodem chcesz wciąć:

<position cursor at top of block> 
m a 
<position cursor at bottom of block> 
m b 

wykonaj polecenie zastąpić tak, że każdy znak nowej linii między znakami zastępuje się liczbą miejsc żądanej (w tym przykładzie 2 pola):

:'a,'bs/^/ /g 
0

miałem dedent o danej liczbie miejsc, amount wewnątrz skryptu vim. To zadziałało:

let sw_setting = &shiftwidth 
    set shiftwidth=1 
    exe "normal v" . amount . "<" 
    let &shiftwidth = sw_setting 

Efektem ubocznym jest resetowanie ostatniego wyboru trybu wizualnego. Zamiast tego możesz edytować linię exe... tak, aby wykonywała "< <" powtórzoną amount razy w trybie normalnym. To znaczy: zamiast normal v3<, zmień wartość na normal <<<<<<, jeśli amount ma wartość 3.

Powiązane problemy