2015-12-24 4 views
8

sagen, dass ich eine Zeile mit nur einem Zeichen ‚s‘ haben, lassen Sie uns \n ‚s Wirkung unter verschiedenen Umständen sehen gehen: n und unterschiedliche Verhaltensweisen des r unter verschiedenen Umständen in 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 

Warum tut \n sich anders verhalten? Dann ist die Bedingung 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 

Dieses Mal mit sehen lassen, ist \n noch als „Newline“ interpretiert, aber wie die Backslash erklären?

Nächster Teil, sage ich immer noch eine Zeile mit nur einem Zeichen 's' haben, statt \n, \r untersucht werden soll:

:s/s/a\rb 
a 
b 
:s/s/a\\rb 
a\rb 
:s/s/a\\\rb 
a\ 
b 
:s/s/a\\\\rb 
a\\rb 

\r ‚s-Effekt ist wie \n in :echo "a\nb" und Die Regel des umgekehrten Schrägstrichs ist die gleiche.

:echo "a\rb" 
b 
:echo "a\\rb" 
a\rb 
:echo "a\\\rb" 
b\ "This is the most strange case!!! 
:echo "a\\\\rb" 
a\\rb 

Was \r in diesem Fall nicht tun? Und der dritte Teil ist noch seltsamer.

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

Noch kann ich nicht verstehen, wie unterschiedliche Anzahl von Backslashes verhalten.

Meine Frage lautet:

  1. Warum \n oder \r verhalten sich anders unter :substitute, echo direkt und substitute()?
  2. Wie erklärt man die unterschiedliche Anzahl von Backslashes bei Verwendung von substitute()?
  3. Was sind die Unterschiede zwischen \n und \r in Vim?

Beiblatt 1:

wenn ich :let s = "a\\\nb" und dann <C-r>=s es in dem Puffer, um zu sehen, wie ich sehe

a\ 
     b 

Wie dies zu erklären?

Antwort

2
  1. sowohl für :echo und substitute(), \n ist eine Neue-Zeile und \r ist ein Wagenrücklauf. Sie sollten tun, was Sie erwarten würden. \n verschiebt den Cursor in die nächste Zeile (Spalte 1) und \r verschiebt den Cursor auf Spalte 1 gleiche Zeile. Für \r überschreibt das nächste Zeichen, das gedruckt wird, das zuvor gedruckte Zeichen. (Ich bin meist konzentrierte sich auf substitute() und :echo, :substitute ist unten)

  2. Denn warum Echo und Ersatz() anders verhalten. Sie müssen verstehen, wie viele Interpretationen der Zeichenfolge passieren. Für echo passiert nur einer für Ersatz() zwei passieren.

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

Das zweite ist das gleiche wie das, was Sie für Echo erwartet hätte. Strings in Anführungszeichen haben ihren Inhalt entsprechend :help expr-quote geändert. Dies bedeutet, dass beide Echo und Ersatz sieht die gleiche Sache, wenn die Zeichenfolge nur einmal interpretiert werden (die einfachen Anführungszeichen verwendet)

"a\\\rb" als a\rb nach einer Interpretation interpretiert wird und dann a<CR>b nach dem zweiten. Was dazu führt, dass nur b gedruckt wird.

  1. \r und \n ändern sich je nachdem, wo sie verwendet werden. Der einzige Unterschied wäre :substitute, wobei \r als ein Newline in der Ersetzung verwendet wird.

Dies ist einer der Fälle, in denen :substitute und substitute() verhalten sich anders,

:substitue folgt

<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> die gleiche wie ^@ ist, das nicht das gleiche wie ein Neue-Zeile ist,)

während substitute() folgt

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

Super Antwort! Ich verstehe es fast. Betrachte ': echo substitute (" "," "," a \\\ rb "," ")', warum wird "a \\\ rb" nach einer Interpretation als "a \ rb" interpretiert? Ist diese Interpretation auf 'substitute()' zurückzuführen? Sollte es nach einer Interpretation nicht "A" sein? – fujianjin6471

+0

@ fujianjin6471 Es ist. Aber die Bedeutung von "\^M" ist meist undefiniert. Von ': h/\\' Ein umgekehrter Schrägstrich gefolgt von einem einzelnen Zeichen ohne besondere Bedeutung ist für zukünftige Erweiterungen reserviert. Derzeit wird '\^M' als Wagenrücklauf interpretiert. Sie können dies sehen, wenn Sie '^ M' in den Puffer setzen (' ') und dann nach'/\^M' suchen. Und sehen Sie, dass '^ M 'übereinstimmt. (Nicht von diesem Verhalten abhängig) – FDinoff

+0

Danke, aber wenn ich ': lasst s =" a \\\ nb "' und dann ' = s', um es im Puffer zu sehen, sehe ich etwas wirklich unerklärlich. Ich zeige es in der Frage. – fujianjin6471

Verwandte Themen