Jak mogę dodać ciąg na końcu każdej linii w Vimie?

256

Chcę dodać *na końcu każdej linii w Vimie.

Próbowałem kodu bezskutecznie

:%s/\n/*\n/g
Léo Léopold Hertz 준영
źródło
Pozdrawiam nie działa, ponieważ po prawej stronie :s///, \nodpowiada znak NULL. Ta sekcja :help sub-replace-specialjest istotna.
doubleDown

Odpowiedzi:

354

:%s/$/\*/g

powinno działać. Tak powinno, :%s/$/*/gjak słusznie wskazuje MrWiggles .

bezpośrednio
źródło
Czy istnieje sposób wstawienia „ ” w tej samej kolumnie, ponieważ wszystkie linie nie są tej samej długości, więc linia 1 może mieć „ ” w 15 kolumnie, ale linia 2 ma „*” w 25 kolumnie.
Aman Jain
11
jest tylko 1 EOL na linię, więc gflaga jest niepotrzebna.
doubleDown,
Chciałem dodać / na początku każdej linii: 1, $ s / ^ / \ / g działało dla mnie.
farooqsadiq
@dirkgently Jak mogę przekazać zmienną łańcuchową jako argument do tego polecenia (wiesz, zamiast *)?
Matheus Rotta
353

Nawet krótszy niż polecenie: search:

:%norm A*

Oto co to znaczy:

 %       = for every line
 norm    = type the following commands
 A*      = append '*' to the end of current line
Cyber ​​Oliveira
źródło
28
Człowieku, nie istnieje wątek vi ani vim, z którego niczego się nie uczę. Dziś uczę się o normie. I jak mówią na zdrowie, „Norm!”
smcameron
4
Do poprzedzania użyjesz 0i *, 0 prowadzi do początku linii, i dla trybu wstawiania i * dla *. D:
Rob
7
Jako VimGolfer nie mogę nic poradzić na to, że dodaję to, I*zamiast 0i*oszczędzać jeden klawisz.
Jedidiah Hurt
24
Jeszcze jedna wskazówka: Działa to również dla zakresów. Wystarczy podświetlić linie w trybie wizualnym i nacisnąć :, spowoduje to wstępne wypełnienie polecenia, w :'<,'>które można się następnie przekształcić:'<,'>norm A*
Jedidiah Hurt
8
Aby dokonać dodania, użyj Izamiast tego -:%norm I*
Just Lucky Really
42

Również:

:g/$/norm A*

Również:

gg<Ctrl-v>G$A*<Esc>
Brian Carper
źródło
Ahhh ... Drugi może być również używany z wyborem linii. Miły!
Tim Fletcher
Czy mógłbyś wyjaśnić pierwszy przykład?
Cody Poll
@CodyPoll gto globalpolecenie, które robi coś z każdą pasującą linią. $pasuje do każdej linii. Może to być również ^lub .*. norm wykonuje polecenia, których zwykle używasz w trybie poleceń. Tak więc A*środki dołączania *do końca linii.
defhlt
41

Myślę, że użycie trybu blokowania wizualnego jest lepszą i bardziej wszechstronną metodą radzenia sobie z tego typu rzeczami. Oto przykład:

This is the First line.  
This is the second.  
The third.

Aby wstawić „Witaj świecie”. (spacja + schowek) na końcu każdej z tych linii:

  • Na znaku w pierwszym wierszu naciśnij Ctrl-V (lub Ctrl-Q, jeśli Ctrl-V to wklej).
  • Naciśnij jj, aby rozszerzyć blok wizualny na trzy linie.
  • Naciśnij $, aby rozszerzyć blok wizualny na koniec każdej linii. Naciśnij A, a następnie spację, a następnie wpisz Hello world. + następnie Esc.

Wynik to:

This is the First line. Hello world.  
This is the second. Hello world.  
The third. Hello world.  

(przykład z Vim.Wikia.com )

nicole
źródło
3
Zamiast naciskać jjmożna nacisnąć, Gaby przejść do ostatniej linii. Jest to przydatne w dużych plikach, w których naciśnięcie jdo momentu przejścia do ostatniej linii nie jest praktyczne.
nash
Zgadzam się, że blok wizualny jest tutaj najczystszy, również bardziej rozszerzalny
Peter Dolan
Zauważ, że na początku nie wydaje się, żeby działało na wszystkich liniach, ale po naciśnięciu Esc przechodzi i dodaje do wszystkich.
Noumenon,
Blok wizualny powoduje problemy i błędy przy korzystaniu z vima jako rozszerzenia innych rzeczy, takich jak VS Code. W takich przypadkach wyszukiwanie i zamiana, o którą prosi pierwotny użytkownik, jest niezawodną opcją.
Brettins,
upewnij się, że używasz dużej litery A, mała litera „a” nie działa.
Jeff Hoye
14

Jeśli chcesz dodać Hello world na końcu każdej linii:

:%s/$/HelloWorld/

Jeśli chcesz to zrobić dla określonej liczby linii, powiedz, od 20 do 30 użyj:

:20,30s/$/HelloWorld/

Jeśli chcesz to zrobić na początku każdej linii, użyj:

:20,30s/^/HelloWorld/
utkarsh
źródło
6

Tak naprawdę nie potrzebujesz gna końcu. Więc staje się:

:%s/$/*

Lub jeśli chcesz tylko *na końcu, powiedz wiersze 14-18:

:14,18s/$/*

lub

:14,18norm A*
Pedro Norwego
źródło
5

... i do dodania (dodaj początek) każdej linii za pomocą *,

%s/^/*/g
JohnnyCoder
źródło
To nie odpowiada na pytanie.
doubleDown
5

Jedną z opcji jest:

:g/$/s//*

To znajdzie każdą kotwicę końca linii i zastąpi ją *. Mówię „zamiennik”, ale w rzeczywistości jest to raczej dodatek, ponieważ kotwica jest specjalną rzeczą, a nie zwykłą postacią. Aby uzyskać więcej informacji, zobacz Moc g - Przykłady .

paxdiablo
źródło
Co oznacza s // w wyrażeniu regularnym? Znam podobne polecenie: g / / / p, (grep). Jestem prawie pewien, że twoje polecenie jest bliskie mojemu, przynajmniej w strukturze.
Léo Léopold Hertz
1
S jest substytutem - zastępuje zakotwiczenie końca linii gwiazdką (cóż, właściwie nie zastępuje go, ponieważ jest to punkt zakotwiczenia).
paxdiablo
3
:% s / \ n / * \ r / g

Twój pierwszy jest poprawny gdzie indziej, ale z jakiegoś powodu Vim musi mieć inną obsługę nowej linii.


źródło
W mojej wersji Vima \ n działa, ale to po prostu zastępuje nową linię *, skutecznie łącząc linie.
Nathan Fellman
1
To polecenie jest sprawdzone, czy działa poprawnie na każdej wersji Vima, którą wypróbowałem. Używasz wersji Windows czy coś takiego?
1
%s/\s*$/\*/g

to załatwi sprawę i sprawi, że wiodące spacje zostaną zignorowane.

ng.
źródło