Wenn ich folgenden Text habe:
foo
bar
Ich wähle es visuell aus und kopiere es.
Der Text ist jetzt im unbenannten Register gespeichert "
und hier ist sein Inhalt (Ausgabe von :reg "
):
"" foo^Jbar^J
Nach dieser Tabelle handelt es sich anscheinend ^J
um die Caret-Notation für einen Zeilenvorschub.
Wenn ich das unbenannte Register in das a
Register kopieren möchte, indem ich Folgendes eingebe: :let @a = @"
Hier ist sein Inhalt (Ausgabe von :reg a
):
"a foo^Jbar^J
Es hat sich nicht geändert.
Wenn ich es jetzt durch Eingabe in das Suchregister dupliziere :let @/ = @"
, ist hier sein Inhalt (Ausgabe von :reg /
):
"/ foo^@bar^@
Nach der vorherigen Tabelle scheint ^@
es sich um die Caret-Notation für ein Null-Zeichen zu handeln.
Warum wird ein Zeilenvorschub im Suchregister automatisch in ein Nullzeichen umgewandelt (nicht jedoch im a
Register)?
Wenn ich das unbenannte Register in die Befehlszeile (oder in eine Suche danach /
) einfüge :<C-R>"
, wird durch Eingabe Folgendes eingefügt:
:foo^Mbar^M
Auch hier ^M
scheint laut letzter Grafik die Caret-Notation für ein Carriage Return zu sein.
Warum wird ein Zeilenvorschub in der Befehlszeile automatisch in einen Wagenrücklauf umgewandelt?
Bearbeiten :
Normalerweise können Sie ein literales Steuerzeichen einfügen, indem Sie Folgendes eingeben:
<C-V><C-{character in caret notation}>
Sie können beispielsweise ein Literal <C-R>
durch Eingabe einfügen <C-V><C-R>
.
Sie können es für scheinbar jedes Steuerzeichen tun.
Allerdings ist mir aufgefallen, dass ich kein Literal LF in einen Puffer oder in die Befehlszeile einfügen kann. Wenn ich <C-V><C-J>
Folgendes ^@
eingebe, wird anstelle von ein Nullzeichen eingefügt ^J
.
Ist es der gleiche Grund, warum ein LF im Suchregister in NUL umgewandelt wird?
Bearbeiten 2 :
In :h key-notation
können wir folgendes lesen:
<Nul> zero CTRL-@ 0 (stored as 10) <Nul>
<NL> linefeed CTRL-J 10 (used for <Nul>)
Der stored as 10
Teil in der ersten Zeile und used for <Nul>
in der zweiten Zeile könnte darauf hinweisen, dass es eine Art Überlappung zwischen einem LF und einem NUL gibt und dass sie als dasselbe interpretiert werden könnten. Aber sie können nicht dasselbe sein, denn nach dem vorherigen Befehl ausführen :let @/ = @"
, wenn ich tippe n
im normalen Modus zum nächsten Auftreten der zwei Linien zu erhalten foo
und bar
, statt ein positives Spiel bekommen, ich habe die folgende Fehlermeldung:
E486: Pattern not found: foo^@bar^@
Außerdem scheint dieser Link zu erklären, dass ein NUL das Ende einer Zeichenfolge bezeichnet, während ein LF das Ende einer Zeile in einer Textdatei bezeichnet.
Und wenn ein NUL stored as 10
wie in der Hilfe angegeben ist, derselbe Code wie für ein LF, wie kann Vim dann den Unterschied zwischen den beiden machen?
Edit 3 :
Möglicherweise werden ein LF und ein NUL mit demselben Dezimalcode codiert 10
, wie in der Hilfe angegeben. Und Vim macht dank des Kontexts den Unterschied zwischen den beiden. Wenn es auf ein Zeichen trifft, dessen Dezimalcode sich 10
in einem Puffer oder einem Register befindet, mit Ausnahme der Such- und Befehlsregister, wird es als LF interpretiert.
Im Suchregister ( :reg /
) wird es jedoch als NUL interpretiert, da Vim im Kontext einer Suche nur nach einer Zeichenfolge sucht, deren Konzept end of line in a file
keinen Sinn ergibt, da es sich bei einer Zeichenfolge nicht um eine Datei handelt (was seltsam ist, da Sie dies können) benutze das Atom immer noch \n
in einem Suchmuster, aber vielleicht ist das nur ein Merkmal der Regex-Engine?). Es wird also automatisch 10
als NUL interpretiert, weil es das nächste Konzept ist ( end of string
≈ end of line
).
Ebenso :reg :
interpretiert es in der Befehlszeile / im Befehlsregister ( ) den Code 10
als CR, weil das Konzept von end of line in a file
hier keinen Sinn ergibt. Das nächste Konzept ist end of command
so Vim interpretiert 10
als CR, weil hitting Enter
der Weg zu Ende ist / einen Befehl ausführen und eine CR ist die gleiche wie Schlagen Enter
, da beim Einfügen eines wörtlichen mit <C-V><Enter>
, ^M
angezeigt wird.
Vielleicht 10
ändert sich die Interpretation des Zeichens, dessen Code ist , je nach Kontext:
- Zeilenende in einem Puffer (
^J
) - Zeichenfolgeende in einer Suche (
^@
) - Befehlsende in der Befehlszeile (
^M
)
someFunction(arg1, "")
wo arg 2 war, ""
dh "das Element zwischen den Anführungszeichen, was buchstäblich nichts ist - ein" leeres ". Ein NULL kann erscheinen, weil es von der zugrunde liegenden C-Implementierung" hinzugefügt "wurde, da es die Zeichenfolge begrenzte. Ich weiß nicht wie würden Sie dies überprüfen - aber es kommt als mögliche Ursache in den Sinn.
\r
und den \n
Unterschied in:substitute
.
NULL
Zeichen durch die zugrunde liegende C-Funktion verursacht, die die Zeichenfolgen verarbeitet. Diese Erklärung, wie C verknüpfte Zeichenfolgen verarbeitet , erklärt, dass C Zeichenfolgen intern mit einem abgrenztNULL
.NULL
s kommen im Text selten genug vor, um ein gutes Zeichen für diesen Zweck zu sein. Dies hat zur Folge, dass das C-Programm (vim) versucht hat, einen "leeren" String an eine interne C-Funktion zu übergeben