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.