Jak mogę wstawić tekst w środku linii do wielu linii w Vimie?

91

Powiedzmy, że mam dziesięć wierszy i chcę dodać tekst przed słowem występującym w tych wierszach? Nie musi znajdować się na początku wiersza.

Z:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

do:

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

Jest to również możliwe, aby nie tylko Dołączenie bar(ale faktycznie przestrzennego fooz bar(foo)?

Chciałbym również w szybki sposób dołączyć //komentarze do wielu wierszy (komentarze w stylu C).

Używam Vim / GVim 7.2.

Allen
źródło
1
Komentarze w stylu C to / * * / Komentarze w stylu BCPL to //
William Pursell,

Odpowiedzi:

169

Przejdź do pierwszego foo, naciśnij Ctrl-, vaby przejść do trybu wizualnego blokowania i naciskaj, aż wszystkie linie foozostaną zaznaczone. Następnie naciśnij Shift-, iaby wstawić na początku (bloku). Po zakończeniu i naciśnięciu Escwstawione znaki zostaną dodane do każdego wiersza po lewej stronie zaznaczonego bloku.

Aby wstawić na końcu, naciśnij ponownie Ctrl- v, przesuń w górę / w dół, aby zaznaczyć wszystkie dotknięte linie, a następnie naciśnij Endlub, $aby rozszerzyć zaznaczenie aż do końca linii. Teraz możesz nacisnąć Shift-, aaby dodać na końcu wszystkich wierszy, tak jak poprzednio Shift- i.

Wizualnego wyboru można również dokonać za pomocą zwykłych poleceń ruchu. Aby skomentować cały blok w C, możesz przejść do nawiasu otwierającego i wpisać Ctrl- v % Shift- i // Esc.

sth
źródło
5
Tylko dodatek: jeśli Ctrl-V nie uruchamia trybu blokowania wizualnego w Vimie na Windowsie, należy zamiast tego użyć Ctrl-Q.
Paul
3
Odmianą odpowiedzi then jest oznaczenie bloku wizualnego za pomocą shift + V, a następnie zmiana bloku w trybie ex:: '<,'> s / ^ / prexix_text /: '<,'> s / $ / suffix_text / Note niż "'< , '> "jest drukowane automatycznie przez vima po naciśnięciu": ".
dimba
1
Aby odkomentować, użyj wizualnego bloku (zaznacz Ctrl + V). Jedna kolumna ze znakiem komentarza „//” jest oznaczona przyciskiem „d”, aby usunąć komentarze. nie zapomnij też o komentarzach w C ++ (/ ** /) :)
dimba
9
Warto zauważyć, że w Linuksie musiałem wyjść z trybu wstawiania, zanim przedrostek zastosowany do wszystkich linii, i jest to kapitał, którego potrzebowałem, aby przejść do trybu wstawiania z trybu Visual - tj. Shift + I, wpisz prefix, Escape, Escape.
Joshua Enfield
6
To nie działa na kit. Kiedy naciskam, inic się nie dzieje. Po naciśnięciu shift+izaznaczenie znika, ale mogę wstawić tekst (w bieżącym miejscu, w którym znajduje się tylko kursor).
Jürgen Paul
44

Aby odpowiedzieć na Twoje pierwsze pytanie, poniżej

:%s/foo/bar(&)/g

będzie szukać fooi otoczy dopasowany wzór bar(). /gZrobi to wiele razy w jednej linii.

Ponieważ po prostu dopasowujesz foo, możesz zrobić proste :s/foo/bar(foo)/g. Powyższe zadziała jednak, jeśli zdecydujesz się dopasować na podstawie wyrażenia regularnego, a nie prostego słowa (np f[a-z][a-z].). Znak „&” powyżej oznacza dopasowany element.

Brian Agnew
źródło
Otrzymałem długą, długą odpowiedź z makrami. To jest o wiele łatwiejsze :-)
Brian Ramsay
Jak to zrobić dla wielu linii? W praktyce mamy do czynienia z blokiem kodu składającym się z podobnych wierszy, które wymagają tego podstawienia.
Wygląda na to, że działa we wszystkich wierszach ... zwróć uwagę na:% s i / g.
ojrac
ciekawe jest to, że:% s / foo / bar (&) / gc nie potwierdza - „c” nie ma żadnego skutku..Ugh
1
Tekst między :i sokreśla, na których liniach operuje. Nic nie oznacza tylko aktualnej linii. 1,30oznacza linie od 1 do 30 (włącznie). '<,'>oznacza linie w bieżącej selekcji wizualnej.
rampion
17

