Au niveau le plus élémentaire, il existe déjà une asymétrie entre les parties de recherche et de remplacement :substitute
car la première est une expression régulière et la seconde est du texte, avec des séquences d'échappement supplémentaires spécifiques . Ceci est juste mis en évidence par l'intuition que vous avez sur ce que \n
signifie.
Par exemple, considérez que \n
la recherche ne correspond pas à un littéral \n
. Elle correspond à la fin de la séquence d'octets ligne (EOL), qui peut être \r
, \r\n
ou tout simplement en \n
fonction de la 'fileformat'
de la mémoire tampon.
En ce qui concerne pourquoi \r
est utilisé pour signifier "insérer un EOL", il y a un peu d' histoire derrière cela. Vi n'avait aucun moyen de gérer un octet NUL dans un fichier. Vim a amélioré cela en remplaçant les octets NUL par un octet NL en interne (puisque les chaînes C sont délimitées NUL).
Ce détail d'implémentation s'est infiltré dans le comportement de :substitute
puisque \n
dans le remplacement est simplement inséré dans la représentation interne de cette ligne, qui est utilisée pour indiquer un octet NUL. \r
insère un EOL, brisant la ligne interne en deux. Vim ne stocke pas réellement les octets EOL en mémoire, au lieu de les (dé) sérialiser lors de la lecture / écriture du tampon.
Il ne peut pas être changé maintenant sans casser les nombreux scripts et la mémoire musculaire de nombreux utilisateurs. Heureusement, c'est documenté dans :help sub-replace-special
.
\r
est<CR>
et\n
est<LF>
. Il n'aborde pas la question réelle de savoir pourquoi\n\r
se comporter différemment dans différents contextes.