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 ^Jsia la notazione del punto di inserimento per un avanzamento riga.
Se voglio duplicare il registro senza nome nel aregistro 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 aregistro)?
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, ^Msembra 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 10parte 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 nin modalità normale per arrivare alla ricorrenza successiva delle 2 righe fooe 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 10come 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 10in 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 filenon ha senso perché una stringa non è un file (il che è strano dal momento che puoi usi ancora l'atomo \nin un modello cercato, ma forse questa è solo una caratteristica del motore regex?). Quindi interpreta automaticamente 10come 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 10come CR, perché qui il concetto di end of line in a filenon ha senso. Il concetto più vicino è end of commandquindi che Vim interpreta 10un 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>, ^Mviene visualizzato.
Forse l'interpretazione del personaggio il cui codice è 10cambiato 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
\re la \ndifferenza in:substitute .
NULLcaratteri 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.NULLs 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