Angenommen, ich habe eine Zeile mit nur einem Zeichen, lasst uns den Effekt \n
unter verschiedenen Umständen sehen:
Warum verhält sich \n
anders? Dann sehen wir uns die Bedingung mit substitute()
Diesmal wird \n
immer noch als "newline" interpretiert, aber wie erklärt man den Backslash?
Nächster Teil, sagen wir, dass ich noch eine Zeile mit nur einem Zeichen 's' habe, anstatt \n
, \r
wird untersucht:
\r
ist wie \n
in :echo "a\nb"
, und die Regel des umgekehrten Schrägstrichs ist dieselbe.
Was macht \r
in diesem Fall? Und der dritte Teilfall ist noch seltsamer.
Dennoch kann ich nicht verstehen, wie sich die unterschiedliche Anzahl von Backslashes verhält.
Meine Frage ist:
\n
oder \r
unter :substitute
, echo
direkt und substitute()
? substitute()
? \n
und \r
in Vim? Ergänzung 1:
Wenn ich :let s = "a\\nb"
und dann <C-r>=s
sehe, um es im Puffer zu sehen, sehe ich
Wie erklärt man das?
Für beide :echo
und substitute()
ist \n
eine neue Zeile und \r
ist ein Wagenrücklauf. Sie sollten tun, was Sie erwarten würden. \n
bewegt den Cursor zur nächsten Zeile (Spalte 1) und \r
verschiebt den Cursor in Spalte 1 derselben Zeile. Für \r
überschreibt das nächste Zeichen, das gedruckt wird, das zuvor gedruckte Zeichen. (Ich konzentriere mich hauptsächlich auf substitute()
und :echo
, :substitute
ist unten)
Warum sich echo und substitute () anders verhalten. Sie müssen verstehen, wie viele Interpretationen der Zeichenfolge passieren. Für echo passiert nur eines für substitute () zwei passieren.
%Vor% Das zweite ist das gleiche wie das, was Sie für das Echo erwartet hätten.
Strings in Anführungszeichen haben ihren Inhalt entsprechend :help expr-quote
geändert. Das bedeutet, dass sowohl echo als auch substitute dasselbe sehen, wenn der String nur einmal interpretiert wird (was einfache Anführungszeichen verwendet)
"a\\rb"
wird nach einer Interpretation als a\rb
und nach der zweiten als a<CR>b
interpretiert. Was dazu führt, dass nur b
gedruckt wird.
\r
und \n
ändern sich je nachdem, wo sie verwendet werden. Der einzige Unterschied wäre :substitute
, wobei \r
als neue Zeile in der Ersetzung verwendet wird. Dies ist einer der Fälle, in denen sich :substitute
und substitute()
anders verhalten,
:substitue
folgt
( <NUL>
ist dasselbe wie ^@
, was nicht dasselbe ist wie eine neue Zeile)
während substitute()
folgt
Tags und Links vim