Jak powtórzyć edycję w wielu liniach w Vimie?


122

Zdaję sobie sprawę, że w Vimie często mogę powtórzyć polecenie, po prostu dodając przed nim liczbę. Na przykład można usunąć 5 wierszy przez:

5dd

Często można również określić zakres linii, do których można zastosować polecenie, na przykład

:10,20s:hello:goodbye:gc

Jak mogę przeprowadzić „edycję pionową”? Chciałbym np. Wstawić konkretny symbol, powiedzieć przecinek, na początku (pomijając białe znaki, czyli to, co dostaniesz, jeśli wpiszesz przecinek po Shift-I w trybie poleceń) każdego wiersza w danym zasięg. Jak można to osiągnąć (bez uciekania się do okresu przestoju, okresu przestoju)?

Odpowiedzi:


107

:10,20s/^/,/

Lub użyj makra, nagraj za pomocą:

q a i , ESC j h q

używać z:

@ a

Wyjaśnienie: q arozpoczyna nagrywanie makra do rejestracji a, qkończy nagrywanie. Są rejestry ado zdostępnych dla tego produktu.


Dzięki. A co gdybym chciał odpowiednika shift-i? To znaczy pomijanie początkowych białych znaków?
saffsd

2
Objaśnienie: ^\(\s*\)przechwytuje początkowe białe znaki i zapisuje je w rejestrze, z którego można następnie odczytać \1.
Svante

136

Ctrl- vprzechodzi w tryb wizualny blokowo. Następnie możesz przesuwać ( hjkltak jak zwykle), a jeśli chcesz wstawić coś w wielu wierszach, użyj Shift- i.

Tak więc w przypadku tekstu:

abc123abc
def456def
ghi789ghi

jeśli trafisz Ctrl- vz kursorem na 1, naciśnij jdwukrotnie, aby zejść o dwie kolumny w dół, a następnie Shift- i,ESC, twój tekst będzie wyglądał następująco:

abc,123abc
def,456def
ghi,789ghi

(wstawka wieloliniowa ma niewielkie opóźnienie i nie będzie renderowana, dopóki nie zostanie uderzona ESC).


3
Miły. Ctrl-V oznacza wielkie litery, nawiasem mówiąc, można powiedzieć Ctrl-Shift-v
Svante

8
właściwie jest to CTRL-v lub CTRL-V. Vim nie rozróżnia wielkości liter dla kodów CTRL (zobacz: help CTRL- {char}).
rampion

2
po sprawdzeniu, dlaczego ta metoda nie działa, to dlatego, że używa dużego I (shift-i) zamiast i (również było to tylko ctrl-v, ponieważ ctrl-shift-v przesunęło mnie na koniec)
Willyfrog

4
Jestem ciekawy. Dlaczego po prostu inie używają bez klawisza Shift?
off99555

1
i bez przesunięcia jest wstawiane w bieżącej pozycji. shift + i wstawia się na początku wiersza
Kevin P


44

Jeśli już używasz rozszerzenia „.” aby często powtarzać ostatnie polecenie, to okazało się, że jest to jak dotąd najwygodniejsze rozwiązanie. Umożliwia powtórzenie ostatniego polecenia w każdym wierszu bloku wizualnego za pomocą

" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>

1
Jest to pomocne, ale także ograniczone, ponieważ .działa liniowo w trybie wizualnym. Myślę, że tryb wizualny w tym przypadku może czasami być wygodny do wyboru zakresu linii. Ale w tym przypadku polecenia i makra są bardziej elastyczne i wydajniejsze.
Bohr

23

Uważam, że najłatwiej to zrobić

1) zapisz makro dla jednej linii, nazwij to „a”; w tym przypadku jeden typ

qa I, ESC jq

2) wybierz blok linii, do którego chcesz zastosować makro

3) użyj funkcji „norm”, aby wykonać makro „a” nad tym blokiem linii, tj.

:'<,'>norm@a

17

Myślę, że najłatwiej jest nagrać makro, a następnie powtórzyć je tyle razy, ile chcesz. Na przykład, aby dodać przecinek na początku każdego wiersza, należy wpisać:

q a I , ESC j q

aby powtórzyć to 5 razy, wprowadź

5 @ a


2

Mając już zapisaną edycję w .operatorze, wykonaj następujące czynności:

  1. Wybierz tekst, do którego chcesz zastosować operator, używając trybu wizualnego
  2. Następnie uruchom polecenie :norm .

1

Oprócz makr, jak już odpowiedziałem, dla konkretnego przypadku wstawiania przecinka w zakresie wierszy (powiedzmy od linii 10 do 20), możesz zrobić coś takiego:

:10,20s/\(.*\)/,\1

Oznacza to, że możesz utworzyć numerowaną grupę dopasowaną za pomocą \ (i \) i użyć \ 1 w ciągu zastępującym, aby powiedzieć „zamień na zawartość dopasowania”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.