Na najbardziej podstawowym poziomie istnieje już asymetria między częściami wyszukiwania i zamiany, :substitute
ponieważ pierwsza z nich jest wyrażeniem regularnym, a druga tekstem, z określonymi dodatkowymi sekwencjami ucieczki . Podkreśla to intuicja, którą dysponujesz \n
.
Weźmy na przykład pod uwagę, że \n
wyszukiwanie nie pasuje do literału \n
. Pasuje na końcu linii (EOL) sekwencja bajtów, które mogą być \r
, \r\n
albo po prostu \n
, stosownie do 'fileformat'
bufora.
Jeśli chodzi o \r
to, co oznacza „wstaw EOL”, kryje się za tym pewna historia . Vi nie miała możliwości obsługi bajtu NUL w pliku. Vim poprawił to, zastępując wewnętrznie bajty NUL bajtem NL (ponieważ łańcuchy C są rozdzielane NUL).
Ten szczegół implementacji wyciekł z zachowania, :substitute
ponieważ \n
w zastępstwie jest po prostu wstawiany do wewnętrznej reprezentacji tej linii, która jest używana do wskazania bajtu NUL. \r
wstawia EOL, przerywając wewnętrzną linię na pół. Vim tak naprawdę nie przechowuje bajtów EOL w pamięci, zamiast (od) serializacji ich podczas odczytu / zapisu bufora.
Nie można go teraz zmienić bez zerwania wielu skryptów i pamięci mięśniowej wielu użytkowników. Na szczęście jest to udokumentowane :help sub-replace-special
.
\r
jest<CR>
i\n
jest<LF>
. Nie odnosi się do faktycznego pytania, dlaczego\n\r
zachowują się inaczej w różnych kontekstach.