No nível mais básico, já existe uma assimetria entre as partes de pesquisa e substituição, :substitute
porque a primeira é uma expressão regular e a segunda é o texto, com seqüências de escape adicionais específicas . Isso é destacado apenas pela intuição que você tem sobre o que \n
significa.
Por exemplo, considere que \n
na pesquisa não corresponde a um literal \n
. Ele corresponde ao fim da sequência de bytes linha (EOL), que pode ser \r
, \r\n
ou apenas \n
em função da 'fileformat'
do tampão.
Quanto ao porquê \r
de "inserir uma EOL", há um histórico por trás disso. Vi não tinha como lidar com um byte NUL em um arquivo. O Vim melhorou isso, substituindo NUL bytes por um byte NL internamente (desde que as strings C sejam delimitadas por NUL).
Esse detalhe de implementação vazou no comportamento de, :substitute
uma vez que \n
na substituição é simplesmente inserido na representação interna dessa linha, que é usada para indicar um byte NUL. \r
insere uma EOL, quebrando a linha interna em duas. O Vim, na verdade, não armazena os bytes EOL na memória, em vez de (de) serializá-los ao ler / gravar o buffer.
Agora não pode ser alterado sem quebrar os muitos scripts e a memória muscular de muitos usuários. Felizmente, está documentado :help sub-replace-special
.
\r
é<CR>
e\n
é<LF>
. Não aborda a questão real de por que\n\r
se comportar de maneira diferente em contextos diferentes.