Se ho il seguente testo:
foo
bar
Lo seleziono visivamente e lo copio.
Il testo è ora memorizzato nel registro senza nome "
e qui è il suo contenuto (output di :reg "
):
"" foo^Jbar^J
Secondo questo grafico , sembra che ^J
sia la notazione del punto di inserimento per un avanzamento riga.
Se voglio duplicare il registro senza nome nel a
registro digitando: :let @a = @"
Ecco il suo contenuto (output di :reg a
):
"a foo^Jbar^J
Non è cambiato.
Se ora lo duplico nel registro di ricerca digitando :let @/ = @"
, ecco il suo contenuto (output di :reg /
):
"/ foo^@bar^@
Secondo il grafico precedente, sembra che ^@
sia la notazione con il cursore per un personaggio Null.
Perché un avanzamento riga viene automaticamente convertito in un carattere Null all'interno del registro di ricerca (ma non nel a
registro)?
Se inserisco il registro senza nome nella riga di comando (o all'interno di una ricerca successiva /
), digitando :<C-R>"
, ecco cosa viene inserito:
:foo^Mbar^M
Ancora una volta, secondo l'ultimo grafico, ^M
sembra essere la notazione del punto di inserimento per un ritorno a capo.
Perché un avanzamento riga viene automaticamente convertito in un ritorno a capo sulla riga di comando?
Modifica :
Di solito è possibile inserire un carattere di controllo letterale digitando:
<C-V><C-{character in caret notation}>
Ad esempio, è possibile inserire un valore letterale <C-R>
digitando <C-V><C-R>
.
Puoi farlo apparentemente per qualsiasi personaggio di controllo.
Tuttavia ho notato che non sono in grado di inserire un LF letterale all'interno di un buffer o sulla riga di comando, perché se digito: <C-V><C-J>
inserisce ^@
, un carattere null, anziché ^J
.
È per lo stesso motivo per cui un LF viene convertito in NUL all'interno del registro di ricerca?
Modifica 2 :
In :h key-notation
, possiamo leggere questo:
<Nul> zero CTRL-@ 0 (stored as 10) <Nul>
<NL> linefeed CTRL-J 10 (used for <Nul>)
La stored as 10
parte sulla prima riga e used for <Nul>
sulla seconda riga potrebbe indicare che esiste una sorta di sovrapposizione tra un LF e un NUL e che potrebbero essere interpretati come la stessa cosa. Ma non possono essere la stessa cosa, perché dopo aver eseguito il comando precedente :let @/ = @"
, se digito n
in modalità normale per arrivare alla ricorrenza successiva delle 2 righe foo
e bar
, invece di ottenere una corrispondenza positiva, ho il seguente messaggio di errore:
E486: Pattern not found: foo^@bar^@
Inoltre questo collegamento sembra spiegare che un NUL indica la fine di una stringa, mentre un LF indica la fine di una riga in un file di testo.
E se un NUL è stored as 10
come dice l'aiuto, che è lo stesso codice di un LF, come fa Vim a fare la differenza tra i 2?
Modifica 3 :
Forse un LF e un NUL sono codificati con lo stesso codice decimale 10
, come dice l'aiuto. E Vim fa la differenza tra i 2 grazie al contesto. Se incontra un carattere il cui codice decimale si trova 10
in un buffer o in qualsiasi registro, ad eccezione dei registri di ricerca e comando, lo interpreta come LF.
Ma nel registro di ricerca ( :reg /
) lo interpreta come un NUL perché nel contesto di una ricerca, Vim cerca solo una stringa in cui il concetto di end of line in a file
non ha senso perché una stringa non è un file (il che è strano dal momento che puoi usi ancora l'atomo \n
in un modello cercato, ma forse questa è solo una caratteristica del motore regex?). Quindi interpreta automaticamente 10
come NUL perché è il concetto più vicino ( end of string
≈ end of line
).
E allo stesso modo, nella riga di comando / registro comandi ( :reg :
) interpreta il codice 10
come CR, perché qui il concetto di end of line in a file
non ha senso. Il concetto più vicino è end of command
quindi che Vim interpreta 10
un CR, perché colpire Enter
è il modo di terminare / eseguire un comando e un CR è lo stesso di colpire Enter
, poiché quando si inserisce un valore letterale con <C-V><Enter>
, ^M
viene visualizzato.
Forse l'interpretazione del personaggio il cui codice è 10
cambiato in base al contesto:
- fine riga in un buffer (
^J
) - fine della stringa in una ricerca (
^@
) - fine del comando sulla riga di comando (
^M
)
someFunction(arg1, "")
dove arg 2 era ""
cioè "l'elemento tra le virgolette, che è letteralmente nulla - un" vuoto ". può apparire un NULL, perché è stato" aggiunto "dall'implementazione C sottostante mentre delimitava la stringa. Non lo so come potresti verificarlo - ma ti viene in mente una possibile causa
\r
e la \n
differenza in:substitute
.
NULL
caratteri imprevisti è causato dalla funzione C sottostante che gestisce le stringhe. Questa spiegazione di come C elabora le stringhe che hai collegato spiega che C delimita internamente le stringhe con aNULL
.NULL
s si verificano abbastanza raramente nel testo da renderlo un buon personaggio per questo scopo. Una conseguenza di ciò è che se il programma C (vim) provasse a passare una stringa "vuota" in una funzione C interna