web-dev-qa-db-de.com

Warum fügt Vim am Ende einer Datei eine neue Zeile hinzu?

Ich arbeite viel mit WordPress, und manchmal habe ich WordPress-Kerndateien vorübergehend geändert, um zu verstehen, was gerade beim Debuggen vor sich geht. Heute habe ich eine kleine Überraschung bekommen. Als ich bereit war, meine Änderungen an meinem Git-Repository festzuschreiben, bemerkte ich, dass git status eine der WordPress-Dateien als für das Festschreiben nicht bereitgestellt markierte. Ich erinnere mich, dass ich alle Änderungen, die ich an dieser Datei vorgenommen hatte, vor dem Schließen wiederhergestellt hatte. Daher entschied ich mich, diff zu verwenden, um zu sehen, was sich geändert hatte. Ich verglich die Datei in meinem Projekt mit der Datei in der WordPress-Kopie, die ich in meinem Download-Verzeichnis vermerke. Es stellt sich heraus, dass die Dateien am Ende unterschiedlich sind. diff zeigt an, dass am Ende der Originaldatei eine neue Zeile fehlt:

1724c1724
< }
\ No newline at end of file
---
> }

Ich habe diese Linie nie berührt. Die Änderungen, die ich vorgenommen habe, befanden sich irgendwo in der Mitte einer großen Datei. Dies lässt mich vermuten, dass vim am Ende der Datei ein Newline-Zeichen hinzugefügt hat. Warum sollte das passieren?

34
Buzu

Alle Antworten, die ich hier gesehen habe, befassen sich mit der Frage "Wie kann ich verhindern, dass Vim am Ende der Datei ein Zeilenvorschubzeichen hinzufügt?", Während die Frage "Warum würde Vim ein neue Zeile am Ende einer Datei? ". Die Suchmaschine meines Browsers brachte mich hierher und ich fand keine Antwort auf diese Frage.

Es hängt damit zusammen, wie der POSIX-Standard eine Zeile definiert (siehe Warum sollten Dateien mit einem Zeilenumbruch enden? ). Im Grunde ist eine Zeile:

3.206 Zeile
Eine Folge von null oder mehr Nicht-<Zeilenvorschubzeichen> plus ein abschließendes <Zeilenvorschubzeichen>.

Und deshalb müssen alle mit einem Zeilenumbruch enden. Aus diesem Grund fügt Vim standardmäßig immer einen Zeilenvorschub hinzu (da er laut POSIX immer vorhanden sein sollte).

Es ist nicht der einzige Redakteur, der das tut. Gedit , der Standardtexteditor in GNOME , macht genau dasselbe.


Bearbeiten

Viele andere Tools erwarten auch diesen Zeilenumbruch. Siehe zum Beispiel:

Das könnte Sie auch interessieren: Vim show newline am Ende der Datei .

40
Peque

Da vim ein text -Editor ist, kann er Dateien manchmal "bereinigen".

Unter http://vimhelp.appspot.com/vim_faq.txt.html#faq-5.4 finden Sie Details zum Schreiben ohne den Zeilenumbruch, der im Folgenden umschrieben wird:


Wie schreibe ich eine Datei ohne Zeilenvorschub (EOL) am Ende der Datei?

Sie können die Option eol deaktivieren und die Option binary aktivieren, um eine Datei ohne EOL am Ende der Datei zu schreiben: 

:set binary
:set noeol
:w

Alternativ können Sie verwenden: 

:set noeol
:w ++bin
10
paxdiablo

Das Hinzufügen einer neuen Zeile ist das Standardverhalten von Vim. Wenn Sie es nicht benötigen, verwenden Sie diese Lösung: VIM Automatische Zeilenvorschub am Ende der Datei deaktivieren

Zum Deaktivieren fügen Sie dies Ihrer .vimrc hinzu

set fileformats+=dos
6
ATOzTOA

Sie können die folgende Zeile in Ihre .vimrc einfügen

autocmd FileType php setlocal noeol binary

Was sollte den Trick tun, aber eigentlich ist Ihre Vorgehensweise etwas falsch. Zum einen macht sich php nichts aus, dass das Ende überhaupt enden wird. Wenn Sie die Änderungen nicht speichern möchten, drücken Sie u nicht. Schlimmer noch, versuchen Sie, den Status der Datei neu zu erstellen. Beenden Sie den Vorgang, ohne q! zu speichern. Wenn Sie den Editor verlassen und aus irgendeinem Grund gespeichert haben, versuchen Sie git checkout <file>

3
Max

3.206 Zeile .__: Eine Folge von null oder mehr Nichtzeichen plus ein abschließendes Zeichen.

Interessanterweise können Sie mit vim eine neue Datei öffnen, die Datei schreiben und die Datei wird aus null Bytes bestehen. Wenn Sie eine neue Datei öffnen und eine Zeile mit "o" anhängen, schreiben Sie die Datei, die aus zwei Zeichen besteht. Wenn Sie die Datei wieder öffnen und die zweite Zeile 'dd' löschen und die Datei schreiben, wird sie ein Byte lang sein. Öffnen Sie die Datei und löschen Sie die einzige noch verbleibende Zeile, und schreiben Sie die Datei, sie wird null Byte sein. Mit vim können Sie also eine Null-Byte-Datei nur so lange schreiben, wie sie vollständig leer ist. Scheint die Posix-Definition oben zu trotzen. Ich vermute...

0
Dr. Wolfe