Se eu tiver o seguinte texto:
foo
bar
Eu visualmente seleciono e copio.
O texto está agora armazenado no registro sem nome "
e aqui está o seu conteúdo (saída de :reg "
):
"" foo^Jbar^J
De acordo com este gráfico , parece ^J
ser a notação de sinal de intercalação para um avanço de linha.
Se eu quiser duplicar o registro sem nome no a
registro, digitando: :let @a = @"
Aqui está o conteúdo (saída de :reg a
):
"a foo^Jbar^J
Isso não mudou.
Se agora eu o duplicar no registro de pesquisa, digitando :let @/ = @"
, eis o conteúdo (saída de :reg /
):
"/ foo^@bar^@
De acordo com o gráfico anterior, parece ^@
ser a notação de sinal de intercalação para um caractere nulo.
Por que um feed de linha é automaticamente convertido em um caractere nulo no registro de pesquisa (mas não no a
registro)?
Se eu inserir o registro sem nome na linha de comando (ou dentro de uma pesquisa depois /
), digitando :<C-R>"
, aqui está o que é inserido:
:foo^Mbar^M
Mais uma vez, de acordo com o último gráfico, ^M
parece ser a notação de intercalação para um retorno de carro.
Por que um avanço de linha é automaticamente convertido em retorno de carro na linha de comando?
Editar :
Geralmente, você pode inserir um caractere de controle literal digitando:
<C-V><C-{character in caret notation}>
Por exemplo, você pode inserir um literal <C-R>
digitando <C-V><C-R>
.
Você pode fazer isso para aparentemente qualquer personagem de controle.
No entanto, notei que não consigo inserir um LF literal dentro de um buffer ou na linha de comando, porque se eu digitar: <C-V><C-J>
insere ^@
, um caractere nulo, em vez de ^J
.
É pelo mesmo motivo que um LF é convertido em NUL dentro do registro de pesquisa?
Edição 2 :
Em :h key-notation
, podemos ler o seguinte:
<Nul> zero CTRL-@ 0 (stored as 10) <Nul>
<NL> linefeed CTRL-J 10 (used for <Nul>)
A stored as 10
parte na primeira linha e used for <Nul>
na segunda linha pode indicar que há algum tipo de sobreposição entre um LF e um NUL, e que eles podem ser interpretados como a mesma coisa. Mas eles não podem ser a mesma coisa, porque depois de executar o comando anterior :let @/ = @"
, se eu digitar n
no modo normal para chegar à próxima ocorrência das 2 linhas foo
e bar
, em vez de obter uma correspondência positiva, tenho a seguinte mensagem de erro:
E486: Pattern not found: foo^@bar^@
Além desse link, parece explicar que um NUL denota o final de uma string, enquanto um LF denota o final de uma linha em um arquivo de texto.
E se um NUL é stored as 10
como a ajuda diz, que é o mesmo código que para um LF, como o Vim é capaz de fazer a diferença entre os 2?
Edição 3 :
Talvez um LF e um NUL sejam codificados com o mesmo código decimal 10
, como diz a ajuda. E o Vim faz a diferença entre os 2, graças ao contexto. Se encontrar um caractere cujo código decimal esteja 10
em um buffer ou em qualquer registro, exceto os registros de pesquisa e comando, ele o interpretará como um LF.
Porém, no registro de pesquisa ( :reg /
), ele é interpretado como um NUL porque, no contexto de uma pesquisa, o Vim procura apenas uma sequência em que o conceito de end of line in a file
não faz sentido porque uma sequência não é um arquivo (o que é estranho, pois você pode ainda usa o átomo \n
em um padrão pesquisado, mas talvez isso seja apenas um recurso do mecanismo de expressão regular?). Portanto, ele interpreta automaticamente 10
como um NUL porque é o conceito mais próximo ( end of string
≈ end of line
).
E da mesma maneira, na linha de comando / command register ( :reg :
) ele interpreta o código 10
como um CR, porque o conceito de end of line in a file
não faz sentido aqui. O conceito mais próximo é end of command
que o Vim interpreta 10
como um CR, porque bater Enter
é a maneira de terminar / executar um comando e um CR é o mesmo que bater Enter
, pois quando você insere um literal com <C-V><Enter>
, ^M
é exibido.
Talvez a interpretação do personagem cujo código seja 10
alterado de acordo com o contexto:
- fim de linha em um buffer (
^J
) - fim da string em uma pesquisa (
^@
) - fim do comando na linha de comando (
^M
)
someFunction(arg1, "")
onde arg 2 estava, ""
ou seja, "o item entre aspas, que literalmente não é nada - um" vazio ". um NULL pode aparecer, porque foi" adicionado "pela implementação C subjacente, pois delimitou a string. Não sei como você iria verificar para isso - mas ele vem à mente como uma possível causa.
\r
e a \n
diferença em:substitute
.
NULL
caracteres inesperados é causada pela função C subjacente que está manipulando as seqüências de caracteres. Esta explicação de como C processa seqüências de caracteres às quais você vinculou explica que internamente C delimita seqüências de caracteres com aNULL
.NULL
s ocorrem raramente no texto, o que o torna um bom caractere para esse fim. Uma consequência disto é que, se o programa de C (VIM) tentou transmitir uma "esvaziar" cadeia numa função interna C