Aby poprzedzić zestaw linii, używam jednej z dwóch różnych metod:

Jedną z metod jest wybór bloku (wspomniany przez coś). Ogólnie rzecz biorąc, możesz wybrać prostokątny region ctrl-Vza pomocą ruchu kursora. Po podświetleniu prostokąta naciśnięcie shift-Ispowoduje wstawienie znaków po lewej stronie prostokąta lub shift-Adoda je po prawej stronie prostokąta. Możesz więc użyć tej techniki do utworzenia prostokąta zawierającego skrajną lewą kolumnę linii, które chcesz poprzedzić, naciśnij shift-I, wpisz przedrostek, a następnie naciśnij klawisz Escape.

Innym podejściem jest użycie substytucji (jak wspomniał Brian Agnew). Podstawienie Briana wpłynie na cały plik (% w poleceniu oznacza „wszystkie linie”). Aby wpłynąć tylko na kilka linii, najłatwiejszym podejściem jest uderzenie shift-V(co włącza tryb linii wizualnych) w pierwszej / ostatniej linii, a następnie przejście do ostatniej / pierwszej linii. Następnie wpisz:

:s/^/YOUR PREFIX/

^ To wyrażenie regularne (w tym przypadku początek wiersza). Wpisując to w trybie linii wizualnej, automatycznie zobaczysz „<,”> wstawione przed s. Oznacza to, że zakres zastąpienia będzie wyborem wizualnym.

Dodatkowa wskazówka: jeśli przedrostek zawiera ukośniki, możesz je zmienić za pomocą ukośnika odwrotnego lub możesz użyć innego znaku interpunkcyjnego jako separatora w poleceniu. Na przykład, aby dodać komentarze do linii C ++, zwykle piszę:

:s:^:// :

Aby dodać sufiks, metoda podstawiania jest ogólnie łatwiejsza, chyba że wszystkie linie mają dokładnie taką samą długość. Po prostu użyj $ jako wzorca zamiast ^, a Twój ciąg zostanie dołączony zamiast poprzedzonego.

Jeśli chcesz jednocześnie dodać przedrostek i sufiks, możesz zrobić coś takiego:

:s/.*/PREFIX & SUFFIX/

Znak. * Oznacza całą linię. Znak & w zastąpieniu zwraca dopasowany tekst (całą linię), ale teraz będzie miał dodany przedrostek i sufiks.

BTW: podczas komentowania kodu prawdopodobnie będziesz chciał go później odkomentować. Możesz użyć visual-block ( ctrl-V), aby wybrać ukośniki, a następnie nacisnąć d, aby je usunąć, lub możesz użyć substytucji (prawdopodobnie z wizualną selekcją linii, wykonaną za pomocą shift-V), aby usunąć wiodące ukośniki w następujący sposób:

:s:// ::
Laurence Gonsalves
źródło
6

: normalne na ratunek!

:%norm Wibar(

:%norm WEa)

: norm (al) odtwarza polecenia tak, jakbyś je wpisał:

W - przechodzi do następnego słowa

i - uruchamia tryb wstawiania

bar (- wpisuje sekwencję 'bar ('

Lub w jednej linii:

:%norm Wibar(ctrlvESCEa)

Jeśli używasz systemu Windows, wpisz ctrlqzamiast ctrlv.

Cyber ​​Oliveira
źródło
3

Jeszcze inną możliwością (prawdopodobnie niezbyt przydatną w twoim przypadku testowym, ale przydatną w innych sytuacjach) jest odgrodzenie obszaru, który chcesz zmienić, znakami.

  • Umieść kursor w dowolnym miejscu w górnym wierszu i naciśnij 'a
  • Umieść kursor w dowolnym miejscu ostatniej linii i naciśnij 'b
  • Wydaj polecenie :'a,'b s/foo/bar(&)/

Zwykle lubię tryb blokowania wizualnego, jeśli wszystko jest widoczne na ekranie, i zwykle wolę znaki, jeśli początek i koniec są oddzielone wieloma ekranami.

Godfrey Parke
źródło
Powinien być mzamiast 'ustawiać nowy znacznik. 'służy do przeskakiwania do linii istniejącego znacznika. `przeskakuje do wiersza i kolumny tego znacznika.
tiktak
1

Innym prostym wyrażeniem regularnym jest:

%s/^/<text you want to prepend>/
Artorias2718
źródło
0

W przypadku komentarzy w stylu C użyj odpowiedzi wyrażenia regularnego autorstwa Briana, dopasuj zakończenie linii $i wstaw.

maxwellb
źródło