2012-07-03 12 views
61

Mam w Vim następujący tekst.Jak dodać tekst na końcu każdej linii w Vimie?

key => value1 
key => value2 
key => value1111 
key => value12 
key => value1122222 

Chciałbym dodać "," na końcu każdej linii. Poprzedni tekst będzie następujący:

key => value1, 
key => value2, 
key => value1111, 
key => value12, 
key => value1122222, 

Czy ktoś wie, jak to zrobić? Czy można to wykorzystać do tworzenia bloków wizualnych?

+0

Podobne pytanie [tutaj] (http://stackoverflow.com/questions/594448/how-can-i-add-to-the-end-of-each-line-in-vim). – glts

+0

Jednym z powodów, dla których kocham vim ... Więcej niż jeden sposób robienia rzeczy, a wszystkie one są skuteczne i wyglądają elegancko. – 0xc0de

Odpowiedz

103

Będzie to zrobić na każdej linii w pliku:

:%s/$/,/ 

jeśli chcesz Wykonaj podzbiór wierszy zamiast całego pliku, możesz określić je zamiast nazwy %.

Jednym ze sposobów jest wybór wizualny, a następnie wpisz :. Będzie wypełnić :'<,'> dla Ciebie, a następnie wpisać resztę nim (Zauważ, trzeba tylko dodać s/$ /, /)

:'<,'>s/$/,/ 
+4

Ostatni wiersz ma dodatkowe '' ', powinno być': '<,'> s/$ /,/'. – cjg

16

tryb ex najłatwiej:

:%s/$/, 

: - enter command mode 
% - for every line 
s/ - substitute 
$ - the end of the line 
/- and change it to 
, - a comma 
1
:%s/$/,/g 

$ dopasowuje koniec linii

+2

To spowoduje dodanie '$' również do linii, a nie tylko ','. – ZyX

+2

'/ g' służy do wykonywania podstawień przy każdym wystąpieniu w linii. Ponieważ istnieje tylko jeden '$' w linii, możesz bezpiecznie go upuścić. – romainl

+0

Tak, mój błąd w sprawie, $. a/g pochodzi od habbita i tak jest opcjonalne. – kalhartt

10

Komenda substytutem może być zastosowany do selekcji wizualnej. Zrób wizualny blok na liniach, które chcesz zmienić, i wpisz : i zauważ, że linia poleceń została zainicjalizowana w następujący sposób: :'<,'>. Oznacza to, że polecenie substytutem będzie działać na selekcji wizualnej, tak:

:'<,'>s/$/,/ 

I to jest substytucja, które powinny pracować na swoim przykładzie, zakładając, że naprawdę chcesz przecinek w koniec każdej linii jak już wspomniałeś. Jeśli istnieją spacje, to może trzeba dostosować komendy odpowiednio:

:'<,'>s/\s*$/,/ 

ten zastąpi dowolną ilość białych znaków poprzedzających koniec linii z przecinkiem, skutecznie usuwając końcowe spacje.

Te same polecenia mogą działać w zakresie linii, np. dla następnych 5 linii: :,+5s/$/,/ lub dla całego bufora: :%s/$/,/.

34

Innym rozwiązaniem, używając Kolejną wielką cechą:

:'<,'>norm A, 

Zobacz :help :normal.

+6

Podobają mi się te odpowiedzi, które pokazują mniej znaną cechę vima. – Swiss

+0

@Swiss, spodoba ci się [ten komentarz] (http://stackoverflow.com/questions/11303032/how-to-add-text-at-the-end-of-the-each-line-in-vim/ 11305004 # comment14879144_11306510), a następnie. – romainl

+0

@Swiss, możesz również polubić [exposé udioca] (http://www.reddit.com/r/vimgolf/comments/wmtep/abusing_macros_part_1_normal/) na ': normal'. Znalazłem to pouczające! – Conner

3

Jeśli chcesz dodać „” na końcu linii zaczynających się od «klucza», należy:

:%s/key.*$/&, 
+0

Lub ': g/key/s/$ /,'. Zobacz ': help: global'. – romainl

102

Jest to w istocie sposób to zrobić przy użyciu trybu Visual bloku. Po prostu naciśnięcie klawisza $A w trybie bloków wizualnych dołącza do końca wszystkich linii w zaznaczeniu. Dołączony tekst pojawi się we wszystkich liniach, gdy tylko naciśniesz Esc.

Więc jest to możliwe rozwiązanie:

vip<C-V>$A,<Esc> 

Oznacza to, że w trybie normalnym, Visual wybrać paragraf vip, przełączyć się na trybie Visual bloku CTRLV, dołącz do wszystkich liniach $A przecinkami ,, a następnie naciśnij Esc, aby potwierdzić.

Dokumentacja znajduje się na :h v_b_A. Istnieje nawet ilustracja tego, jak to działa w sekcji przykładów: :h v_b_A_example.

+0

Huh, nie działa dla mnie ... Nowa funkcja w wersji nowszej niż 7.2? Brzmi nieźle. – weronika

+1

Nie, to jest standardowe Vim: Wybierz kilka linii w trybie bloków wizualnych (za pomocą 'C-V'), a następnie przesuń kursor na koniec wiersza' $ 'i dołącz do nich wszystkie' A'. Pokochasz [': h v_b_A'] (http://vimdoc.sourceforge.net/htmldoc/visual.html#v_b_A), który jest naprawdę dokładny. – glts

+1

Och, rozumiem, co się dzieje! Zwykle używam Ctrl-C zamiast , aby wyjść z trybu wstawiania i najwyraźniej z Ctrl-C to nie działa! Jakie dziwne. – weronika

1

Mam <M-DOWN> (strzałka w dół) zmapowane do <DOWN>., dzięki czemu mogę bardzo szybko powtórzyć ostatnie polecenie z serii linii. z tego odwzorowania mogę:

A,<ESC> 

a następnie przytrzymaj alt, naciskając jednocześnie wielokrotnie dołączyć przecinek na końcu każdej linii.
To działa dobrze, ponieważ pozwala bardzo dobrze kontrolować, co linie robią i nie otrzymują zmiany.
(Mam też inne strzały odwzorowany, podobnie jak pozwalają na łatwe powtarzanie .)

Oto linia mapowanie wkleić do swojej vimrc:

map <M-DOWN> <DOWN>. 
Powiązane problemy