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?


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/$/,/

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.


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


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

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/$/,/.


3

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

:%s/key.*$/&,

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>.

1
:%s/$/,/g

$ dopasowuje koniec linii


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

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.