Por que uma nova linha para o Vim?

254

Da pergunta Como substituir um caractere por uma nova linha no Vim? . Você precisa usar \ r ao substituir o texto por uma nova linha, como esta

:%s/%/\r/g

Mas, ao substituir o final das linhas e as novas linhas de um personagem, você pode fazer o seguinte:

:%s/\n/%/g 

Que seção do manual documenta esses comportamentos e qual o motivo por trás deles?

Vinko Vrsalovic
fonte
1
Para que serve %ao pesquisar e substituir?
Qd #
7
@qed: por padrão :s, aplicará apenas a substituição na linha atual. :%storna o endereço do arquivo inteiro. Mais .
C24w
3
+ c24w Acho que ele está se referindo ao '%' entre as barras, o primeiro exemplo é o '%' no local da pesquisa e no local de substituição no segundo exemplo, mas @qed para responder à sua pergunta, esses '% são combinados literalmente.
RastaJedi

Respostas:

155

Dos documentos do vim sobre padrões :

\r corresponde a <CR>

\n corresponde a um final de linha - Ao corresponder em uma sequência em vez de texto de buffer, um caractere literal de nova linha é correspondido.

pjz
fonte
41
Para mim, o ponto de confusão é que \ r e \ n significam coisas diferentes quando usadas são o padrão de pesquisa e o padrão de substituição.
precisa saber é o seguinte
3
@dlamblin Yup! Veja minha resposta :)
Expiação limitada
207

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

Ao pesquisar

...

\né nova linha, \ré CR(retorno de carro = Ctrl-M= ^M)

Ao substituir

...

\ré nova linha, \né um byte nulo ( 0x00).

Expiação limitada
fonte
6
Essa resposta me ajudou mais. Além disso, para obter mais informações :h :s%, especialmente o último parágrafo. (via :h :s)
dipnlik
114

Outro aspecto disso é que \0, tradicionalmente NULL, s//\0/entende-se "todo o padrão correspondente". (Que, a propósito, é redundante e mais longo que &).

  • Então você não pode usar \0para significar NULL, então você usa\n
  • Então você não pode \nquerer dizer \n, então você usa \r.
  • Então você não pode \rquerer dizer isso \r, mas eu não sei quem gostaria de adicionar esse caractere de propósito.

rking
fonte
1
Bom ponto! Portanto, este é um hack em torno de \ 0 - referência anterior ao 0 º grupo aninhado - toda a regexp. Esta é uma resposta muito boa, mas me deixa desapontado, que eu não possa usar \ r em substituição ... (ou seja: insira # (13), por exemplo, em um arquivo "normal" (== unol EOLs).
Tomasz Gandor,
3
OK, a resposta está nos documentos do Vim. Apenas escape \ ^ M ou \ <CR>, com uma barra invertida normal. Agradável. ----- <CR> divida a linha em dois neste momento (digite <CR> como CTRL-V <Enter>) s <CR> \ r idem -------- s / \ r \ < CR> inserto um transporte de retorno (CTRL-H) (tipo o <CR> como CTRL-V <Entre>) s / \ <CR>
Tomasz Gandor
16
"Outro aspecto"? Você é muito modesto! Explicar precisamente_por que isso acontece resulta em uma resposta superior a todos que estão apenas dizendo como contornar isso. +1
underscore_d
Honestamente, esse é realmente um ótimo insight sobre o porquê de \ndiferentes significados na pesquisa e na substituição de padrões. Resposta fantástica.
ZeroKnight
47

:help NL-used-for-Nul

Detalhe técnico:

<Nul>caracteres no arquivo são armazenados como <NL>na memória. No visor, eles são mostrados como " ^@". A tradução é feita ao ler e gravar arquivos. Para corresponder a <Nul>um padrão de pesquisa, basta digitar CTRL- @ ou " CTRL-V 000". Provavelmente é exatamente o que você espera. Internamente, o caractere é substituído por um <NL>no padrão de pesquisa. O que é incomum é que digitar CTRL-V CTRL-J também insere a <NL>, assim também procura por um <Nul> no arquivo. {O Vi não pode manipular <Nul>caracteres no arquivo}


Aristóteles Pagaltzis
fonte
10

Primeiro, abra :h :spara ver a seção "4.2 Substituto" da documentação em "Alterar". Aqui está o que o comando aceita:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

Observe a descrição sobre patternestring

Para {pattern}ver |pattern|.
{string}pode ser uma string literal ou algo
especial; veja |sub-replace-special|.

Então agora você sabe que o padrão de pesquisa e os padrões de substituição seguem regras diferentes. Se você seguir o link para |pattern|, ele o levará à seção que explica todos os padrões de regexp usados ​​no Vim.

Entretanto, |sub-replace-special| leva você à subseção de "4.2 Substituto", que contém os padrões de substituição, entre os quais\r a quebra / divisão de linha.

(O atalho para esta parte do manual é :h :s%)

syockit
fonte