2015-12-24 11 views
8

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:

effetto
: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 è:

  1. Perché \n o \r comportarsi in modo diverso sotto :substitute, echo direttamente e substitute()?
  2. Come spiegare il diverso numero di effetti di backslash quando si utilizza substitute()?
  3. 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

2
  1. Sia :echo e substitute(), \n è una nuova riga e \r è un ritorno del carrello. Dovrebbero fare ciò che ti aspetteresti. \n sposta il cursore sulla riga successiva (colonna 1) e \r sposta il cursore sulla colonna 1 stessa riga. Per \r il prossimo carattere che viene stampato sovrascriverà il carattere di stampa precedente. (Sono per lo più concentrato sulla substitute() e :echo, :substitute è al di sotto)

  2. Per il motivo per cui eco e sostitutiva() si comportano in modo diverso. Devi capire quante interpretazioni della stringa stanno accadendo. Per echo ne succede solo uno per sostituto() due.

    :echo substitute(" ", " ", "a\\\rb", "") 
    b 
    :echo substitute(" ", " ", 'a\\\rb', "") 
    b\ 
    

Il secondo è lo stesso di quello che si sarebbe aspettato per eco. Le stringhe tra virgolette hanno il contenuto modificato in base allo :help expr-quote. Ciò significa che sia eco e sostituto vedere la stessa cosa se la stringa viene interpretata sola volta (che sta utilizzando apici)

"a\\\rb" verrà interpretato come a\rb dopo un interpretazione e quindi a<CR>b dopo il secondo. Il che porta a stampare solo b.

  1. \r e \n cambiare a seconda di dove sono utilizzati. L'unica differenza potrebbe essere :substitute dove \r viene utilizzato come una nuova riga nella sostituzione.

Questo è uno dei casi in cui :substitute e substitute() si comportano in modo diverso,

:substitue segue

<CR>  split line in two at this point 
       (Type the <CR> as CTRL-V <Enter>)     s<CR> 
    \r   idem            s/\r 
    ... 
    \n   insert a <NL> (<NUL> in the file) 
       (does NOT break the line)       s/\n 

(<NUL> è lo stesso ^@ che non è la stessa come una nuova riga

mentre substitute() segue

The special meaning is also used inside the third argument {sub} of 
the substitute() function with the following exceptions: 
... 
    - <CR> and \r inserts a carriage-return (CTRL-M). 
... 
+0

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

+0

@ 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

+0

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