Dlaczego nowa linia dla Vima?


253

Z pytania Jak zamienić znak na nowy wiersz w Vimie? . Musisz użyć \ r podczas zastępowania tekstu znakiem nowej linii, takim jak ten

:%s/%/\r/g

Ale zastępując znak końca wiersza i nowego wiersza, możesz to zrobić w następujący sposób:

:%s/\n/%/g 

Która część podręcznika dokumentuje te zachowania i jakie jest ich uzasadnienie?


1
Do czego służy %wyszukiwanie i wymiana?
qed 21.10.2013

7
@qed: domyślnie :szastosuje podstawienie tylko do bieżącej linii. :%ssprawia, że ​​adresuje cały plik. Więcej .
c24w

3
+ c24w Myślę, że odnosi się on do „%” między ukośnikami, pierwszym przykładem jest „%” w lokalizacji wyszukiwania i w lokalizacji zastępowania w drugim przykładzie, ale @qed, aby odpowiedzieć na twoje pytanie, te „%” są dopasowane dosłownie.
RastaJedi

Odpowiedzi:




113

Innym aspektem tego jest to \0, że tradycyjnie NULL s//\0/oznacza „cały dopasowany wzór”. (Nawiasem mówiąc, jest to zbędne i dłuższe niż &).

  • Więc nie możesz używać tego, \0co znaczy NULL, więc używasz\n
  • Więc nie możesz używać tego, \nco znaczy \n, więc używasz\r .
  • Więc nie możesz używać tego \rw znaczeniu \r, ale nie wiem, kto celowo chciałby dodać ten znak.

—☈


1
Słuszna uwaga! To jest hack wokół \ 0 - odwołanie do 0-tej grupy zagnieżdżonej - całe wyrażenie regularne. To jest bardzo dobra odpowiedź, ale rozczarowuje mnie to, że nie mogę użyć \ r zamiast ... (co oznacza: wstaw # (13), na przykład w „normalnym” pliku (== uniksowe EOL).
Tomasz Gandor

3
OK, odpowiedź jest w dokumentach Vima. Wystarczy uciec z \ ^ M lub \ <CR>, używając normalnego ukośnika odwrotnego. Miły. ----- <CR> linia podziału na dwie części w tym punkcie (wpisz <CR> jako CTRL-V <Enter>) s <CR> \ r idem -------- s / \ r \ < CR> wstaw powrót karetki (CTRL-M) (wpisz <CR> jako CTRL-V <Enter>) s / \ <CR>
Tomasz Gandor

16
„Kolejny aspekt”? Jesteś zbyt skromny! Wyjaśnienie dokładnie, dlaczego tak się dzieje, stanowi doskonałą odpowiedź dla wszystkich, którzy tylko mówią, jak to obejść. +1
podkreślenie_d

Jest to naprawdę świetny wgląd w to, dlaczego \nma różne znaczenia w wyszukiwaniu i zastępowaniu wzorców. Fantastyczna odpowiedź.
ZeroKnight

47

:help NL-used-for-Nul

Szczegóły techniczne:

<Nul>znaki w pliku są przechowywane jak <NL>w pamięci. Na wyświetlaczu są pokazane jako „ ^@”. Tłumaczenie odbywa się podczas odczytu i zapisu plików. Aby dopasować do <Nul>wzorca wyszukiwania, wystarczy wpisać CTRL- @ lub „ CTRL-V 000”. Prawdopodobnie właśnie tego oczekujesz. Wewnętrznie znak jest zastępowany <NL>przez wzorzec wyszukiwania. Niezwykłe jest to, że wpisanie CTRL-V CTRL-J również wstawia a <NL>, a więc również szuka a <Nul> w pliku. {Vi w ogóle nie obsługuje <Nul>znaków w pliku}



10

Przede wszystkim otwórz :h :ssekcję „4.2 Zastępowanie” dokumentacji dotyczącej „Zmień”. Oto, co akceptuje polecenie:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

Zwróć uwagę na opis patternistring

Do {pattern}zobaczenia |pattern|.
{string}może być literalnym ciągiem znaków lub czymś
wyjątkowym; zob |sub-replace-special|.

Teraz już wiesz, że wzorzec wyszukiwania i wzorce zastępcze podlegają innym zasadom. Jeśli podążysz za linkiem do |pattern|, przejdziesz do sekcji wyjaśniającej całe wzorce wyrażeń regularnych używanych w Vimie.

Tymczasem |sub-replace-special|przenosi Cię do podsekcji „4.2 Zastępstwo”, która zawiera wzorce zastępowania, wśród których jest\r podziału linii / podziału.

(Skrót do tej części instrukcji to :h :s%)

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.