Jak dodać tekst na końcu każdej linii w Vimie?

116

W Vimie mam następujący tekst:

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

Chciałbym dodać „,” na końcu każdego wiersza. Poprzedni tekst stanie się następujący:

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

Czy ktoś wie, jak to zrobić? Czy można to osiągnąć za pomocą trybu bloków wizualnych?

Grace Shao
źródło
Podobne pytanie tutaj .
glts

Odpowiedzi:

163

To zrobi to dla każdej linii w pliku:

:%s/$/,/

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

Jednym ze sposobów jest dokonanie wizualnego zaznaczenia, a następnie wpisanie :. Wypełni :'<,'>za Ciebie, a następnie wpisz resztę (Zauważ, że wystarczy dodać s/$/,/)

:'<,'>s/$/,/
Alan Curry
źródło
4
W ostatnim wierszu znajduje się dodatkowy ', powinien być :'<,'>s/$/,/.
cjg
dlaczego nie ma potrzeby g? ( :'<,'>s/$/,/g)
Thorbjørn EK Christensen
@ ThorbjørnE.K.Christensen, ponieważ i tak /$/pasuje tylko raz.
Bubaya
157

W rzeczywistości istnieje sposób, aby to zrobić za pomocą trybu bloku Visual. Wystarczy nacisnąć $Aw trybie bloku Visual, aby dołączyć do końca wszystkich wierszy w zaznaczeniu. Dołączony tekst pojawi się we wszystkich wierszach zaraz po naciśnięciu Esc.

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

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

Oznacza to, że w trybie normalnym Visual wybiera akapit vip, przełącza się do trybu blokowania Visual CTRLV, dodaje $Aprzecinek do wszystkich wierszy ,, a następnie Escpotwierdza naciśnięcie .

Dokumentacja jest pod adresem :h v_b_A. Istnieje nawet ilustracją tego, jak to działa w sekcji Przykłady: :h v_b_A_example.

połysk
źródło
1
Nie, to jest standardowy Vim: Wybierz kilka linii w trybie bloku Visual (za pomocą C-V), a następnie przesuń kursor na koniec linii $i dołącz do nich wszystkich A. Pokochasz :h v_b_A, co jest naprawdę dokładne.
glts
1
Och, widzę, co się dzieje! Zwykle używam Ctrl-C zamiast <Esc>, aby wyjść z trybu wstawiania i najwyraźniej z Ctrl-C to nie działa! Jakie to dziwne.
weronika
3
Możesz zapisać naciśnięcie klawisza, używając <C-V>ipzamiast vip<C-V>.
Aaron Thoma
1
@accolade, nie przechodzi w ten sposób w tryb blokowania wizualnego i nie będzie działać. <CV> musi nastąpić później, jeśli zrobisz to w ten sposób.
imagineerTo
@imagineer To dziwne - to dla mnie działa - musi być spowodowane jakąś niedomyślną opcją. (Nie 'virtualedit'- testowałem to.) Potwierdzam, że nie działa w czystym vimie. Dzięki za wiadomość!
Aaron Thoma
44

Inne rozwiązanie, wykorzystujące inną wspaniałą funkcję:

:'<,'>norm A,

Zobacz :help :normal.

romainl
źródło
1
@Swiss, w takim razie spodoba ci się ten komentarz .
romainl
1
@Swiss, możesz także polubić exposé udioca na :normal. Znalazłem to pouczające!
Conner,
1
Nie wiedziałem o tym subreddicie. Dzięki.
romainl
33

tryb ex jest najłatwiejszy:

:%s/$/,

: - enter command mode
% - for every line
s/ - substitute
$ - the end of the line
/ - and change it to
, - a comma
Ned Batchelder
źródło
10

Polecenie zamiany można zastosować do selekcji wizualnej. Zrób wizualny blok na liniach, które chcesz zmienić, a następnie wpisz :i zwróć uwagę, że linia poleceń jest inicjowany tak: :'<,'>. Oznacza to, że polecenie zamiany będzie działać na wizualnym zaznaczeniu, jak na przykład:

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

I to jest podstawienie, które powinno działać w twoim przykładzie, zakładając, że naprawdę chcesz przecinek na końcu każdej linii, jak wspomniałeś. Jeśli są spacje końcowe, może być konieczne odpowiednie dostosowanie polecenia:

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

Spowoduje to zastąpienie dowolnej ilości białych znaków poprzedzających koniec wiersza przecinkiem, skutecznie usuwając końcowe białe znaki.

Polecenia te mogą pracować na różnych liniach, na przykład przez kolejne 5 kierunkach: :,+5s/$/,/albo na cały bufor: :%s/$/,/.

pb2q
źródło
3

Jeśli chcesz dodać „,” na końcu wierszy zaczynających się od „key”, użyj:

:%s/key.*$/&,
kiddorails
źródło
Lub :g/key/s/$/,. Zobacz :help :global.
romainl
2

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

A,<ESC>

A następnie przytrzymaj alt, naciskając kilkakrotnie w dół, aby dodać przecinek na końcu każdego wiersza.
Działa to dobrze, ponieważ pozwala na bardzo dobrą kontrolę nad tym, co robią linie, i nie otrzymuje zmiany.
(Mam również inne strzałki odwzorowane podobnie, aby umożliwić łatwe powtarzanie .)

Oto linia mapowania do wklejenia do twojego vimrc:

map <M-DOWN> <DOWN>.
Sam Brinck
źródło
1
:%s/$/,/g

$ dopasowuje koniec linii

kalhartt
źródło
2
To również wzbogaci $linię, nie tylko ,.
ZyX
2
/gsłuży do wykonywania podstawienia w każdym wystąpieniu w wierszu. Ponieważ jest tylko jeden $w linii, możesz go bezpiecznie upuścić.
romainl
Tak, mój błąd na $. a / g pochodzi z habbit i tak, jest opcjonalne.
kalhartt
1

Do wykonania zadania można również użyć makra.

qqA,^[0jq4@q
dvk317960
źródło