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)?

saffsd
źródło

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.

Svante
źródło
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).

rampion
źródło
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
59

Do tego służy polecenie: norm (al):

: 10,20 normalny I,
Cyber ​​Oliveira
źródło
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>
wyryć
źródło
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
Albert
źródło
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
wimh
źródło
2

Używam blokowego trybu wizualnego . Umożliwia to wstawianie / edycję wielu linii (inaczej „edycje pionowe”).

ONODEVO
źródło
1
Twój link jest uszkodzony
Christopher Hunter,
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 .
Noe
źródło
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”.

Paolo Tedesco
źródło