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?

Vinko Vrsalovic
źródło
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:

154

Z dokumentów vim na temat wzorów :

\r pasuje do <CR>

\n pasuje do końca linii - Podczas dopasowywania ciągu zamiast tekstu buforowanego dopasowany jest dosłowny znak nowej linii.

pjz
źródło
41
Dla mnie punktem zamieszania jest to, że \ r i \ n oznaczają różne rzeczy, gdy używane są wzorzec wyszukiwania i wzorzec zastępczy.
dlamblin,
3
@dlamblin Yup! Zobacz moją odpowiedź :)
Ograniczone Zadośćuczynienie
206

Od http://vim.wikia.com/wiki/Search_and_replace :

Podczas wyszukiwania

...

\njest znakiem nowej linii, \rjest CR(powrót karetki = Ctrl-M= ^M)

Podczas wymiany

...

\rjest znakiem nowej linii, \njest bajtem pustym ( 0x00).

Ograniczone Zadośćuczynienie
źródło
6
Ta odpowiedź najbardziej mi pomogła. Ponadto, aby uzyskać więcej informacji :h :s%, zwłaszcza ostatni akapit. (via :h :s)
dipnlik,
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.

—☈

rking
źródło
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}


Arystoteles Pagaltzis
źródło
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%)

syockit
źródło