Wie wird vim veranlasst, automatisch eine neue Zeile am Ende einer Datei einzufügen?

16

Vim schreibt normalerweise nur <EOL>für die letzte Zeile, wenn in der Originaldatei eine vorhanden war.

Wie wird vim dazu gebracht, die ganze Zeit eine neue Zeile am Ende einer Datei zu schreiben (wenn die Datei nicht binär ist und es noch keine gibt)?

Ich habe eolOption getestet , aber es hat nicht wie erwartet funktioniert.

Siehe auch: Fehlendes Zeilenende am Ende von Textdateien beibehalten , jedoch in umgekehrter Reihenfolge. Und: Warum sollten Dateien mit einem Zeilenumbruch enden?

Kenorb
quelle

Antworten:

17

Basisinformation

Vim zeigt nicht den neuesten Zeilenumbruch im Puffer an, aber tatsächlich platziert Vim EOL beim Schreiben immer am Ende der Datei, da dies für Textdateien in Unix-Systemen Standard ist. Weitere Informationen dazu finden Sie hier . Kurz gesagt, Sie müssen sich keine Gedanken über das Fehlen neuer Zeilen am Ende der Datei in vim machen.

Versuch 1

Mit diesem kleinen Experiment können Sie dieses Verhalten überprüfen. Im Terminal ausführen:

$vim test_test

Geben Sie zum Beispiel nur Zeichen ein 1und speichern Sie die Datei :w.

Sie haben nur ein Zeichen in der Datei, oder? Eigentlich nein :) Du hast jetzt in deiner Datei 1und LFZeichen. Lassen Sie es uns mit dem hexdump-Dienstprogramm überprüfen:

$hexdump test_test

Ausgabe:

0000000 31 0a
0000002

31ist ein ASCII-Code für Zeichen 1und 0aein ASCII-Code für nicht druckbare LFZeichen, die unter UNIX möglicherweise bereits den Code für das Zeilenende kennen.

Versuch 2

Aber was ist, wenn wir eine Datei öffnen, die eolam Ende der Datei kein Symbol hat? Lassen Sie es uns auch überprüfen. Lassen Sie uns am Ende eine Datei ohne eol erstellen, zum Beispiel so:

$echo -n "1" > test_without_eol

und dann schauen wir nochmal mit hexdump hinein

$hexdup test_without_eol

Ausgabe wird sein:

000000 31
0000001

Also gibt es hier keine eolCharaktere. Lassen Sie uns diese Datei in vim öffnen:

$vim test_without_eol

Am unteren Rand des Editors sehen Sie:

"test_without_eol" [noeol] 1L, 1C

Und wenn Sie diese Datei speichern eol, wird der Charakter automatisch geputtet.

Was können wir dagegen tun?

Wenn Sie das Ende der Datei wirklich sehen müssen. Versuchen Sie, diesen Befehl zu verwenden:

:set listchars=eol:$

Es werden alle eolZeichen als $Zeichen angezeigt.

Alexander Myshov
quelle
Groß. Nach meiner Verwirrung kam ich zu dem gleichen Schluss, weil Vim mir diese neue Zeile nicht wirklich zeigte, aber sie war nach dem Speichern da.
Kenorb
1
@kenorb übrigens können Sie alle EOL Charachter mit diesem Befehl zeigen:set listchars=eol:$
Alexander Myshov
"hat mir diese neue Zeile eigentlich nicht gezeigt" - in Unix gibt es keine Zeile. Eine Zeile ist definiert als "Anzahl der Nicht-LF-Zeichen, die mit einem LF-Zeichen enden". Wenn Sie LF nicht als "Gehe zur nächsten Zeile", sondern als "Ende der Zeile" ansehen, macht das, was Vim tut, plötzlich viel mehr Sinn.
Amadan,
8

Vim lässt die EOL nur dann aus, wenn die Datei geöffnet wurde 'binary' und die 'endofline'Option zurückgesetzt wurde (wenn die Binärdatei beim Öffnen keine EOL hatte oder Sie die Option explizit zurücksetzen). Mit anderen Worten, Vim berücksichtigt nur eine fehlende EOL für Binärdateien. Bei Textdateien wird immer mit einer (hinzugefügten) EOL geschrieben. (Deshalb benötigen Sie Lösungen wie mein PreserveNoEOL-Plugin , um Textdateien ohne EOL zu speichern.) Alle Details finden Sie unter :help 'endofline'.

Sie müssen also nur sicherstellen, dass die Datei nicht als Binärdatei geöffnet wird , damit Vim automatisch eine EOL schreibt.

Ingo Karkat
quelle
5

Wie Alexander erwähnte, zeigt Vim EOL bei EOF nicht an, deshalb ist es so verwirrend (insbesondere bei leeren / leeren neuen Zeilen, was eine andere Sache ist), dass es tatsächlich jedes Mal beim Speichern von Dateien schreibt.

Hier ist ein einfacher Test, um zu testen, ob das funktioniert:

$ printf foo > foo.txt
$ cat foo.txt
foo$ wc foo.txt
0 1 3 foo.txt
$ vim -cwq foo.txt
$ cat foo.txt
foo
$ wc foo.txt
1 1 4 foo.txt

Beachten Sie, wie sich die Shell-Eingabeaufforderung verhält, wenn keine EOL vorhanden ist (sie wird mit der nächsten Zeile gemischt). Wenn Sie eine Datei mit Vim erneut speichern, wird sie hinzugefügt.

Mit können wcwir Zeilen, Wörter und Zeichen vor und nach dem Speichern zählen, damit wir sehen können, dass sich das tatsächlich ändert.

Warum ist das so wichtig? Damit unsere Dateien POSIX-konform bleiben .

Kenorb
quelle