Si tengo el siguiente texto:
foo
bar
Lo selecciono visualmente y lo copio.
El texto ahora se almacena en el registro sin nombre "
y aquí está su contenido (salida de :reg "
):
"" foo^Jbar^J
Según este gráfico , parece ^J
ser la notación de intercalación para un avance de línea.
Si quiero duplicar el registro sin nombre en el a
registro escribiendo: :let @a = @"
Aquí está su contenido (salida de :reg a
):
"a foo^Jbar^J
No ha cambiado.
Si ahora lo duplico en el registro de búsqueda escribiendo :let @/ = @"
, aquí está su contenido (salida de :reg /
):
"/ foo^@bar^@
Según el gráfico anterior, parece ^@
ser la notación de intercalación para un carácter nulo.
¿Por qué un salto de línea se convierte automáticamente en un carácter nulo dentro del registro de búsqueda (pero no en el a
registro)?
Si inserto el registro sin nombre en la línea de comando (o dentro de una búsqueda después /
), al escribir :<C-R>"
, esto es lo que se inserta:
:foo^Mbar^M
Una vez más, según el último cuadro, ^M
parece ser la notación de intercalación para un retorno de carro.
¿Por qué un salto de línea se convierte automáticamente en un retorno de carro en la línea de comando?
Editar :
Por lo general, puede insertar un carácter de control literal escribiendo:
<C-V><C-{character in caret notation}>
Por ejemplo, puede insertar un literal <C-R>
escribiendo <C-V><C-R>
.
Puedes hacerlo por aparentemente cualquier personaje de control.
Sin embargo, me di cuenta de que no puedo insertar un LF literal dentro de un búfer o en la línea de comando, porque si escribo: <C-V><C-J>
inserta ^@
un carácter nulo en lugar de ^J
.
¿Es por la misma razón que un LF se convierte en NUL dentro del registro de búsqueda?
Edición 2 :
En :h key-notation
, podemos leer esto:
<Nul> zero CTRL-@ 0 (stored as 10) <Nul>
<NL> linefeed CTRL-J 10 (used for <Nul>)
La stored as 10
parte en la primera línea y used for <Nul>
en la segunda línea podría indicar que hay algún tipo de superposición entre un LF y un NUL, y que podrían interpretarse como la misma cosa. Pero no pueden ser lo mismo, porque después de ejecutar el comando anterior :let @/ = @"
, si escribo n
en modo normal para llegar a la siguiente aparición de las 2 líneas foo
y bar
, en lugar de obtener una coincidencia positiva, tengo el siguiente mensaje de error:
E486: Pattern not found: foo^@bar^@
Además, este enlace parece explicar que un NUL denota el final de una cadena, mientras que un LF denota el final de una línea en un archivo de texto.
Y si un NUL es stored as 10
como dice la ayuda, que es el mismo código que para un LF, ¿cómo puede Vim hacer la diferencia entre los 2?
Edición 3 :
Tal vez un LF y un NUL están codificados con el mismo código decimal 10
, como dice la ayuda. Y Vim marca la diferencia entre los 2 gracias al contexto. Si encuentra un carácter cuyo código decimal está 10
en un búfer o en cualquier registro, excepto los registros de búsqueda y comando, lo interpreta como un LF.
Pero en el registro de búsqueda ( :reg /
) lo interpreta como un NUL porque en el contexto de una búsqueda, Vim solo busca una cadena donde el concepto de end of line in a file
no tiene sentido porque una cadena no es un archivo (lo cual es extraño ya que puede todavía usa el átomo \n
en un patrón buscado, pero ¿tal vez eso sea solo una característica del motor de expresiones regulares?). Por lo tanto, se interpreta automáticamente 10
como un NUL porque es el concepto más cercano ( end of string
≈ end of line
).
Y de la misma manera, en la línea de comando / registro de comando ( :reg :
) interpreta el código 10
como un CR, porque el concepto de end of line in a file
no tiene sentido aquí. El concepto más cercano es end of command
que Vim interpreta 10
como un CR, porque golpear Enter
es la forma de finalizar / ejecutar un comando y un CR es lo mismo que golpear Enter
, ya que cuando inserta uno literal con <C-V><Enter>
, ^M
se muestra.
Tal vez la interpretación del personaje cuyo código es 10
cambia según el contexto:
- fin de línea en un buffer (
^J
) - fin de cadena en una búsqueda (
^@
) - fin del comando en la línea de comando (
^M
)
someFunction(arg1, "")
donde arg 2 era, ""
es decir, "el elemento entre las comillas, que literalmente no es nada: un" vacío ". Puede aparecer un NULL, porque fue" agregado "por la implementación subyacente de C ya que delimitó la cadena. No sé cómo le gustaría comprobar esto - pero viene a la mente como una posible causa.
\r
y la \n
diferencia en:substitute
.
NULL
caracteres inesperados es causada por la función C subyacente que maneja las cadenas. Esta explicación de cómo C procesa las cadenas a las que se vinculó explica que internamente C delimita las cadenas con aNULL
.NULL
s ocurren raramente en el texto lo suficiente como para que sea un buen personaje para este propósito. Una consecuencia de esto es que si el programa C (vim) intentó pasar una cadena "vacía" a una función interna C