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

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 .


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

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>

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 )


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/

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*


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 .


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.


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.

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.