Auf der grundlegendsten Ebene besteht bereits eine Asymmetrie zwischen dem Suchen und Ersetzen von Teilen, :substitute
da ersterer ein regulärer Ausdruck und letzterer Text mit bestimmten zusätzlichen Escape-Sequenzen ist . Dies wird nur durch die Intuition hervorgehoben, die Sie darüber haben, was \n
bedeutet.
Angenommen, \n
die Suche stimmt nicht mit einem Literal überein \n
. Es stimmt mit dem Ende der Zeile (EOL) Bytefolge, die können \r
, \r\n
oder einfach in \n
Abhängigkeit von der 'fileformat'
des Puffers.
Was \r
"Einfügen einer EOL" betrifft, so steckt dahinter eine gewisse Geschichte . Vi hatte keine Möglichkeit, ein NUL-Byte in einer Datei zu verarbeiten. Vim verbesserte dies, indem intern NUL-Bytes durch NL-Bytes ersetzt wurden (da C-Strings durch NUL begrenzt sind).
Dieses Implementierungsdetail hat das Verhalten von verloren, :substitute
da es \n
beim Ersetzen einfach in die interne Darstellung dieser Zeile eingefügt wird, die zum Anzeigen eines NUL-Bytes verwendet wird. \r
Fügt eine EOL ein und teilt die interne Linie in zwei Teile. Vim speichert die EOL-Bytes nicht im Speicher, sondern (de) serialisiert sie beim Lesen / Schreiben des Puffers.
Es kann jetzt nicht mehr geändert werden, ohne die vielen Skripte und das Muskelgedächtnis vieler Benutzer zu zerstören. Zum Glück ist es in dokumentiert :help sub-replace-special
.
\r
ist<CR>
und\n
ist<LF>
. Es bezieht sich nicht auf die eigentliche Frage, warum\n\r
verhalten sich unterschiedlich in unterschiedlichen Kontexten.