Wenn ich Vim öffne und itest<Esc>:wq
tippe, erhalte ich eine Datei, die keine Zeilenumbrüche in Vim enthält, aber einen Zeilenumbruch im Code zu haben scheint:
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a |test.|
00000005
Wenn ich Vim öffne und itest<Return><Esc>:wq
tippe , erhalte ich eine Datei mit einer neuen Zeile in Vim, aber zwei neuen Zeilen im Code:
$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a 0a |test..|
00000006
Beachten Sie, dass ich Vim mit öffne, -u NONE
damit keine lokale Konfiguration verwendet wird. Beachten Sie auch, dass dies mit einer früheren Frage von mir zusammenhängen könnte .
Dies ist meine Systeminfo:
$ uname -a
Linux awsAlpha 3.2.0-60-virtual #91-Ubuntu SMP Wed Feb 19 04:13:28 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May 4 2012 04:25:35)
Included patches: 1-429
Modified by [email protected]
Compiled by buildd@
Ich kann das exakt gleiche Verhalten auch auf diesem System bestätigen:
$ uname -a
Linux bruno 3.5.0-48-generic #72-Ubuntu SMP Mon Mar 10 23:18:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 26 2012 16:45:33)
Included patches: 1-547
Modified by [email protected]
Compiled by buildd@
Warum fügt Vim eine neue Zeile hinzu? Ist das eine Konvention?
Hier einige Erläuterungen zum hd
Befehl, der auf Ubuntu Server installiert ist:
$ man hd | head -4
HEXDUMP(1) BSD General Commands Manual HEXDUMP(1)
NAME
hexdump, hd — ASCII, decimal, hexadecimal, octal dump
Antworten:
Die Konvention für Unix-Textdateien lautet, dass jede Zeile mit einem Zeilenumbruch abgeschlossen wird und dass Zeilenumbrüche keine Zeilentrennzeichen sind.
Wenn Vim einen Puffer als Datei speichert, wird jede Zeile mit der Zeilenende-Sequenz für dieses Dateiformat beendet, was für Unix ein Zeilenumbruch ist. Sehen
Wenn Sie Unix-Textverarbeitungstools verwenden, halten Sie sich am besten an diese Konvention. Wenn Sie jedoch eine neue Zeile am Ende der letzten Zeile einer Datei einfügen müssen, können Sie dies tun. Vim betrachtet solche Dateien als "binär". Sehen
quelle
Vim fügt nichts hinzu, was Sie nicht selbst dort abgelegt haben.
Ein "Newline" -Zeichen ist keine "Newline", und beide Beispiele sind völlig normal:
quelle
printf "\x41" > /tmp/test.txt
und stellen Sie dann sicher, dass es nur ein einziges 'A' Zeichen mit hatxxd /tmp/test.txt
. Jetztvim /tmp/test.txt<ENTER>:wq
. Überprüfen Sie erneut, ob die Datei zwei Bytes enthält: 'A \ n'.printf
ich hier keine wohlgeformten "Linien" hatte. Nach vim habe ich eins. Es fügt also etwas hinzu, das ich nicht dort abgelegt habe.printf
nicht eine Zeile ist, wenn Sie anhängen\n
. Als Texteditor verarbeitet Vim standardmäßig Zeilen, und jeder Text, den Sie in die Datei einfügen, befindet sich mindestens in einer Zeile, es sei denn, Sie weisen Vim ausdrücklich an, dies nicht zu tun.Nicht abgeschlossene Textdateien sind aus mehreren Gründen böse. Hier ist eine, die ich noch nicht gesehen habe:
In einer hypothetischen Welt, in der Textdateien ohne abschließende Zeilenumbrüche zulässig sind, gibt es keinen Unterschied zwischen einer Datei mit 0 Zeilen und einer Datei mit 1 Leerzeile. Sie würden beide durch eine 0-Byte-Datei dargestellt.
Die Unfähigkeit zu entscheiden, wie viele Zeilen sich in einer Datei befinden, wäre schlecht.
quelle
Vim 8.0 bietet hierfür nun die
fixeol
Option. Wenn Sie Folgendes tun:dann Vim nicht einen nachlauf Newline - Zeichen am Ende der letzten Zeile hinzufügen , wenn die Datei einen nicht bereits hat.
Das könnte in einem Dateityp-Plugin gehen, oder möglicherweise sogar in Ihrem
.vimrc
.(Dies ist eine Verbesserung,
:set binary
da es sich nur auf das letzte Zeilenumbruchzeichen auswirkt, während sichbinary
auch eine Reihe anderer Verhalten ändert, die Sie wahrscheinlich nicht möchten, es sei denn, Sie bearbeiten tatsächlich eine Binärdatei.)Eine neu erstellte Datei hat weiterhin standardmäßig einen abschließenden Zeilenumbruch. Sie können dies ändern (und eine Datei, die bereits einen letzten Zeilenumbruch enthält, in eine Datei ohne Zeilenumbruch ändern), indem Sie zusätzlich Folgendes ausführen:
Dies muss spezifisch für jede Datei eingestellt werden, die Sie ändern möchten: Das Laden einer Datei in einen Puffer wird immer so eingestellt
eol
, dass sie dem aktuellen Status der Datei entspricht.quelle
Mit dem Befehl 'j' können Sie alle Zeilen zu einer verbinden.
Wenn Sie auch die LF oder CRLF in der letzten Zeile entfernen möchten, gehen Sie in vi wie folgt vor.
quelle