Dire che ho una linea con solo un carattere 's', andiamo a vedere \n
s' effetto in diverse circostanze: n e diversi comportamenti della r in circostanze diverse a Vim
:s/s/a\nb
a^@b
:s/s/a\\nb
a\nb
:s/s/a\\\nb
a\^@b
:s/s/a\\\\nb
a\\nb
:echo "a\nb"
a
b
:echo "a\\nb"
a\nb
:echo "a\\\nb"
a\
b
:echo "a\\\\nb"
a\\nb
Allora perchè il \n
comportarsi in modo diverso? Poi vediamo la condizione utilizzando substitute()
:echo substitute(" ", " ", "a\nb", "")
a
b
:echo substitute(" ", " ", "a\\nb", "")
a
b
:echo substitute(" ", " ", "a\\\nb", "")
a
b
:echo substitute(" ", " ", "a\\\\nb", "")
a\nb
Questa volta, \n
è ancora interpretato come "ritorno a capo", ma come spiegare il backslash?
parte successiva, dire che ho ancora una linea con solo un carattere 's', invece di \n
, \r
sta per essere studiato:
:s/s/a\rb
a
b
:s/s/a\\rb
a\rb
:s/s/a\\\rb
a\
b
:s/s/a\\\\rb
a\\rb
s' \r
è come \n
in :echo "a\nb"
, e la regola del backslash è la stessa.
:echo "a\rb"
b
:echo "a\\rb"
a\rb
:echo "a\\\rb"
b\ "This is the most strange case!!!
:echo "a\\\\rb"
a\\rb
Cosa fa in questo caso \r
? E la terza sottocasa è ancora più strana.
:echo substitute(" ", " ", "a\rb", "")
b
:echo substitute(" ", " ", "a\\rb", "")
b
:echo substitute(" ", " ", "a\\\rb", "")
b
:echo substitute(" ", " ", "a\\\\rb", "")
a\rb
Ancora, non riesco a capire come si comporta diversamente il numero di backslash.
La mia domanda è:
- Perché
\n
o\r
comportarsi in modo diverso sotto:substitute
,echo
direttamente esubstitute()
? - Come spiegare il diverso numero di effetti di backslash quando si utilizza
substitute()
? - Quali sono le differenze tra
\n
e\r
in Vim?
Supplemento 1:
se :let s = "a\\\nb"
e poi <C-r>=s
per vederlo in buffer, vedo
a\
b
come spiegare questo?
Risposta impressionante! Ho quasi capito. Si consideri ': echo sostituto (" "," "," a \\\ rb "," ")', perché '" a \\\ rb "' viene interpretato come 'a \ rb' dopo un'interpretazione? Questa interpretazione è dovuta a 'sostituto()'? Non dovrebbe essere 'a \^Mb' dopo un'interpretazione? – fujianjin6471
@ fujianjin6471 Lo è. Ma il significato di '\^M' è per lo più indefinito. Da ': h/\\' Una barra rovesciata seguita da un singolo carattere, senza significato speciale, è riservata per espansioni future. Attualmente '\^M' viene interpretato come un ritorno a capo. Puoi vedere questo se metti '^ M' nel buffer (' ') e poi cerca'/\^M'. E vedi che '^ M' viene abbinato. (Non dipendere da questo comportamento) –
FDinoff
Grazie, ma se I ': let s =" a \\\ nb "' e quindi ' = s' per vederlo nel buffer, vedo qualcosa di veramente inspiegabile. Lo mostro nella domanda. –
fujianjin6471